目的: 以 perl、shell script 自製可夾帶檔案 (使用 MIME 格式) 的郵件發送程式
系統需求: perl、sendmail
许多老派的 FreeBSD 用户喜欢用源代码方式升级。运行了十多年的基于 cvsup 的同步机制由于有很多镜像支持因此一直没有遇到太大的问题,但是 FreeBSD 6.1 开始引入的 freebsd-update 提供了新的以二进制形式更新系统的方法,最近几年 FreeBSD 内核的许多改进已经使编译自定义的内核不再像以前那样重要了。
最近几天发布的 FreeBSD 7.1-RELEASE 引发了升级的热潮。由于 7.1-RELEASE 导致的流量冲击,而现存的 freebsd-update 服务器和 portsnap-master 是同一台,导致现在 portsnap 服务不太正常。目前 security officer 已经在建立新的 FreeBSD update 服务器。
The PHP Development Team would like to announce the immediate availability of PHP 5.2.8. This release addresses a regression introduced by 5.2.7 in regard to the magic_quotes functionality, which was broken by an incorrect fix to the filter extension. All users who have upgraded to 5.2.7 are encouraged to upgrade to this release. Alternatively you can apply a work-around for the bug by changing "filter.default_flags=0" in php.ini.
環境:
之前和 A core 聊过这个问题。整理一下发出来。
这个话说的可能比较绝对,有人说,缺少信任的社会是可悲的----而我想说的是,现今,被过度滥用的信任则是可怕的。通过各式各样的社交网站,如 Facebook、LinkedIn、开心网、天际网等等(我想有人会提到 豆瓣,但是我个人认为豆瓣算是一个比较另类的社交网站,因为上面的人很少使用真名),很多人之间的联系被轻易地挖掘和利用。
类似"谁认识谁"这样的信息,在过去是不太容易获得的。而有了社交网站,一切都变得如此透明。一个人的人际关系如何?作为招聘的HR,只要到这样的网站上检索一番就能够一目了然;想要让一个人身败名裂?很简单,从身边的人下手----几年前,在blog还没那么普及的时候,我就收到了一封匿名的"检举信",讲的是某低年级同学在某地所做的丑事,导致该君到处写信灭火,而事实?只是寻衅报复----互联网使得信息的传播变得比人类以往的任何时候都要更加迅速,当然,正如很多可以分成靠谱的和不靠谱的东西一样,海量的信息带来的则也包括了海量不靠谱的信息。
和很多人一样,我对于要求填写个人信息的注册表格有非常强烈的抵触情绪。我为什么要相信一个网站或公司能够确保这些信息不被未经授权的第三方得到?事实上,正如对软件所做的各种保护一样,主流安全公司所做的所谓验证,无非只是一种心理上的安慰----这家公司采用了比较严格的流程,使得你的隐私信息,例如姓名、地址、信用卡号,等等,不太容易被攻击者得到----比如说,这些信息只能一次性地写入到服务器,之后只能得到其中的后几位,而那台记录这些信息的服务器受到了更为严格的保护----但是,只要这些信息能够被任何这家公司的工作人员读取,那么,它就不可能是绝对安全的。
你相信大型邮件服务提供商,例如 Google、MSN、Yahoo、网易、新浪 能够保证邮件的安全吗?我想,海量的用户带来的巨大的关注成本以及这些公司招聘时候对入职人员的进行的考察所保证的职业操守,足以让我相信做为一个普通用户,完全可以信赖这些邮件系统;然而,如果你的通讯涉及到巨大的商业或其他利益,事实上,基本上没有有效的办法去阻止邮件在不知道的情况下发生丢失或被泄露给通讯双方所不知道的第三方。
从工作在客户端的间谍软件,到大楼的网管,再到互联网服务提供商(到互联网骨干,再到IDC等等),再到服务器所属的那家公司----如果考虑收信的一方,那么还要再多加一倍的可能入侵的环节,更重要的是----你的通讯多数时候是明文的。加密并不能解决全部问题,除非能够有有效的方法确认收件人的身份,并保证路上不出现故意的"遗失",还要保证,在你能够把文本加密之前,所用来编辑和加密的系统是可信的。
互联网时代没有隐私。永远不要说"永远不",但是我还是想说,如果不希望某些信息公之于众,那么最好的办法仍然是把它烂在肚子里,而不是放到互联网上某个让你觉得别人永远找不到的角落。类似地,也不要把能够很容易地获得的信息太当回事,这个世界上有很多不够小心的人,但这并不代表,这个世界上的人都不够小心。
哦,对了,写这篇文章是因为看到了 MD5 considered harmful today,终于有人凑出了一个CA证书。是的,加密也不一定有用了。
来自李笑来老师的blog(原来在新东方上过他的GRE课)的《如何找到属于自己的兴趣》。
为了使用系统运行得更快,更加顺畅,ML 默认打开了一些服务。但是如果你不会使用到这些服务,这些服务将浪费你的宝贵的系统资源,这时,你可以选择关闭或禁用这些服务。
| 服务列表(按字母顺序排列) | |||
| 服务名 | 必需 | 用途描述 | 注解 |
| acon | 否 | 语言支持 | 特别支持左手书写语言:阿拉伯语,波斯语和希伯莱语 |
| acpi | 否 | 电源管理 | 手提电脑电池电扇监控器 |
| acpid | 否 | 监听精灵进程 | 此进程监听并分配内核中的acpi事件 |
| adsl | 否 | 内部ADSL开关控制 | 只有你的计算机内部有互联网连接adsl开关时才用到此服务 |
| alsa | 否 | 高级Linux声音构件 | 这个单独的声音系统实际包含在内核中 |
| anacron | 否 | 周期命令调度程序 | 一个任务调度工具 |
| apmd | 否 | 电源管理 | 手提电脑电源管理 |
| apmiser | 否 | 电源管理 | 另一手提电脑电池延长器 |
| arpwatch | 否 | 以太网IP地址配对监控器 | 用主机名监控并记录远程IP地址 |
| atd | 否 | 周期命令调度程序 | 一个任务调度工具 |
| autofs | 否 | 自动安装服务 | 几个命令服务文件系统自动安装之一.一些此类服务专门针对发行配套软件,如果你使用的发行配套软件拥有自己的自动安装系统,不要用这一个. |
| bluetooth | 否 | 蓝牙技术核心 | 用于所有蓝牙服务 |
| bootparamd | 否 | 导入服务 | 以前导入无盘客户端/瘦客户端的方法.最新型的方法为零配置系统(zeroconf system). |
| canna | 否 | 日语转换引擎 | |
| capi4linux | 否 | 基本CAPI子系统 | |
| cpqarrayd | 否 | 硬件服务 | 康柏独立冗余磁盘阵列(Raid Array)监控器 |
| cpufreq | 否 | 硬件服务 | 控查并配置CPU频率精灵程序模块 |
| cpufreqd | 否 | 硬件服务 | 此服务自动衡量CPU频率来减少过热情况.在超频时有用. |
| crond | 是 | 周期命令调度程序 | 一个任务调度工具 |
| Cups-lpd | 否 | 使旧式Lunux或商业Unix系统连接到打印主机上. | 只有在允许旧式系统访问打印机时才有用 |
| cups | 是 | 公共Unix打印系统 | 进行打印的必要功能 |
| cvs | 否 | 并发版本系统 | 用于管理多用户文档 |
| devfsd | 否 | 系统维护 | 此服务只清除动态桌面目录,除非你的系统经常崩溃,否则不需要此服务. |
| dhcpd | 否 | DHCP服务器 | 你的网络足够大,使用静态IP很麻烦吗?此项服务对你的网络进行DHCP IP配置,方便网络应用. |
| diald | 否 | 拨号网络智能自动拨号器 | 此服务一经请求,即连接上网络.你一旦输入电子邮件,点击发送,它就自动连接,发送电邮并断开. |
| dkms | 否 | DKMS自安装导入 | 发行配套软件专用工具,用于OEM类型安装.它允许管理员密码的最初导入设置以及常规应用的用户名密码,系统的最后配置. |
| dm | 是 | 显示管理器 | X服务器的核心,使用图形用户界面(GUI)时必需. |
| dnbc | 否 | 数字网络绑定Chrooter | 这是一个简单的bash脚本,它将一个BIND服务器放入一个chroot牢笼中.安装BIND,发布脚本并重启. |
| Drakxtools-http | 否 | 小型服务管理服务器 | 远程系统管理的发行配套软件专用工具. |
| dund | 否 | 蓝牙拨号网络 | |
| fam | 否 | 文件系统变更监控器 | 文件系统所有改变的记录器 |
| finger | 否 | 数据远程访问 | 此服务允许你远程访问用户登录日期,最后登录日期与时间.用于不在办公室时监控雇员的工作习惯,主要的安全违反,因为你正有效地在线发布公司机密数据. |
| freshclam | 是 | ClamAV更新器 | 用于自动更新ClamAV |
| gpm | 是 | 鼠标 | 鼠标驱动器控制台模式 |
| haldaemon | 否 | 硬件监控系统 | 此服务监控硬件改变,为你改变新的或更改过的硬件. |
| harddrake | 否 | 硬件服务 | 发行配套软件专用硬件探测与配置 |
| heartbeat | 否 | 高可用性服务 | 此服务旨在增加重要服务与服务器的优先级 |
| hidd | 否 | 蓝牙H.I.D.服务器 | |
| hplip | 否 | 惠普Linux打印与成像 | 旧版惠普整成产品供应驱动器 |
| hpoj | 否 | Pital?init,惠普办公喷墨打印机驱动器 | 惠普办公喷墨打印机旧式驱动器.新式驱动器包含在打印机的打印驱动器内. |
| httpd | 否 | Apache网络服务器 | 在系统上应用此服务有两个原因,一是要用它作为网络服务器,二是用它作为网址开发器.如果没有此二项,则不必安装Apache. |
| hylafax?server | 否 | 企业传真机?调制调解器服务 | 此服务仅用于1类与2类传真机.如果你想用hylafax通过调制调解器发送传真,必须运行此服务.它并不是唯一有效的传真工具. |
| ibod | 否 | 按需ISDN MPPP带宽 | 与拨号网络一同使用,按需连接到网络. |
| identd | 否 | TCP连接鉴定 | |
| imaps | 否 | 安全IMAP服务器 | |
| imaps | 否 | IMAP服务器 | |
| iplog | 否 | 用主机名或远程主机记录TCP,UDP,ICMP. | 有用的网络监控工具 |
| ipop2 | 否 | POP2邮件服务器 | |
| ipop3 | 否 | POP3邮件服务器 | |
| ipsec | 否 | 加密与验证通信 | KLIPS为内核一半,PLUTO为用户空间一半.在远程访问情况下十分有用. |
| iptables | 是 | 基于Packet过滤防火墙内核 | 所有优秀的Linux防火墙都基于此项服务 |
| ipvsadmin | 否 | Linux核心IP虚拟服务器 | 最早的Linux网络系统之一,已不常用. |
| irda | 否 | 红外线设备界面 | 以前的无线设备支持 |
| keytable | 是 | 键盘映射 | 此服务明确告诉系统你正在使用哪种键盘 |
| kheader | 否 | 导入服务 | 此服务自动重建内核头导入 |
| lads | 否 | 登录异常探测系统 | 跟踪登录企图并警告入侵企图的工具 |
| laptop mode | 否 | 电源管理 | 减少电力耗费,延长手提电脑电池寿命的工具 |
| leafnode | 否 | X? INETD NNTP服务 | |
| lisa | 否 | 局域网信息服务器 | |
| lmsensors | 否 | 硬件健康监控器 | 此服务要求系统主板支持并有合适的监控系统,如CPU温度与电压监控器. |
| mailman | 否 | GUN邮件列表管理器 | 常用的邮件列表工具,带Python编写的管理网络界面.它允许列表成员发送邮件并回复邮件到同一个地址进行交流.它还可用于向那些发送请求的用户传送新闻时讯/产品更新. |
| mandi | 否 | 交互式防火墙 | 允许暂时无线访问系统的专用服务,将为当前任务开放iptables防火墙,仅用于无线设备访问.在用户许可情况下才可使用,不能自动使用. |
| mdadm | 否 | 软阵列监控服务 | 这也是一个用于上述软件阵列栏的管理工具 |
| mdnsresponder | 否 | 零配置DNS配置工具 | |
| messagebus | 是 | 事件监控服务 | 此服务在必要时向所有用户发送广播信息,如服务器将要重启. |
| mon | 是 | 系统监控精灵进程 | 许多系统服务要求此服务来运行 |
| mysqld | 否 | MySQL服务器 | 如果你不需要这个数据库,不要打开它. |
| named | 否 | 绑定(BIND)服务器 | 这就是声名狼藉的名称服务器 |
| netplugd | 否 | 网卡精灵进程 | 此服务监控网络界面,根据信号关闭或启动它,主要用于不经常连接的手提电脑. |
| network | 是 | 网络 | 此服务打开网卡,或为调制调解器供电. |
| nfs | 否 | 网络文件共享 | 此服务使用户访问NFS共享文件,为NFS系统客户机所必需. |
| nfsfs | 否 | 网络文件共享服务器 | 只有在网络服务器上才被激活 |
| nfslock | 否 | NFS文件锁定 | 只有在使用NFS网络/文件共享功能时,此服务才被激活. |
| nifd | 否 | Howl 客户端 | 此服务为零配置网络/系统提供ipv4链接本地服务 |
| nscd | 否 | 密码与群查找服务 | 此服务用于减慢N.I.S/Y.P.nist,ldap和hesiod之类的服务.专门为这些服务提供更长的中断时间. |
| ntpd | 否 | NTP服务器的第4版 | |
| numlock | 否 | 数字锁定键灯光控制 | 此服务保持数字锁定键的激活状态,打开键盘上的数字键区. |
| Oki4daemon | 否 | OKI4和兼容win打印机的兼容性精灵进程 | 只有在你有这些打印机时才可用 |
| pand | 否 | 蓝牙个人区域网络 | 用于基于网络的家庭区域蓝牙技术 |
| partmon | 是 | 分区监控 | 此服务跟踪安装分区上的剩余空间.大多数文件系统浏览器使用它来计算指定分区上的剩余空间. |
| pcmcia | 否 | 个人电脑内存卡国际协会 | |
| pg_autovacum | 否 | PostgreSQL维护 | 此服务自动运行PostgreSQL所需的空间(vacuum)来减少磁盘空间,从数据库中拖动临时表格,并删除PostgreSQL建立的临时文件. |
| pop3s | 否 | 安全POP3服务 | POP3 SSL服务器 |
| portmap | 否 | RPC支持 | 支持那些应用rpc的罕有的应用软件 |
| postgresql | 否 | Postgresql数据库引擎 | 只有在运行或开发Postgresql数据库驱动应用软件时才用到此服务 |
| postfix | 否 | 电子邮件服务器 | 与sendmail兼容的电子邮件服务器,比sendmail更新,也变得比sendmail更通用. |
| pptp | 否 | PPP断电服务 | PPP频道断电服务,UPS打开时使用,以避免电源返回系统时出现文件锁定问题. |
| prelude | 否 | IDS | 入侵探测系统 |
| psacct | 否 | 进程计算 | 活动进程追踪器,实际上是资源的浪费. |
| rawdevices | 是 | 分配raw设备,阻止其使用 | DVDS,oracle DBMS等需要此服务 |
| rsync | 否 | 远程同步 | 使指定目录树上的文件远程同步的服务器,常用于维护镜象地址,也在备份时用于保持公司文件为最新状态. |
| saned | 否 | 网络扫描仪 | 从网络上的任何工作站提供扫描仪访问 |
| shorwall | 是 | 防火墙 | 一个非常优秀的IPTables防火墙 |
| smartd | 否 | 自我监控服务 | 用于智能设备的OS访问,此服务允许Linux告诉你是否设备将要变坏,但这要依靠设备的精确智能特性. |
| smb | 否 | Samba网络服务 | 此服务提供samba服务,实现Windows网络兼容性. |
| snmpd | 否 | 简单的网络管理协议 | 用于小型(家庭办公室)网络 |
| sound | 否 | 声音系统 | 此为Linux声音系统的核心,适用于桌面系统,在服务器上则是资源的浪费. |
| squid | 否 | 高速缓存工具 | 用于高速缓存网络页面及DNS登录 |
| ssh?xinetd | 否 | X?inetd OpenSSH服务器 | OpenSSH的按需运行版本 |
| sshd | 否 | OpenSSH服务器 | 如果你需要SSH访问你的系统时才开启此服务,将不会使用x?inetd版本. |
| subversion | 否 | 并发版本系统 | CVS的新型替代品 |
| swat | 否 | Samba网络管理工具 | 基于Samba管理的网络 |
| syslog | 是 | 系统登录 | 一项必要的服务,控制整个系统上的所有登录. |
| tmdns | 否 | 多点传送DNS响应器 | 用于零配置环境 |
| ultrabayed | 否 | ThinkPad工具 | 此服务为你的IBM ThindPad探测ultrabay,并在适当情况下启动/关闭IDE接口. |
| upsd | 否 | NUT精灵进程及驱动器 | 一个不间断地电源监控及报告工具,此服务向中心地址报告,产生关于UPS统计的数据库. |
| upsmon | 否 | UPS监控工具 | 此服务监控UPS的状况,在其运行低下时关系系统. |
| vncserver | 否 | 虚拟网络计算服务器 | 在项目中应用VNC时非常有用 |
| Webmin | 否 | 远程管理工具 | 发行配套软件Agnostic远程管理工具.在机器不能总是直接访问,如网络服务器集群时有用. |
| winbind | 否 | Samba名称服务器 | Samba网络运行所必需.此服务将用户与群数据从windows网络映射到Linux工作站中. |
| wine | 否 | Wine并非竞争者 | 此服务使MS Windows可在Linux上执行,WINE是商业产品Crossover Office的限制版本. |
| wlan | 否 | 控制精灵进程 | 由于服务通常由init进程控制,此控制服务不常用. |
| x?inetd | 是 | 监控并控制其它服务器的服务器 | 这是一项必需的服务,它实际上减少了服务器上CPU的负载.如果你需要SSH,ftp等但并不总是需要,x?inetd版本将在请求,甚至是远程需求时启动它们.此服务让它们生效,但如果它们一天/周只使用几次的话,又释放了时钟周期. |
| xfs | 是 | X字体服务器 | 你任何时间需要使用图形用户界面(GUI),就需要此服务. |
| ypbind | 否 | SUN的YP服务器名称服务器 | 此服务用于基于GLIBC的NIS/YP网络服务 |
帮人发的。北京某公司,地点在中关村。
要求:熟悉Windows Server,独立管理过ExchangeServer半年以上,独立管理过Windows Active Directory半年以上,熟悉网络基础知识,对IOS有初步了解(非背题通过CCNA者尤佳),在生产环境或桌面环境或实验环境使用过Unix类操作系统三个月以上,对Unix类操作系统感兴趣,对系统运营工作感兴趣。
预期年薪6-9万,文化程度等不限。能抬起25公斤物体者优先。
有意者请用简历轰炸 laypeople@hotmail.com。
我这次不铁口直断了,估计明年见了,如果这周能够RC2的话,最终RELEASE估计要到明年的1月5日左右。
这次FreeBSD 7.1在软件工程角度是相当失败的案例,我想我们应该从里面总结一些教训出来。
首先,我们的目标是什么?
我想,用户对于一个发行版本的期待是:一个经过了大量测试的、阶段性的稳定版本。而开发人员对于发行版本的期待则是尽可能地将可用的功能交付给用户。作为OS,我认为这应该包括自动化的回归测试、性能改进、更新的驱动程序、文档的修订,以及更新的第三方软件等等。
FreeBSD目前的开发模式,是将分别开发的三大模块,即内核与基本系统(src/)、文档(doc/)、第三方软件(ports/)的人在一定的时候聚集在一起,通过代码冻结的方法来使他们从增加新功能转移到集中去修bug,最后发布一个版本。这个模式在过去运转的相当好,以至于我们没有发现其中存在的问题。
这次FreeBSD 7.1暴露出来了这个模式存在的很多问题。例如,由于安全小组发现了很多安全漏洞,而另一方面,安全小组的人手不够,限制了修正这些问题的速度。我本人撰写的一个安全公告等了一个月才在今天最终公之于众,而另一方面,安全小组对于发行版本拥有一票否决的绝对权力,导致6.4和7.1的发布都一再推迟。
而作为非常快节奏的开发的 ports/ 维护者,则对不断的推迟感到相当不满。FreeBSD目前只维护 ports/ 的 -HEAD,也就是说,在正式发行 -RELEASE 之前,ports/ 不能进行大量的、破坏性的修改。例如,我本人维护的 OpenLDAP 现在就必须等待 -RELEASE 之后才可以进行升级。不断地推迟新的发行版本,会导致 ports/ 的开发继续延迟。
多种因素作用在一起的结果是,这次7.1-RELEASE的发布让所有的人都不太满意。
我想,想要解决这些问题,需要从几个方面入手。
首先是功能冻结和代码冻结的时间。目前,FreeBSD的做法是src/和ports/几乎同时开始冻结,但是实际上 src/ 需要花费的测试周期要比 ports/ 多。举例来说,一次正常的 -STABLE 发行版本所需要的测试和除错周期大约是 8 - 10 周,而完成一次 ports/ 联编所需要的时间则只需要 48 - 160 小时,并且这个过程是持续进行的。我认为我们必须定义一个功能冻结点,这个点之后,不再允许在 -STABLE 分支中增加任何新的API/ABI,然后以这个版本(例如-RC1)为基础进行 ports/ 的联编。另一方面, ports/ 是否有必要随 src/ 冻结?我认为意义不大,因为多数用户并不会使用光盘附带的 package,甚至于使用 -STABLE 的 package 会成为阻碍在 -STABLE 分支中增加新的 API 的障碍,这样一来,在人手有限的情况下,人力不如去维护一个每季度创建一次的稳定 ports/ 分支(只升级其中的安全更新;只维护最多两个分支;确定交付时间),而 -RELEASE 则随同最近的一个这样的分支去发布。
在升级支持方面,目前FreeBSD发布新版本的周期显得过长。这会带来两个问题:其一,在无法预测何时会发布发行版本的前提下,用户如何安排升级?其二,在这样一段较长的时间内,如果出现新的硬件,发行版本光盘无法及时更新,而普通用户更新光盘中的驱动程序则比较困难。
为了因应这种情况,我认为我们应该将现有的 X.Y 发行版模式改为 X.Y.Z 发行版模式。其中,X每18个月发布一个新版本,Y每6个月发布一个新版本,而Z的发行周期则视需要而定,每一个新的Z版本均发布对应的ISO文件,而其中除了重要的安全和可靠性更新之外,也包含经过较长测试的、对于新硬件的支持改进,作为对 -STABLE 快照的补充。
最后的问题其实还是,我们的发行版本的目标用户人群是什么?我希望能够得到一些来自用户的反馈。还有一个好消息是,这个礼拜我们总算有希望能看到RC2了......
说明:这个实际上是一个workaround,不过我暂时没时间修这个bug。这是一个作弊条,主要目的在于解决这一特定问题而非阐述其背后的原理和最佳实践。
方法:通常启用/上面的SoftUpdates(默认情况下FreeBSD并不启用/上面的SoftUpdates,因为/通常容量很小,开启SoftUpdates意义不大)。正常启用/上面SoftUpdates的方法是启用到单用户模式,然后用tunefs -n enable /来启用SoftUpdates,然后立刻重启。
远程启用SoftUpdates,因为通常无法让机房或机器旁边的人操作,因此进入单用户模式是不实际的;另一方面,如果以读写方式重新挂载 /,则会导致SoftUpdates设置被覆盖,因此不能通过写文件来标记。
具体的做法是使用下列 /etc/rc.early 脚本。注意:这个并不是最简/最优的方案,只是一个能用的方案。
#!/bin/sh
mount -o rdonly /usr
( /sbin/dumpfs / | /usr/bin/head -n 20 | /usr/bin/grep soft-updates > /dev/null 2>&1 ) || (tunefs -n enable / && reboot)
umount /usr
操作成功之后删除 /etc/rc.early 即可。
系統環境: Ubuntu 8.04 (Hardy), Gnome desktop,
Conky 1.5.1
桌布來源:
DanielSmithDesigns Weblog - Gray Moon Wallpaper
環境:
Due to unfortunate circumstances Windows binaries for PECL extensions will no longer be available on [pecl4win.php.net.]
Work is being done to incorporate Windows binaries for PECL extensions into pecl.php.net and will hopefully be ready early 2009
If anyone is interested in the project please join the PHP Windows Development mailinglist.
简介:
支持 歌名+歌手 此方式下载,所以支持百度mp3(新歌TOP100、歌曲TOP500、经典老歌、热门对唱、相声小品荟萃、摇滚歌曲榜)下载。
在网上没找到php cli方式的下载百度mp3的脚本,很奇怪,php挺流行就是cli方式却很少,安全问题,效率问题?个人还是挺喜欢这种方式的。比如批量的图片缩放,合并,用 ImageMagick 比 GD 效率好多了,而且功能也多,但需要安装插件,太麻烦,直接用system调用ImageMagick,方便又灵活,perl ,python 都是这样做的,为什么php不行。
难点:
1、对html页面进行正则分析,获取歌名、歌手、mp3地址。参考preg_match_all。
2、百度mp3地址用js加密了,把它解出来。原理在shell 方式有详细说明,不再罗嗦,简单说2句:
取加密地址第一位,然后根据这个来生成 search。
取加密地址中:的位置来生成replace。
然后用str_replace(search, replace, encode)来解密,但 str_replace 函数不行,我用了另一种方法,见代码。
说明:
1、根据机器安装了是否安装了ffmpeg,来选择下载。如果没有安装,那么MP3_TYPE就仅仅是mp3,如果安装了,根据需要下载所有类型歌曲。
2、下载的歌曲大小有个选择范围,默认3M-10M,可以根据需要自己调节。
3、下载方式有wget和mytget,因为wget是单线程下载,并不是说不好,如果你有足够耐性而且机器没有安装mytget,就用wget好了。
4、下载的歌曲是按“歌手拼音_歌名拼音.mp3”重命名,另生成asx文件,方便播放。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | #!/usr/bin/php #Author: lendy #Date: 2008-12-08 12:00:00 #Contact: lendy at 9846 dot com or [lendy.9846.com] < ?php define('BAIDU_URL', 'http://list.mp3.baidu.com/topso/mp3topsong.html?top2'); //for get file define('GET_TYPE', 'mytget'); //wget or mytget,default wget. define('GET_TMP', '/tmp'); define('MP3_FOLDER', '/home/xxx/public_html/download/mp3/baidu'); //file type and size(M) define('MP3_TYPE', 'mp3,wma'); define('MP3_MAX', 10); define('MP3_MIN', 3); //for build asx file define('MP3_URL', 'http://download.xxx.com/mp3/baidu'); define('PLAYLIST_FILE', '/home/xxx/public_html/player/top500.asx'); //begin include_once('hanzi2pinyin.php'); include_once('jscoding.php'); $stringHtmlContent = file_get_contents(BAIDU_URL); preg_match_all("#<a\shref=\"(.*?)\"\starget=_blank>(.*?)(\s+)\((.*?)\)#i", $stringHtmlContent, $arrayHtmlContent); //print_r($arraySongContent);exit(); $intHtmlContent = count($arrayHtmlContent[0]); for($i=0; $i< $intHtmlContent; $i++) { $stringUrl = trim($arrayHtmlContent[1][$i]); $stringTitle = trim(strip_tags($arrayHtmlContent[2][$i])); $stringAuthor = strtoupper(trim(strip_tags($arrayHtmlContent[4][$i]))); echo "($i)$stringTitle($stringAuthor)\n"; $stringMp3Name = preg_replace('/[^a-z0-9.&_]/', '', hanzi2pinyin(strtolower(str_replace('/', '&', $stringAuthor) . '_' . $stringTitle)) . '.mp3'); $stringMp3File = MP3_FOLDER . '/' . $stringMp3Name; if(!is_file($stringMp3File)) { echo "= Download...\n"; getlist($stringUrl, $stringTitle, $stringAuthor, $stringMp3Name); } if(is_file($stringMp3File)) { //build asx $arraySongs[] = array( 'title' => $stringTitle, 'author' => $stringAuthor, 'url' => MP3_URL . '/' . $stringMp3Name, ); } } //write asx echo "Writing asx file...\n"; $stringContent .= "<asx version=\"3.0\">\n"; $stringContent .= "<title>My Favorite Songs</title>\n"; $stringContent .= "<param name=\"allowshuffle\" value=\"yes\"/>\n"; foreach($arraySongs as $arraySong) { $stringContent .= "\t<entry>\n"; $stringContent .= "\t\t<title>" . iconv('GB2312', 'UTF-8//IGNORE', $arraySong['title']) . "</title>\n"; $stringContent .= "\t\t<author>" . iconv('GB2312', 'UTF-8//IGNORE', $arraySong['author']) . "</author>\n"; $stringContent .= "\t\t<ref href=\"" . $arraySong['url'] . "\"/>\n"; $stringContent .= "\t</entry>\n"; } $stringContent .= "</asx>\n"; file_put_contents(PLAYLIST_FILE, $stringContent); echo "Finished...\n"; //print_r($arraySong); function getlist($url, $title, $author, $name) { $stringHtmlContent = file_get_contents($url); preg_match_all("#<td \sclass=d><a \shref=\"(.*?)\"(.*)><font color=\"\#c60a00\">(.*?)</font>(\s+)</a></td>(\s+)<td>(.*?)</td>(\s+)<td \sclass=al>(.*?)</td>(\s+)<td>(.*?)</td>(\s+)<td>(.*?)</td>(\s+)<td>(.*?)</td>(\s+)<td>(.*?)\sM</td>(\s+)<td>(.*?)</td>#i", $stringHtmlContent, $arrayHtmlContent); // print_r($arrayHtmlContent);exit(); $intHtmlContent = count($arrayHtmlContent[0]); for($i=0; $i< $intHtmlContent; $i++) { if(!is_file(MP3_FOLDER . '/' . $name)) { $stringUrl = trim($arrayHtmlContent[1][$i]); $stringTitle = trim(strip_tags($arrayHtmlContent[3][$i])); $stringAuthor = strtoupper(str_replace(' ', '/', trim(str_replace(' ', ' ', strip_tags($arrayHtmlContent[6][$i]))))); $stringSize = trim($arrayHtmlContent[16][$i]); $stringType = trim($arrayHtmlContent[18][$i]); if(($stringTitle == $title) && ($stringAuthor == $author) && ($stringSize > MP3_MIN) && ($stringSize < MP3_MAX) && (in_array($stringType, split(',' ,MP3_TYPE)))) { echo "== List($i)[$stringSize M]: "; getsong($stringUrl, $name, $stringType); } } } } function getsong($url, $name, $type) { $stringHtmlContent = file_get_contents(encodeURI($url)); preg_match_all('#I="(.*)",J=#i', $stringHtmlContent, $arrayHtmlContent); $stringUrl = songdecode(trim($arrayHtmlContent[1][0])); echo "$stringUrl\n"; if($type != 'mp3') { $stringName = $name . '.' . $type; } else { $stringName = $name; } $stringFileOld = GET_TMP . "/" . $stringName; $stringFileNew = MP3_FOLDER . "/" . $name; if(GET_TYPE == 'mytget') { system("mytget -t 10 -c 3 -n 5 -d '" . GET_TMP . "' -f '$stringName' '$stringUrl'"); } else { system("wget -q -T 10 -t 3 -c '$stringUrl' -O '$stringFileOld'"); // system("wget -T 60 -t 10 -c '$stringUrl' -O '$stringFileOld'"); } if((is_file($stringFileOld)) && (filesize($stringFileOld) > MP3_MIN*1024*1024) && (filesize($stringFileOld) < MP3_MAX*1024*1024)) { echo "=== Song: $stringName\n\n"; if($type != 'mp3') { system("ffmpeg -i '$stringFileOld' '$stringFileNew'"); } else { system("cp '$stringFileOld' '$stringFileNew'"); } } system("unlink '$stringFileOld'"); } function songdecode($url) { $charHead = substr($url, 0, 1); $arraySplit = split($charHead, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'); $stringQue = $charHead . $arraySplit[1] . $arraySplit[0]; if(strpos($url, ':') == 3) {//ftp $stringKey = 'fghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcde'; } else {//http $stringKey = 'hijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg'; } $arrayQue = preg_split('//', $stringQue, -1, PREG_SPLIT_NO_EMPTY); $arrayKey = preg_split('//', $stringKey, -1, PREG_SPLIT_NO_EMPTY); // return str_replace($arrayQue, $arrayKey, $stringQue); //why error? $arrayReplace = array_combine($arrayQue, $arrayKey); $arrayUrl = preg_split('//', $url, -1, PREG_SPLIT_NO_EMPTY); foreach($arrayUrl as $charUrl) { if($arrayReplace[$charUrl] == '') { $stringUrl .= $charUrl; } else { $stringUrl .= $arrayReplace[$charUrl]; } } return $stringUrl; } ?> |
hanzi2pinyin.php和jscoding.php文件下载。
首次运行可适当增加苛刻条件,比如类型是mp3大小在4-6,然后适当放宽条件。多运行几次。
参考:
shell 方式下载参考