微信天气环境质量

最近我们公司终于认识到微信的重要性,申请了公众平台,没事干,然后想着能不能开发一下微信的后台,据说微信后台开发一般使用微信+新浪Sae模式,那就是用这个模式把。

第一步当然是申请sae了网址 http://sae.sina.com.cn/

第二步开启微信公众平台开发者模式,验证token和url通过,就能使用远程服务器了。

第三步用php编写代码  

<?php
/**
  * ΢@author wang zhanliang.
  */

// define your token
define ( "TOKEN", "weixin" );
$wechatObj = new wechatCallbackapiTest ();
$wechatObj->responseMsg ();
class wechatCallbackapiTest {
	public function responseMsg() {
		// get post data, May be due to the different environments
		$postStr = $GLOBALS ["HTTP_RAW_POST_DATA"];
		date_default_timezone_set("Asia/Hong_Kong");
		// extract post data
		if (! empty ( $postStr )) {
			
			$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
			$fromUsername = $postObj->FromUserName;
			$toUsername = $postObj->ToUserName;
			$keyword = trim ( $postObj->Content );
			$time = time ();
			$textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							<Content><![CDATA[%s]]></Content>
							<FuncFlag>0</FuncFlag>
							</xml>";
			$picTpl = "<xml>
                       <ToUserName><![CDATA[%s]]></ToUserName>
                       <FromUserName><![CDATA[%s]]></FromUserName>
                       <CreateTime>%s</CreateTime>
                       <MsgType><![CDATA[%s]]></MsgType>
                       <ArticleCount>1</ArticleCount>
                       <Articles>
                       <item>
                       <Title><![CDATA[%s]]></Title> 
                       <Description><![CDATA[%s]]></Description>
                       <PicUrl><![CDATA[%s]]></PicUrl>
                       <Url><![CDATA[%s]]></Url>
                       </item>
                       </Articles>
                       <FuncFlag>1</FuncFlag>
                       </xml> ";
        	
            if (trim ( $postObj->MsgType ) == "event" and trim ( $postObj->Event ) == "subscribe") {
				$msgType = "news";
                $title = "欢迎";
				$data = date ( 'Y-m-d' );
				$desription = "感谢您关注【步青科技】" . "\n" . "步青科技为您提供完美的建筑监测与室内环境治理方案。" . "\n" . "本订阅号功能如下:" . "\n" . "【1】居室我知道" . "\n" . "【2】建筑我知道" . "\n" . "【3】今日环境  输入:如:郑州环境" . "\n" . "【4】优惠活动" . "\n" . "【5】关注我们" . "\n" . "【6】联系我们" . "\n" . "【7】了解更多" . "\n";
                $image = "http://h.hiphotos.bdimg.com/album/s%3D1600%3Bq%3D90/sign=406a9d51d300baa1be2c43bd77208263/0b46f21fbe096b6329730eed0e338744ebf8ac21.jpg";
				$turl = "http://siteapp.baidu.com/webapp/www.shbq.com?host=www.shbq.com";
				
				$resultStr = sprintf ( $picTpl, $fromUsername, $toUsername, $time, $msgType, $title, $desription, $image, $turl );
				echo $resultStr;
			}else if (! empty ( $keyword )) {
					$msgType = "text";
                
                    $kv = new SaeKV();
                    // 初始化KVClient对象
                    $ret = $kv->init();

                    //天气
                    $str = mb_substr($keyword,-2,2,"UTF-8");
                    $str_key = mb_substr($keyword,0,-2,"UTF-8");
                    if($str == '环境' && !empty($str_key)){
                        $xml_uri = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName='.$str_key;
                        $dom = simplexml_load_file($xml_uri); 
                        $str ="";
                        foreach($dom as $k=>$v)
                        {
                            $str .= $v."||";
                        }
                        $strs = explode("||", $str);
                    if(empty($strs[1])){
		               $contentStr = "抱歉,没有查到\"".$str_key."\"的环境信息!";
                    } else {          
                        $ret = $kv->get($str_key)->time_point;
                        $time2 =  strtotime(substr( $ret,0,10)." ".substr( $ret,11,8)) ;
                        $time1 = strtotime(date( "Y-m-d H:i:s")); 
                        $sub1 = ceil(($time2 - $time1) / 3600);    //60 * 60
                        if($sub<-1){
                            //更新数据
                            $urlpm = "http://www.pm25.in/api/querys/aqi_ranking.json?token=XXXXXXXXXX";
                            $weather = file_get_contents ( $urlpm);
                            $weatherJsonpm = json_decode($weather);
                            foreach ( $weatherJsonpm as $key ) {  
                                $ret = $kv->set($key->area, $key);
                            }  
                        }
                        // 获得key-value  
                        $ret = $kv->get($str_key);              
                          
                        $contentStr = "【".$ret->area."天气及空气质量预报】\n".
                                 $strs[6]."\n".
                                 $strs[10]."\n".
                                "AQI指数:".$ret->aqi."\n".
                                "空气质量:".$ret->quality."\n".
                                "等级:".$ret->level."\n".
                                "首要污染物:".$ret->primary_pollutant."\n".
                                "一氧化碳CO:".$ret->co."(mg/m3)"."\n".
                                "二氧化氮NO2:". $ret->no2."(μg/m3)"."\n".
                                "二氧化硫SO2:".$ret->so2."(μg/m3)"."\n".
                                "臭氧O3:".$ret->o3."(μg/m3)"."\n".
                                "PM10:".$ret->pm10."(μg/m3)"."\n".
                                "PM2.5:".$ret->pm2_5."(μg/m3)"."\n".
                                "-------"."\n".
                                "天气数据". $strs[4]."时发布,数据有中国天气网提供(感谢WeatherWebService无偿提供api).\n".
                                "空气质量数据".$ret->time_point."时发布,数据有中国环保局提供(感谢PM25.in无偿提供api).";        
	                        }
                         $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                         echo $resultStr;
                    }
				}
			} else {
				echo "input something";
				exit ();
			}
		}
}

?>

define ( "TOKEN", "weixin" );就是与微信建立连接的token,一定要一致。

由于需要有天气和环境的数据,所以需要调用第三方的api
天气数据是 使用传说中的http://m.weather.com.cn/data/101010100.html,坑爹的是有一天我突然发现数据不更新了,百度了一下才知道原来是这个api暂停了免费服务了,很无语。。。既然不能用就用其他的api吧,找了一下最终决定使用http://www.webxml.com.cn/WebServices/WeatherWebService.asmx提供的免费api,楼主好人啊,可是这个api是xml格式的,所以在接收到的数据需要
$xml_uri = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName='.$str_key;
$dom = simplexml_load_file($xml_uri); //获得城市的xml文件
$str ="";
$v."||";//
foreach($dom as $k=>$v)
{
$str .
=把xml形式的文件转化为字符串,且每个item以||符号分割?这是为嘛?为了方便的将字符串转为数组,方面后面的读取
}
}
$strs = explode("||", $str);//嘻嘻
$strs[n]读item的值,好了天气数据已经得到啦
那么怎么得到环境质量数据呢?提供环境质量数据的公司少之又少啊,更何况是免费的api,找了很久终于找到一个免费提供环境质量api的组织了,http://www.pm25.in/,楼主好人呐。不过要使用免费api的话需要先申请token,申请很快,得到token不要急着调用api,因为考虑到服务器的工作压力,调用api的次数是有限制的。那怎么办呢?执手相看泪眼竟无语凝噎...
哈哈,真好,pm2.5.in.提供的api返回格式是json,而sae提供了一个就KVDB的数据库,据说这个数据库是mongodb的一个变种,而mongodb最大的特色就是保存数据格式是json,查询结果也是json返回。这不正好。。。使用KVDB做缓存数据。
这样就解决了多次调用api限制的问题了。
好了,看下结果吧。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值