手机短信天气预报自动发送程序
今天闲来无聊想起网上流传已久的飞信API接口,加上MM说想要手机天气预报,平时又没空拿她手机安装软件,所以就有了写个手机短信天气预报程序的想法。
程序大致分成两个模块,(一)PHP程序采集中国气象网站的数据用正则表达式进行提取关键信息,这个以前的文章已经写过不再重复叙述。然后利用飞信的API接口向MM的手机发送天气预报数据。
(二)写一个shell脚本,实现访问PHP程序。考虑到网络偶尔出现故障,加入了sleep和while循环。
最后在crontab里面添加每天定时执行shell脚本即可。
部分关键代码如下:
<?php $id = "101210101";//杭州 $file = file_get_contents("http://www.weather.com.cn/html/weather/{$id}.shtml");//读取远程数据 preg_match_all("/<!--day 1-->(.*?)<div class="weatherYubao" id="weatherYubao2">/is",$file,$main_content);//取有价值的部分 $main_content = $main_content[0][0]; //明天数据 preg_match_all("/<!--day 2-->(.*?)<!--day 3-->/is",$main_content,$day2); $day2 = $day2[0][0]; //print_r($day2); $start = '<td width="15%" rowspan="2" class="t0" style="background:#f4f7fc;">'; $end = '</td>'; preg_match_all("/".$start."(.*?)".$end."/is",$day2,$tomorrow); $tomorrow = trim(strip_tags($tomorrow[1][0]));//日期 $start2 = '<td width="15%">'; $end2 = '</td>'; preg_match_all("/".$start2."(.*?)".$end2."/is",$day2,$bttq2); $bttq2 = $bttq2[0]; $start4 = '<td width="18%">'; $end4 = '</td>'; preg_match_all("/".$start4."(.*?)".$end4."/is",$day2,$tmp2); $tmp2 = $tmp2[1][0]; $bttq2[3] = $tmp2; foreach($bttq2 as &$value){ $value = trim(strip_tags($value)); } $start3 = '<td>'; $end3 = '</td>'; preg_match_all("/".$start3."(.*?)".$end3."/is",$day2,$wstq2); $wstq2 = $wstq2[0]; foreach($wstq2 as &$value){ $value = trim(strip_tags($value)); } $str2 = " ".$tomorrow." 白天:".$bttq2[3].",".$bttq2[0].",".$bttq2[1].",".$bttq2[2]." 夜间:".$wstq2[1].",".$wstq2[2].",".$wstq2[3].",".$wstq2[4]."。"; //echo $str2; //未来N天的数据都可以用类似的方式获取,这里我不全部列举了。 $url = "http://sms.api.bz/fetion.php?username=你的手机号&password=飞信密码&sendto=对方手机号码&message=";//API接口,支持https加密方式 $url = $url.urlencode("尊敬的用户:欢迎使用手机短信天气预报服务! ".$str2."---piao2010.com为您服务!服务热线:668686,此短信由程序自动发送,请勿回复!"); $count = 1; //读取次数 $max_count = 3;//最多读取次数 while( ( $html = file_get_contents($url) ) === false && $count <= $max_count ) { $count++; } if ( $html == "短信已提交到发送队列!" ) echo "ok!"; else echo "failed!"; ?> |
#!/bin/sh #script for mm URL="http://piao2010.com/weather.php"#替换为实际PHP程序地址 FILE="/var/log/weather.log"#日志文件 echo > $FILE; curl $URL > $FILE 2>&1; while ! grep "ok" $FILE >/dev/null; do sleep 10m;//暂停10分钟 curl $URL > $FILE 2>&1 done; echo "Finished on `date`" > $FILE; |
另外有同学提醒我文件编码问题,忘记强调了一点:PHP文件请采用utf-8编码,飞信API和中国气象网站也是用utf-8编码的。
婆婆真幸福,有这样短信解决方案~
[回复]
发现中国天气网的数据还是比手机上的天气通要准确一些,我的手机现在还显示多云,明明下了半天的雨了。
[回复]
这个程序没有考虑编码问题~~~
[回复]
中国天气网站的编码是U8的,我平时写PHP也习惯用U8所以不存在乱码问题,飞信的API接口经N次测试中文显示都是正常的,而且网页也是U8编码的。
[回复]
谢谢
[回复]
RE毛毛:内测结束后就是收费服务了,哈哈!
[回复]
你想出来的?学长牛啊
[回复]
飘 回复:
3月 4th, 2010 at 21:41
Re Leigh:只是以前写的小程序拼凑在一起而已啦,没什么新意的。代码也是随手草稿,见笑。
[回复]
这东西不错啊,不过最近对python感兴趣,因为可以用Google app engine架设,免费使用
[回复]
Re 小峰:发现最近大家都python去了。。我还考虑想perl去呢。
[回复]
还有这种好想法,不错不错
[回复]
很强大~
[回复]
飘(piao2010) 回复:
4月 24th, 2010 at 20:35
呵呵,只是小游戏而已啦。
[回复]
你博客导航上的邮箱链接 是怎么加上去的?
这是外部链接啊
[回复]
飘(piao2010) 回复:
4月 25th, 2010 at 21:55
子域名,指向我自己配置的一台邮件服务器。
[回复]
皇家元林 回复:
4月 26th, 2010 at 09:43
我知道是子域名,我的意思是说 你怎么把这个加到WordPress的导航上去的?
我的WordPress导航好像加不了
[回复]
飘(piao2010) 回复:
4月 26th, 2010 at 19:04
直接在PHP文件里面增加就是了。
你这么麻烦啊
我知道了,有个插件可以解决。
叫page links to
[回复]
飘(piao2010) 回复:
4月 27th, 2010 at 15:04
为了加个导航而安装插件。。。我感觉有点多余,就一行代码而已 : )
[回复]
很好很强的程序
[回复]
不错不错
[回复]
飘(piao2010) 回复:
5月 2nd, 2010 at 23:24
枫之羽大驾光临,实在是荣幸啊。
[回复]
很喜欢这个程序
[回复]