这是仿造一位知友写的天气预报订阅写的,没什么技术含量,为了节约数据库开销(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