飞信发送天气预报的设计与实现

去年有在应用->Fetion->send_to_myself应用->Fetion->user_to_user里实现过网页里发送飞信消息,那时发送的消息内容是由textarea里的内容确定的,最近想直接抓取网上的天气预报,实现一个定时发送天气预报的功能。

主要的思路如下:

  • 网上抓取到天气

  • 将获取到的天气通过飞信发送至手机

  • 实现定时发送

网上抓取天气就需要用到PHP里的curl网络编程,首先需要curl_init初始化一个curl会话,设置CURLOPT_URL设置需要抓取的URL,设置CURLOPT_RETURNTRANSFER为1,这样成功时只将结果返回,不输出任何内容,为0的话则会自动输出返回的内容,接下来就是curl_exec执行该会话,将返回的结果保存在一个变量中,最后关闭会话。变量中返回的是整个网页的结果,如果用print_r给打印出来的话可以看到时一个完整的页面(需要调用原本的js之类的会报不存在的错误)。

我需要做的是将显示今天天气或近7天天气的那部分给截取下来,一种方法是用正则直接去匹配,另一种方式就是用explode去分割,将某部分的信息个分割出来。比如,在www.weather.com.cn中显示天气的表格里会有<!–day 1–>等的注释,可以利用这样的特点分割出需要的信息,当然分割出来的还包括很多不需要的html标签,接下来就需要去除这些标签了。在PHP中提供了strip_tags函数用来去除html标签,但是用的时候出现了些问题,打印出来的确实是不包括标签的,是一个常常的字符串,但在后来的发送中出了问题,就是用F12调BUG的时候发现,那些去除标签后留下的字符串并不是一个长串,而是留成了空白,只是形式上的去除标签,而且用trim函数去除空格后也不管用。最终还是自己手写函数去除所有的标签。参考代码如下:
图片

在抓取网页的时候需要注意每个城市的city_code城市代号,这样的城市代号是统一归定的,比如苏州city_code是101190401,其它的通过www.weather.com.cn中对应城市的URL可以查到。

飞信的API中提供了很好的PHP版本,只要发信账号、密码、接收方的账号、发送的内容就行。当然,接收方首先应是你的飞信好友,不然是不会发出去的,示例代码如下fetion其中,$fetion_me是我的飞信账号,$fetion_pw是密码,这两个是写在配置文件里的。函数传入的参数一个是接收方的账号,另一个就是发送的内容了。
图片

定时机制一种是直接执行PHP脚本,而在我的虚拟主机里是不提供命令行的,也就是说我必须在网页代码里写好。需要的是ignore_user_abort();函数,即使关掉浏览器,PHP脚本也能继续执行。设置一个sleep的时间,每隔多长时间后判断一次。这样,一个定时发送天气预报的功能就实现了。

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>