php利用sae定时通过飞信没费发短信播报天气预报给自己
2017-04-16
后端
<?php
/*
1: 先把下面的代码粘到config.yaml文件中 计划任务为每天8点
appname: zhangya45481
version: 1
cron:
- description: feixin_tianqiyubao
url: index2.php
schedule: every day of month 08:00
2: 在跟目录新建index2.php把下面代码粘进去
*/
//中国气象json数据地址
$url = 'http://m.weather.com.cn/data/101210101.html';
//转换返回的数据
$js_arr = json_decode(get_html($url),true);
//var_dump($url);die();
$str = '你要查询的地区是: ' . $js_arr['weatherinfo']['city'] . '<br />';
$str .= '今天是: ' . $js_arr['weatherinfo']['date_y'] . '<br />';
$str .= '今天是: ' . $js_arr['weatherinfo']['week'] . '<br />';
$str .= '今天温度是: ' . $js_arr['weatherinfo']['temp1'] . '<br />';
$str .= '今天穿衣指数: ' . $js_arr['weatherinfo']['index'] . ' ' . $js_arr['weatherinfo']['index_d'] . '<br />';
$str .= '48小时穿衣指数: ' . $js_arr['weatherinfo']['index48'] . ' ' . $js_arr['weatherinfo']['index48_d'] . '<br />';
$str .= '紫外线及48小时紫外线: ' . $js_arr['weatherinfo']['index_uv'] . ' ' . $js_arr['weatherinfo']['index48_uv'] . '<br />';
$str .= '洗车: ' . $js_arr['weatherinfo']['index_xc'] . '<br />';
$str .= '旅游: ' . $js_arr['weatherinfo']['index_tr'] . '<br />';
$str .= '舒适指数: ' . $js_arr['weatherinfo']['index_co'] . '<br />';
$str .= '晨练: ' . $js_arr['weatherinfo']['index_cl'] . '<br />';
$str .= '晾晒: ' . $js_arr['weatherinfo']['index_ls'] . '<br />';
$str .= '过敏: ' . $js_arr['weatherinfo']['index_ag'] . '<br /><br />';
//echo $str;
$str = get_enhtml($str);
//var_dump($str);
//载入飞信类
//require './lib/feixin.php';
// 手机号、飞信密码
$fetion = new PHPFetion('', '');
//接收的号码,与天气预报信息
$fetion->send('', $str);
echo 'ok!发送成功!';
//字符串检测函数
function utf8_str($str){
$mb = mb_strlen($str,'utf-8');
$st = strlen($str);
if($st==$mb)
return '纯英文';
if($st%$mb==0 && $st%3==0)
return '纯汉字';
return '汉英混合';
}
//curl抓取页面
function get_html($url,$options = array()){
$options[CURLOPT_RETURNTRANSFER] = true;
$options[CURLOPT_TIMEOUT] = 5;
$ch = curl_init($url);
curl_setopt_array($ch,$options);
$html = curl_exec($ch);
curl_close($ch);
if($html === false){
return false;
}
return $html;
}
//过滤html为纯文本
function get_enhtml($string)
{
$pattern=array ("'<script[^>]*?>.*?</script>'si",// 去掉 javascript
"'<style[^>]*?>.*?</style>'si",// 去掉 HTML 标记
"'<[/!]*?[^<>]*?>'si",//去掉 HTML 标记
"'<!--[/!]*?[^<>]*?>'si", // 去掉 注释标记
"'([rn])[s]+'", // 去掉空白字符
"'&(quot|#34);'i",
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(d+);'e");
$replace=array ("", "", "", "", "1", "", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(1)");
$string=preg_replace($pattern, $replace, $string);
$string=preg_replace("/<(.*?)>/","",$string);
$string=str_replace("n","",$string);
$string=str_replace("r","",$string);
$string=str_replace(" ","",$string);
$string=str_replace(" ","",$string);
return addslashes(trim($string));
}
/**
* PHP飞信发送类
*
* @author quanhengzhuang <blog.quanhz.com>
* @version 1.5.0
*/
class PHPFetion
{
/**
* 发送者手机号
* @var string
*/
protected $_mobile;
/**
* 飞信密码
* @var string
*/
protected $_password;
/**
* Cookie字符串
* @var string
*/
protected $_cookie = '';
/**
* Uid缓存
* @var array
*/
protected $_uids = array();
/**
* csrfToken
* @var string
*/
protected $_csrfToten = null;
/**
* 构造函数
* @param string $mobile 手机号(登录者)
* @param string $password 飞信密码
*/
public function __construct($mobile, $password)
{
if ($mobile === '' || $password === '')
{
return;
}
$this->_mobile = $mobile;
$this->_password = $password;
$this->_login();
}
/**
* 析构函数
*/
public function __destruct()
{
$this->_logout();
}
/**
* 登录
* @return string
*/
protected function _login()
{
$uri = '/huc/user/space/login.do?m=submit&fr=space';
$data = 'mobilenum='.$this->_mobile.'&password='.urlencode($this->_password);
$result = $this->_postWithCookie($uri, $data);
//解析Cookie
preg_match_all('/.*?rnSet-Cookie: (.*?);.*?/si', $result, $matches);
if (isset($matches[1]))
{
$this->_cookie = implode('; ', $matches[1]);
}
$result = $this->_postWithCookie('/im/login/cklogin.action', '');
return $result;
}
/**
* 向指定的手机号发送飞信
* @param string $mobile 手机号(接收者)
* @param string $message 短信内容
* @return string
*/
public function send($mobile, $message)
{
if ($message === '')
{
return '';
}
//判断是给自己发还是给好友发
if ($mobile == $this->_mobile)
{
return $this->_toMyself($message);
}
else
{
$uid = $this->_getUid($mobile);
return $uid === '' ? '' : $this->_toUid($uid, $message);
}
}
/**
* 获取飞信ID
* @param string $mobile 手机号
* @return string
*/
protected function _getUid($mobile)
{
if (empty($this->_uids[$mobile]))
{
$uri = '/im/index/searchOtherInfoList.action';
$data = 'searchText='.$mobile;
$result = $this->_postWithCookie($uri, $data);
//匹配
preg_match('/toinputMsg.action?touserid=(d+)/si', $result, $matches);
$this->_uids[$mobile] = isset($matches[1]) ? $matches[1] : '';
}
return $this->_uids[$mobile];
}
/**
* 获取csrfToken,给好友发飞信时需要这个字段
* @param string $uid 飞信ID
* @return string
*/
protected function _getCsrfToken($uid)
{
if ($this->_csrfToten === null)
{
$uri = '/im/chat/toinputMsg.action?touserid='.$uid;
$result = $this->_postWithCookie($uri, '');
preg_match('/name="csrfToken".*?value="(.*?)"/', $result, $matches);
$this->_csrfToten = isset($matches[1]) ? $matches[1] : '';
}
return $this->_csrfToten;
}
/**
* 向好友发送飞信
* @param string $uid 飞信ID
* @param string $message 短信内容
* @return string
*/
protected function _toUid($uid, $message)
{
$uri = '/im/chat/sendMsg.action?touserid='.$uid;
$csrfToken = $this->_getCsrfToken($uid);
$data = 'msg='.urlencode($message).'&csrfToken='.$csrfToken;
$result = $this->_postWithCookie($uri, $data);
return $result;
}
/**
* 给自己发飞信
* @param string $message
* @return string
*/
protected function _toMyself($message)
{
$uri = '/im/user/sendMsgToMyselfs.action';
$result = $this->_postWithCookie($uri, 'msg='.urlencode($message));
return $result;
}
/**
* 退出飞信
* @return string
*/
protected function _logout()
{
$uri = '/im/index/logoutsubmit.action';
$result = $this->_postWithCookie($uri, '');
return $result;
}
/**
* 携带Cookie向f.10086.cn发送POST请求
* @param string $uri
* @param string $data
*/
protected function _postWithCookie($uri, $data)
{
$fp = fsockopen('f.10086.cn', 80);
fputs($fp, "POST $uri HTTP/1.1rn");
fputs($fp, "Host: f.10086.cnrn");
fputs($fp, "Cookie: {$this->_cookie}rn");
fputs($fp, "Content-Type: application/x-www-form-urlencodedrn");
fputs($fp, "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1rn");
fputs($fp, "Content-Length: ".strlen($data)."rn");
fputs($fp, "Connection: closernrn");
fputs($fp, $data);
$result = '';
while (!feof($fp))
{
$result .= fgets($fp);
}
fclose($fp);
return $result;
}
}
/*
{ "weatherinfo":
{ <!-- 基本信息 -->
"city":"北京",
"city_en":"beijing",
"date_y":"2012年8月14日",
"date":"",
"week":"星期二",
"fchh":"18",
"cityid":"101010100",
<!-- 从今天开始到第六天的每天的天气情况,这里的温度是摄氏温度 -->
"temp1":"19℃~31℃",
"temp2":"21℃~31℃",
"temp3":"22℃~28℃",
"temp4":"20℃~28℃",
"temp5":"21℃~29℃",
"temp6":"22℃~31℃",
<!-- 从今天开始到第六天的每天的天气情况,这里的温度是华氏温度 -->
"tempF1":"66.2℉~87.8℉",
"tempF2":"69.8℉~87.8℉",
"tempF3":"71.6℉~82.4℉",
"tempF4":"68℉~82.4℉",
"tempF5":"69.8℉~84.2℉",
"tempF6":"71.6℉~87.8℉",
<!-- 天气描述 -->
"weather1":"阵雨转晴",
"weather2":"晴",
"weather3":"多云转雷阵雨",
"weather4":"雷阵雨",
"weather5":"多云转阴",
"weather6":"雷阵雨",
<!-- 天气描述图片序号 -->
"img1":"3",
"img2":"0",
"img3":"0",
"img4":"99",
"img5":"1",
"img6":"4",
"img7":"4",
"img8":"99",
"img9":"1",
"img10":"2",
"img11":"4",
"img12":"99",
"img_single":"0",
<!-- 图片名称 -->
"img_title1":"阵雨",
"img_title2":"晴",
"img_title3":"晴",
"img_title4":"晴",
"img_title5":"多云",
"img_title6":"雷阵雨",
"img_title7":"雷阵雨",
"img_title8":"雷阵雨",
"img_title9":"多云",
"img_title10":"阴",
"img_title11":"雷阵雨",
"img_title12":"雷阵雨",
"img_title_single":"晴",
<!-- 风速描述 -->
"wind1":"微风",
"wind2":"微风",
"wind3":"微风",
"wind4":"微风",
"wind5":"微风",
"wind6":"微风",
"fx1":"微风",
"fx2":"微风",
<!-- 风速级别描述 -->
"fl1":"小于3级",
"fl2":"小于3级",
"fl3":"小于3级",
"fl4":"小于3级",
"fl5":"小于3级",
"fl6":"小于3级",
<!-- 今天穿衣指数 -->
"index":"炎热",
"index_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。",
<!-- 48小时穿衣指数 -->
"index48":"炎热",
"index48_d":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。",
<!-- 紫外线及48小时紫外线 -->
"index_uv":"很强",
"index48_uv":"强",
<!-- 洗车 -->
"index_xc":"较不宜",
<!-- 旅游 -->
"index_tr":"适宜",
<!-- 舒适指数 -->
"index_co":"较不舒适",
"st1":"31",
"st2":"17",
"st3":"31",
"st4":"22",
"st5":"27",
"st6":"22",
<!-- 晨练 -->
"index_cl":"适宜",
<!-- 晾晒 -->
"index_ls":"极适宜",
<!-- 过敏 -->
"index_ag":"易发"
}
}
*/