这是仿造一位知友写的天气预报订阅写的,没什么技术含量,为了节约数据库开销(SAE的数据库读写好贵T.T),把用户数据和城市数据存在单独的php文件里作为两个数组。。。orz。。其实本来想写到xml文件里,这样以后导出也比较方便,数据格式也比较规范,但是对于xml不熟悉,而且貌似权限没有办法进行恰当的设置(这样会造成直接访问xml文件就看到数据了),所以没有使用。

现在有个问题,就是整个流程是由一个文件驱动的,这个文件一旦运行,就循环地取得天气数据和用户数据,然后把短信发送出去了。就是说,直接访问这个文件跟crontab触发这个文件,本质上是没有区别的,短信都会发出去。这样就造成一个比较麻烦的问题,如果有爬虫访问了这个文件,所有用户都会收到短信,如果有人无意间访问了这个文件,短信也会发送出去,这样对用户来说是很不礼貌的。目前还没有想到解决办法。

上一部分代码吧,php学得好差,见笑了。

先是用户数据的范例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php
$FeedUsers = array(
  '哈尔滨' => array(
    'user1' => array(
      'nick' => '用户1',
      'mobileNo' => '15123456789'
    ),
    'user3' => array(
      'nick' => 'user3',
      'mobileNo' => '13812345670'
    )
  ),
  '大连' => array(
    'user2' => array(
      'nick' => '用户2',
      'mobileNo' => '13800138000'
    )
  )
);
?>

城市数据的范例。

1
2
3
4
5
6
<?php
$cityDatabase = array(
  '哈尔滨' => '101050101',
  '大连' => '101070201'
);
?>

发送短信的部分。

 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
<?php
error_reporting(0);
set_time_limit(0);
include_once('feed.php');// 这是用户数据
include_once('database.php');// 这是城市数据
$mobile = '13800138000';// 用来发送飞信的手机号
$mobilePwd = '123456';// 飞信密码
$to = $FeedUsers;// Import user data.
$cityList = $cityDatabase;// Import city data.
$serviceIntro = '(此服务由Joker强力驱动,详情访问http://mynook.info/)';// 很无耻地加了点附加信息~~
$sendBaseUrl = 'http://' . $_SERVER['HTTP_HOST'] . '/pafetion1.4.php';// 定义pafetion的路径

function getWeatherData($cId){// 这个比较简单,从中国天气网获取天气信息的函数
  if(empty($cId)){
    return false;
  }
  $wurl = 'http://m.weather.com.cn/data/' . $cId . '.html';
  $json = file_get_contents($wurl);
  $json = get_object_vars(json_decode($json));
  $json = get_object_vars($json['weatherinfo']);
  $Weah = $json['weather2'];
  $Temp = $json['temp2'];
  $tomo = array(
    'Weah' => $Weah,
    'Temp' => $Temp
  );
  return $tomo;
}

function _get_http_result($_url){// 发送http请求的函数,因为不想每一次都curl整个来一遍,所以分离出来了
  if(empty($_url)){
    return false;
  }
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "$_url");
  curl_setopt($ch, CURLOPT_TIMEOUT, 8);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  $result = curl_exec($ch);
  $info = curl_getinfo($ch);
  curl_close($ch);
  if($result){
    return 'Success';
  }
}

foreach($to as $cityName => $group){//外层循环,对于每个组查询一次天气信息
  $cityId = $cityList[$cityName];// Get every city's id according to city's name.
  $groupUsers = $to[$cityName];// Get th users of current group.
  $tomorrow = getWeatherData($cityId);// Get current city's weather.
  foreach($group as $user){// Get users in current group.// 内层循环,针对每个用户生成不同短信内容
    $msg = $user['nick'] . ',您好!' . $cityName . '明天' . $tomorrow['Weah'] . ',温度' . $tomorrow['Temp'] . ',关注天气变化,注意身体哦~' . $serviceIntro;
    $url = $sendBaseUrl . '?phone=' . $mobile . '&pwd=' . $mobilePwd . '&to=' . $user['mobileNo'] .'&u=1&msg=' . $msg;// 生成短信请求的URL
    $sendResult = _get_http_result($url);
    if($sendResult == 'Success'){
      echo 'Success';
    }else {
      echo 'Fail';
    }
    sleep(1);
  }
}
?>

这个服务使用到了 pafetion 的飞信 API ,详情参看作者的博客:<http://3haku.net/tag/pafetion “pafetion”>。城市数据由知友的原版天气预报订阅服务的源码提取:http://zhi.hu/DFWO

源码下载:http://www.qblog.kilu.net/source/nookweather.tar.gz