手机短信天气预报自动发送程序

今天闲来无聊想起网上流传已久的飞信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编码的。

相关日志

  1. 南柯一梦 说:

    婆婆真幸福,有这样短信解决方案~

    [回复]

  2. 说:

    发现中国天气网的数据还是比手机上的天气通要准确一些,我的手机现在还显示多云,明明下了半天的雨了。

    [回复]

  3. 南柯一梦 说:

    这个程序没有考虑编码问题~~~

    [回复]

  4. 说:

    中国天气网站的编码是U8的,我平时写PHP也习惯用U8所以不存在乱码问题,飞信的API接口经N次测试中文显示都是正常的,而且网页也是U8编码的。

    [回复]

  5. 毛毛 说:

    谢谢

    [回复]

  6. 说:

    RE毛毛:内测结束后就是收费服务了,哈哈!

    [回复]

  7. Leigh 说:

    你想出来的?学长牛啊

    [回复]

    回复:

    Re Leigh:只是以前写的小程序拼凑在一起而已啦,没什么新意的。代码也是随手草稿,见笑。

    [回复]

  8. 小峰JoysBoy 说:

    这东西不错啊,不过最近对python感兴趣,因为可以用Google app engine架设,免费使用

    [回复]

  9. 说:

    Re 小峰:发现最近大家都python去了。。我还考虑想perl去呢。

    [回复]

  10. 忆草 说:

    还有这种好想法,不错不错

    [回复]

  11. xtjacking 说:

    很强大~

    [回复]

    飘(piao2010) 回复:

    呵呵,只是小游戏而已啦。

    [回复]

  12. 皇家元林 说:

    你博客导航上的邮箱链接 是怎么加上去的?
    这是外部链接啊

    [回复]

    飘(piao2010) 回复:

    子域名,指向我自己配置的一台邮件服务器。

    [回复]

    皇家元林 回复:

    我知道是子域名,我的意思是说 你怎么把这个加到WordPress的导航上去的?
    我的WordPress导航好像加不了

    [回复]

    飘(piao2010) 回复:

    直接在PHP文件里面增加就是了。

  13. 皇家元林 说:

    你这么麻烦啊
    我知道了,有个插件可以解决。
    叫page links to

    [回复]

    飘(piao2010) 回复:

    为了加个导航而安装插件。。。我感觉有点多余,就一行代码而已 : )

    [回复]

  14. 忆草 说:

    很好很强的程序

    [回复]

  15. 枫之羽 说:

    不错不错

    [回复]

    飘(piao2010) 回复:

    枫之羽大驾光临,实在是荣幸啊。

    [回复]

  16. 忆草 说:

    很喜欢这个程序

    [回复]

  1. There are no trackbacks for this post yet.

Leave a Reply