微信大众,平台开辟(五) 天气预告功能开辟

    添加时间:2013-7-12 点击量:

    一、简介


    前面几篇文章对微信大众,平台的开通及简单应用做了简单的介绍,但都没有涉及到实际应用中的题目,例如天气查询,公交查询,快递查询等。接下来的几篇文章将对实际生活生计中会经常应用到的一些功能进行开辟讲解,以供读者参考。


    这一篇文章将对大师天天都邑关怀的天气查询进行开辟,例如,用户发送消息 “姑苏天气”,则会返回姑苏及时天气状况,以及将来两天甚至将来五天的天气状况。


    二、思路解析


    起首要对用户发送过来的消息进行断定,断定消息里是否含有“天气”关键字,若是含有,则须要持续提取地区信息,然后再经由过程中国天气网(http://www.weather.com.cn)供给的开放API进行相干地区天气查询。


    三、关键字断定与地区读取


    用户发送过来查询天气的消息的格局是固定好的,即 “地区+天气”,所以起首截取后两个字,断定是否为 “天气” 关键字。


    应用php函数 mb_substr() 截取,关于该函数的用法:



    mb_substr — 获取字符串的项目组
    

      
    string mb_substr ( string ¥str , int ¥start [, int ¥length [, string ¥encoding ]] )

    申明:按照字符数履行一个多字节安然的
    substr() 操纵。 地位是从 str 的开端地位进行计数。 第一个字符的地位是 0。第二个字符的地位是 1,以此类推。

    参数:
    str
    从该
    string 中提取子字符串。

    start
    str 中要应用的第一个字符的地位。
    正数 -> 从字符串开首指定地位开端;
    负数 -> 从字符串结尾指定地位开端;

    length
    str 中要应用的最大字符数。
    正数 -> 从 start
    处开端最多包含 length 个字符;
    负数 -> string 末尾处的 length 个字符将会被漏掉(若 start 是负数则从字符串开首算起)。

    encoding
    encoding 参数为字符编码。若是省略,则应用内部字符编码。

    返回值:
    mb_substr() 函数按照 start 和 length 参数返回 str 中指定的项目组。


    ¥str = mb_substr(¥keyword,-2,2,UTF-8);


    从消息的结尾数第二个字符开端截取,截取两个字符,然后加以断定是否为 “天气” 关键字。


    下面进行地区提取,还是应用 mb_substr() 函数。


    ¥str_key = mb_substr(¥keyword,0,-2,UTF-8);


    从消息的开首开端,截掉末尾的两个字符(天气),既得地区关键字。


    然掉队行断定,继而调用函数查询天气数据。



    if¥str == 天气 && !empty(¥str_key)
    {
    //调用函数查询天气数据
    }


    四、调用 weather() 函数查询


    我们这里调用的是中国国度景象形象局供给的天气预告API接口,接口地址:http://m.weather.com.cn/data/101190401.html


    URL中的数字指代城市的编号101190401(姑苏),其他城市对应关系将鄙人面供给。


    该接口返回信息斗劲周全,也是以json格局供给,格局如下:



    {weatherinfo:{
    //根蒂根基信息;
    city:姑苏,city_en:suzhou,
    date_y:2013年7月9日,date:,week:礼拜二,fchh:18,cityid:101190401,
    //摄氏温度
    temp1:30℃~37℃,
    temp2:30℃~37℃,
    temp3:29℃~35℃,
    temp4:27℃~33℃,
    temp5:27℃~31℃,
    temp6:27℃~35℃,
    //华氏温度;
    tempF1:86℉~98.6℉,
    tempF2:86℉~98.6℉,
    tempF3:84.2℉~95℉,
    tempF4:80.6℉~91.4℉,
    tempF5:80.6℉~87.8℉,
    tempF6:80.6℉~95℉,
    //天气描述;
    weather1:晴转多云,
    weather2:晴转多云,
    weather3:晴转多云,
    weather4:多云,
    weather5:雷阵雨转中雨,
    weather6:雷阵雨转多云,
    //天气描述序号
    img1:0,
    img2:1,
    img3:0,
    img4:1,
    img5:0,
    img6:1,
    img7:1,
    img8:99,
    img9:4,
    img10:8,
    img11:4,
    img12:1,
    //名称;
    img_single:1,
    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:西南风3-4级,
    wind2:西南风3-4级,
    wind3:东南风3-4级,
    wind4:东南风3-4级转4-5级,
    wind5:东南风4-5级转西南风3-4级,
    wind6:西南风3-4级转4-5级,
    //风速级别描述
    fx1:西南风,
    fx2:西南风,
    fl1:3-4级,
    fl2:3-4级,
    fl3:3-4级,
    fl4:3-4级转4-5级,
    fl5:4-5级转3-4级,
    fl6:3-4级转4-5级,
    //本日穿衣指数;
    index:炎热,
    index_d:天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清冷夏季服装。,
    //48小时穿衣指数
    index48:炎热,
    index48_d:天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清冷夏季服装。,
    //紫外线及48小时紫外线
    index_uv:中等,
    index48_uv:中等,
    //洗车指数
    index_xc:合适,
    //旅游指数
    index_tr:较不宜,
    //舒适指数
    index_co:很不舒适,
    st1:36,
    st2:28,
    st3:36,
    st4:28,
    st5:34,
    st6:27,
    //晨练指数
    index_cl:较合适,
    //晾晒指数
    index_ls:合适,
    //过敏指数
    index_ag:不易发}}


    我们可以经由过程解析JSON,获取响应城市的天气数据。


    weather() 函数如下:



    private function weather(¥n){
    
    include(weather_cityId.php);
    ¥c_name=¥weather_cityId[¥n];
    if(!empty¥c_name)){
    ¥json=file_get_contents(http://m.weather.com.cn/data/.¥c_name..html);
    return json_decode(¥json);
    }
    else {
    return null;
    }
    }


    这里include 了一个城市对应关系文件 weather_cityId.php,格局如下:



    <?php
    
    ¥weather_cityId = array(北京=>101010100,上海=>101020100,姑苏=>101190401);
    ?>


    按照传入的城市名,获得城市代码,若是不为空,则调用中国天气网的API进行查询,返回json格局的数据,然掉队行解析并返回数据,若是为空,则返回null值。


    五、组织答复消息情势


    断定返回数据是否为空,若为空,则 ¥contentStr = 抱愧,没有查到\.¥str_key.\的天气信息!;


    若返回数据不为空,则:



    ¥contentStr = 【.¥data->weatherinfo->city.天气预告】\n.¥data->weatherinfo->date_y. .¥data->weatherinfo->fchh.时公布.\n\n及时天气\n.¥data->weatherinfo->weather1. .¥data->weatherinfo->temp1. .¥data->weatherinfo->wind1.\n\n温馨提示:.¥data->weatherinfo->index_d.\n\n明天\n.¥data->weatherinfo->weather2. .¥data->weatherinfo->temp2. .¥data->weatherinfo->wind2.\n\n后天\n.¥data->weatherinfo->weather3. .¥data->weatherinfo->temp3. .¥data->weatherinfo->wind3;


    申明:


    ¥data->weatherinfo->city  //获取城市名,这里为姑苏


    ¥data->weatherinfo->date_y  //获取日期,这里为2013年7月9日


    ¥data->weatherinfo->fchh  //数据公布时候


    ¥data->weatherinfo->weather1  //及时天气


    ¥data->weatherinfo->temp1  //及时温度


    ¥data->weatherinfo->wind1  //及时风向和风速


    ¥data->weatherinfo->index_d  //穿衣指数


    weather2, temp2, wind2 分别代表了明天的天气,温度和风向风速,其他的以此类推。


    \n  //默示换行


    六、测试



    七、完全代码



    <?php
    
    /
    wechat php test
    /

    //define your token
    define(TOKEN, zhuojin);
    ¥wechatObj = new wechatCallbackapiTest();
    ¥wechatObj->responseMsg();
    //¥wechatObj->valid();

    class wechatCallbackapiTest
    {
    /public function valid()
    {
    ¥echoStr = ¥_GET[echostr];

    //valid signature , option
    if(¥this->checkSignature()){
    echo ¥echoStr;
    exit;
    }
    }
    /

    public function responseMsg()
    {
    //get post data, May be due to the different environments
    ¥postStr = ¥GLOBALS[HTTP_RAW_POST_DATA];

    //extract post data
    if (!empty¥postStr)){

    ¥postObj = simplexml_load_string¥postStr, SimpleXMLElement, LIBXML_NOCDATA);
    ¥RX_TYPE = trim¥postObj->MsgType);

    switch¥RX_TYPE
    {
    case text:
    ¥resultStr = ¥this->handleText(¥postObj);
    break;
    case event:
    ¥resultStr = ¥this->handleEvent(¥postObj);
    break;
    default:
    ¥resultStr = Unknow msg type: .¥RX_TYPE;
    break;
    }
    echo ¥resultStr;
    }
    else {
    echo ;
    exit;
    }
    }

    public function handleText(¥postObj
    {
    ¥Username = ¥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>
    ;
    if(!empty¥keyword ))
    {
    ¥msgType = text;

    //天气
    ¥str = mb_substr(¥keyword,-2,2,UTF-8);
    ¥str_key = mb_substr(¥keyword,0,-2,UTF-8);
    if¥str == 天气 && !empty¥str_key)){
    ¥data = ¥this->weather(¥str_key);
    ifempty¥data->weatherinfo)){
    ¥contentStr = 抱愧,没有查到\.¥str_key.\的天气信息!;
    }
    else {
    ¥contentStr = 【.¥data->weatherinfo->city.天气预告】\n.¥data->weatherinfo->date_y. .¥data->weatherinfo->fchh.时公布.\n\n及时天气\n.¥data->weatherinfo->weather1. .¥data->weatherinfo->temp1. .¥data->weatherinfo->wind1.\n\n温馨提示:.¥data->weatherinfo->index_d.\n\n明天\n.¥data->weatherinfo->weather2. .¥data->weatherinfo->temp2. .¥data->weatherinfo->wind2.\n\n后天\n.¥data->weatherinfo->weather3. .¥data->weatherinfo->temp3. .¥data->weatherinfo->wind3;
    }
    }
    else {
    ¥contentStr = 感激您存眷【卓锦姑苏】.\n.微旌旗灯号:zhuojinsz.\n.杰出秀丽,名城姑苏,我们为您供给姑苏本地生活生计指南,姑苏相干信息查询,做好的姑苏微信平台。.\n.今朝平台功能如下:.\n.【1】 查天气,如输入:姑苏天气.\n.【2】 查公交,如输入:姑苏公交178.\n.【3】 翻译,如输入:翻译I love you.\n.【4】 姑苏信息查询,如输入:姑苏观前街.\n.更多内容,敬请等待...;
    }
    ¥resultStr = sprintf¥textTpl¥Username¥toUsername¥time¥msgType¥contentStr);
    echo ¥resultStr;
    }
    else{
    echo Input something...;
    }
    }

    public function handleEvent(¥object
    {
    ¥contentStr = ;
    switch¥object->Event)
    {
    case subscribe:
    ¥contentStr = 感激您存眷【卓锦姑苏】.\n.微旌旗灯号:zhuojinsz.\n.杰出秀丽,名城姑苏,我们为您供给姑苏本地生活生计指南,姑苏相干信息查询,做好的姑苏微信平台。.\n.今朝平台功能如下:.\n.【1】 查天气,如输入:姑苏天气.\n.【2】 查公交,如输入:姑苏公交178.\n.【3】 翻译,如输入:翻译I love you.\n.【4】 姑苏信息查询,如输入:姑苏观前街.\n.更多内容,敬请等待...;
    break;
    default :
    ¥contentStr = Unknow Event: .¥object->Event;
    break;
    }
    ¥resultStr = ¥this->responseText(¥object¥contentStr);
    return ¥resultStr;
    }

    public function responseText(¥object¥content¥flag=0
    {
    ¥textTpl = <xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>%d</FuncFlag>
    </xml>
    ;
    ¥resultStr = sprintf¥textTpl¥object->FromUserName, ¥object->ToUserName, time(), ¥content¥flag);
    return ¥resultStr;
    }

    private function weather(¥n){
    include(weather_cityId.php);
    ¥c_name=¥weather_cityId[¥n];
    if(!empty¥c_name)){
    ¥json=file_get_contents(http://m.weather.com.cn/data/.¥c_name..html);
    return json_decode(¥json);
    }
    else {
    return null;
    }
    }

    private function checkSignature()
    {
    ¥signature = ¥_GET[signature];
    ¥timestamp = ¥_GET[timestamp];
    ¥nonce = ¥_GET[nonce];

    ¥token = TOKEN;
    ¥tmpArr = array¥token¥timestamp¥nonce);
    sort¥tmpArr);
    ¥tmpStr = implode¥tmpArr );
    ¥tmpStr = sha1¥tmpStr );

    if¥tmpStr == ¥signature ){
    return true;
    }
    else{
    return false;
    }
    }
    }

    ?>


    关于城市对应关系文件 weather_cityId.php,今朝更新到了400多个城市,今后还会持续增长,请到QQ群213260412吧。


    八、存眷


    请存眷 卓锦姑苏 微信大众,帐号,卓锦姑苏 基于SAE 平台开辟,针对于主流的微信功能进行开辟测试。


    您可以存眷 卓锦姑苏 大众,帐号进行功能测试,以及获取新的应用开辟。


    1. 登录微信客户端,伴侣们 -> 添加伴侣 -> 搜号码 -> zhuojinsz,查找并存眷。


    2. 扫描二维码:



    卓锦姑苏 功能列表。






    David Camp



    • 技巧交换,请加QQ群:213260412

    • 营业合作,请接洽作者QQ:562866602


    Great People Share Knowledge...

    彼此相爱,却不要让爱成了束缚:不如让它成为涌动的大海,两岸乃是你们的灵魂。互斟满杯,却不要同饮一杯。相赠面包,却不要共食一个。一起歌舞欢喜,却依然各自独立,相互交心,却不是让对方收藏。因为唯有生命之手,方能收容你们的心。站在一起却不要过于靠近。—— 纪伯伦《先知》
    分享到: