久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

微信公眾平臺(tái)技術(shù)實(shí)操(11):公眾賬號(hào)接收非文字消息

 antibobo 2014-12-30

用戶都是用使用文字在進(jìn)行交互的,,但是有時(shí)候使用圖片,、語(yǔ)音、視頻以及地理位置等可以實(shí)現(xiàn)一些非常棒的功能,,比如“語(yǔ)音提醒”公眾號(hào)里的發(fā)送語(yǔ)音就可以實(shí)現(xiàn)定時(shí)的事件提醒功能,;比如ZTalk曾經(jīng)搞過(guò)微信拍照曬電腦桌面的活動(dòng)(響應(yīng)的人太少,,桑心……);比如一些預(yù)定本地化服務(wù)的公眾號(hào)里發(fā)送當(dāng)前地理位置就可以查詢周邊商家,。

要實(shí)現(xiàn)這些功能首先得學(xué)會(huì)接收這些消息類型,,比文字消息類型肯定要復(fù)雜很多了,目前我們能夠接收的消息類型只有圖片,、地理位置以及退訂消息,,其他的如鏈接消息、語(yǔ)音消息是需要官方授權(quán)的,。接收到用戶消息以后回復(fù)的消息類型可以參考第11章,,目前也就那三種。

一,、圖片消息接收

相信拍照是目前智能手機(jī)用戶用得最多的功能沒(méi)有之一,,在微信里也是一樣,看看每天朋友圈里分享的那些照片就知道了,,那么如何接收和保存用戶照片捏,,首先我們得了解用戶發(fā)送的圖片消息結(jié)構(gòu),如下圖:

大家可以看到圖片消息除了固定的消息發(fā)送用戶ID,、接收公眾號(hào)ID,、生成時(shí)間等固定字段外,多了一個(gè)圖片鏈接PicUrl,,這個(gè)就是用戶向公眾賬號(hào)發(fā)送圖片后,,保存到微信的服務(wù)器上返回給公眾號(hào)的鏈接,該圖片鏈接格式如下:

也就是說(shuō)我們?nèi)绻褕D片保存到本地服務(wù)器,,就要先將圖片從微信服務(wù)器上抓取下來(lái),,當(dāng)然你也可以直接保存這個(gè)鏈接以后直接訪問(wèn),這個(gè)看具體應(yīng)用了,。今天要講的是圖片保存到本地服務(wù)器上,,請(qǐng)看下面代碼:

由于圖片消息是另一種消息類型,因此代碼添加位置可以位于文字消息上面或者下面,,只要?jiǎng)e在文字消息的判斷語(yǔ)句內(nèi)就行,。然后我來(lái)解釋下每個(gè)語(yǔ)句的作用:

第20行,判斷消息類型是否為圖片消息,,條件為$form_MsgType==image;

第24行,,獲取圖片消息數(shù)據(jù)中的圖片鏈接并賦值給$from_PicUrl;

第26行,生成要保存到本地服務(wù)器的圖片名稱,,為了避免重復(fù)新圖片命名使用了發(fā)送用戶的OPENID+當(dāng)前時(shí)間戳,,文件的后綴名我是直接設(shè)定為jpg文件。(由于從圖片鏈接上無(wú)法獲取到圖片后綴名,又懶得通過(guò)頭文件獲取圖片格式,,就直接固定死了JPG格式,,貌似沒(méi)有什么問(wèn)題,哈哈哈),;

第28行,,SAE上的內(nèi)置接口類很多,SaeFetchurl是一個(gè)用來(lái)抓取遠(yuǎn)程網(wǎng)頁(yè)的類,,使用這個(gè)類就可以很方便的實(shí)現(xiàn)抓取其他網(wǎng)站的內(nèi)容,,否則使用PHP的curl或者file_get_contents這些估計(jì)還得解釋半天,這句代碼是新建一個(gè)抓取類的對(duì)象,。

第30行,,執(zhí)行抓取圖片鏈接,其中抓取的函數(shù)是fetch(),,圖片鏈接是之前賦值的$from_PicUrl,抓取后的結(jié)果賦值給$res;

第32行,,判斷抓取結(jié)果,,errno()返回的是抓取結(jié)束后的錯(cuò)誤代碼,如果為0則成功,,其他的就是不成功,。

第35行,圖片抓取成功后,,新建一個(gè)Storage的對(duì)象,,我們要保存圖片了。

第37行,,這句代碼其實(shí)已經(jīng)在以前出現(xiàn)多次,,這次將抓取的內(nèi)容($res)寫入指定的文件($filename),并保存到Storage里,請(qǐng)注意把“weixincourse”替換成自己創(chuàng)建的Storage空間名,。

第39行到41行,,保存成功后給用戶提示圖片上傳成功。

第45行到48行,,文件沒(méi)有抓取到提示用戶圖片上傳失敗,。

當(dāng)然我們?nèi)绻麌?yán)謹(jǐn)一點(diǎn),還要判斷圖片文件是否保存成功,,可以把第37行后面改寫一下,,如下圖:

大家可以嘗試把Storage的空間名字故意寫錯(cuò),看看會(huì)有什么樣的提示,。如果提示上傳成功,,我們到SAE的Storage列表里就應(yīng)該可以看到剛上傳的文件了。

二、地理位置消息接收

手機(jī)上基于地理位置的APP很多,,是個(gè)應(yīng)用現(xiàn)在都得跟LBS扯上點(diǎn)關(guān)系,,SoLoMo里重要的一環(huán)就是地理位置,微信里也有很多應(yīng)用是跟地理位置相關(guān)的,,比如查個(gè)本地天氣,、附近酒店餐館啥的。今天舉的例子是查本地天氣,。先了解下地理位置消息的結(jié)構(gòu),,如下圖:

地理位置消息多了四項(xiàng),分別是經(jīng)緯度的X和Y坐標(biāo),、地圖縮放比例以及地址信息,,而實(shí)際上由于網(wǎng)絡(luò)原因我們經(jīng)常是收不到地址信息的,只有坐標(biāo)信息,,因此地理位置的開發(fā)基本圍繞著坐標(biāo)來(lái),。先來(lái)看本地天氣查詢代碼吧,如下圖:

代碼添加位置同圖片消息,,另起一個(gè)消息類型判斷語(yǔ)句,,可以放在圖片消息前面或者后面。前面說(shuō)了我們主要使用的是經(jīng)緯度,,經(jīng)緯度是可以通過(guò)一些地圖api接口來(lái)獲取實(shí)際地址,、周邊商家等信息的,天氣代碼這里我用的是百度地圖API接口,,主要是因?yàn)樗蠻RL接口,,代碼解釋開始:

第21行,消息類型判斷語(yǔ)句,,消息類型為location,;

第24行到27行,將用戶推送地理消息的經(jīng)緯度,、地圖比例,、地址信息分別賦值。經(jīng)緯度分別為L(zhǎng)ocation_X和Location_Y,,相當(dāng)于用經(jīng)線和緯線的交叉點(diǎn)來(lái)標(biāo)注地理位置,。Scale是用戶發(fā)送地理位置時(shí)地圖的縮放比例。Label是地址信息(經(jīng)常是獲取不到的,,獲取了也沒(méi)啥用,,因?yàn)槎际沁B在一起的,無(wú)法提取地市縣信息),。

第29行,,定義百度地圖API接口的反向地址解析URL,,反向地址解析是指通過(guò)經(jīng)緯度獲取當(dāng)前位置的地址信息。

第31行,,由于各家地圖不一樣因此傳輸過(guò)來(lái)的經(jīng)緯度也會(huì)有所偏差,,這里我選的是wgs84即手機(jī)GPS的坐標(biāo)。

第33行,,又要抓頁(yè)面了,,先建個(gè)抓取類的對(duì)象。

第35行,,百度地圖API接口的反向地址解析規(guī)則是URL+坐標(biāo)類型+坐標(biāo)值,,其中$map_api_url.$map_coord_type兩個(gè)變量拼接就是URL+坐標(biāo)類型,然后再加上經(jīng)緯度參數(shù),,用location=經(jīng)度,緯度來(lái)賦值,。

這里說(shuō)下URL的規(guī)則,URL就是大家??吹降木W(wǎng)頁(yè)鏈接,,一般由HTTP://后面加網(wǎng)址加參數(shù)組成,主要說(shuō)下參數(shù),,參數(shù)一般是“參數(shù)名=賦值”組成,,普通的URL參數(shù)格式是跟在網(wǎng)址后面第一個(gè)參數(shù)前用“?”號(hào)分隔,,第二個(gè)參數(shù)開始用“&”分隔,,參數(shù)在程序里是可以獲取到的,,我們上面獲取坐標(biāo)解析的實(shí)際地址形式為:

接收的實(shí)際地址為http://api.map.baidu.com/geocoder,,獲取到的參數(shù)是coord_type和location,值為相應(yīng)后面跟著的,。

第37行,,判斷是否抓取成功,如果抓取成功$geocoder的數(shù)據(jù)實(shí)際是如下格式:

這里一大堆信息里只需要提取城市,,即CITY這個(gè)標(biāo)簽內(nèi)的數(shù)據(jù),。

第40行,這是一個(gè)正則表達(dá)式,,比較復(fù)雜,,作用就是根據(jù)規(guī)則將$geocoder里的北京市數(shù)據(jù)提取出來(lái)賦予$city這個(gè)變量,如果成功這個(gè)數(shù)據(jù)是會(huì)是一個(gè)多維數(shù)組,,其中city標(biāo)簽內(nèi)的數(shù)據(jù)即北京市是存儲(chǔ)在$city[1][0]里的,,$city[0][0]的值是“北京市”;

第41行,,將$city[1][0]的值即“北京市”提取出來(lái),,同時(shí)使用str_replace函數(shù)將“市”替換掉再重新賦值給$city,str_replace按照字面意思就是字符串替換,用法是:str_replace(要替換的內(nèi)容,替換成的內(nèi)容,字符串);其中替換的內(nèi)容和替換成的內(nèi)容可以使用數(shù)組,,也可以使用單個(gè)字符串,,我這里是用了數(shù)組,即將市縣區(qū)都替換成了空,,替換的用處是因?yàn)楹竺娌樘鞖忸A(yù)報(bào)的接口只支持城市名稱,,不能有市縣區(qū)啥的……經(jīng)過(guò)這一步$city的值就是“北京”;

第43行,,定義天氣API接口的URL,;

第45行,做了三件事,,第一個(gè)使用iconv()函數(shù)將$city的字符編碼從UTF-8轉(zhuǎn)換成GBK,,第二件是使用urlencode將漢字轉(zhuǎn)換成英文編碼方便URL傳值,第三件是將URL中的“&city=”的參數(shù)名拼接了,。

關(guān)于字符,,有時(shí)候我們上網(wǎng)的時(shí)候會(huì)發(fā)現(xiàn)網(wǎng)頁(yè)有亂碼,大部分是因?yàn)樽址幋a不對(duì)造成的,,可以調(diào)節(jié)瀏覽器的編碼來(lái)切換,,在程序里也是一樣,由于新浪接口接收的字符串是GBK的,,而我們程序里使用UTF-8,,所以需要轉(zhuǎn)碼后才能通訊,否則新浪接口收到的就是亂碼,。

PS:GBK或者GB2312是中文簡(jiǎn)體編碼,,屬于ANSI編碼,但是同個(gè)ANSI編碼值在不同國(guó)家的編碼對(duì)應(yīng)是不同的文字,,會(huì)非?;靵y,所以有了Unicode以及UTF-8,,這是國(guó)際通用的文字編碼格式,,所有文字都被分配了不同的編碼,也就不怕亂碼了,。

第46行,,查詢天氣日期,0表示當(dāng)天,,1表示明天,,以此類推……

第49行,抓取天氣內(nèi)容并賦值給$weather,,這里不需要再建立抓取類的對(duì)象了,,因?yàn)橹耙呀?jīng)建立了可以直接用,。

第51行,判斷是否抓到天氣,,這里我多加了一個(gè)

strstr函數(shù)是用來(lái)檢查$weather里是否存在“Weather”這個(gè)字符串,,&&表示并且,這里的判斷就是不僅要抓取成功并且在抓取到的內(nèi)容里存在“Weather”,。這樣寫的目的是因?yàn)樾吕颂鞖饨涌诓还苡袥](méi)有查詢到天氣都會(huì)返回?cái)?shù)據(jù),,而判斷數(shù)據(jù)里是否有天氣信息,只有判斷返回內(nèi)容里有木有“Weather”這個(gè)字符串,。成功抓取到的會(huì)是如下內(nèi)容:

這又是一個(gè)XML,,然后用的是一些拼音首字母做了標(biāo)簽,把這個(gè)回復(fù)給用戶估計(jì)會(huì)瘋的,,我們要進(jìn)行一些整理,,方法嘛就是用正則表達(dá)式來(lái)提取我們需要的內(nèi)容,我這里提取的標(biāo)簽是city(城市),、status2-status1(天氣變化),、temperature2-temperature1(溫度變化)、direction2-power2(風(fēng)向風(fēng)力),、chy_shuoming(穿著建議),、savedate_weather(信息發(fā)布時(shí)間)

第54行到62行就是提取這些數(shù)據(jù)的正則表達(dá)式,可以發(fā)現(xiàn)其實(shí)改動(dòng)的只是標(biāo)簽名和賦值的參數(shù),,如果大家還想加寫數(shù)據(jù)的可以參照著提?。?/font>

第64行到71行判斷天氣變化是否相同,,比如上面顯示的天氣1和天氣2其實(shí)都是陰,,如果不做判斷就會(huì)返回給用戶“陰轉(zhuǎn)陰”,非常2,,所以這里判斷如果兩個(gè)天氣是一致的則將任意一個(gè)天氣賦值給$w_status變量,,否則就按照天氣2轉(zhuǎn)天氣1賦值給$w_status變量,,最后輸出時(shí)用$w_status這個(gè)變量,。

第73行到81行新建一個(gè)數(shù)組,將前面獲取到的天氣數(shù)據(jù)添加為數(shù)組元素,,格式就是$weather_res=array();然后在括號(hào)里用逗號(hào)分割每個(gè)天氣數(shù)據(jù),,最后一個(gè)后面不要加逗號(hào),這樣做的好處是避免代碼行過(guò)長(zhǎng),,而且很清晰,。

第82行,將數(shù)組用implode()函數(shù)轉(zhuǎn)化成數(shù)組,,用””這個(gè)換行符來(lái)分割,。

其實(shí)73到82行完成的就是將所有數(shù)據(jù)拼接成一個(gè)字符串,,使用“.”一個(gè)個(gè)拼也可以,不過(guò)效率低下而且代碼也不夠清晰,。

全部拼接完成就可以輸出了,,在手機(jī)上效果如下:

后面的就不詳細(xì)說(shuō)了,都有標(biāo)注,,都是些判斷提示語(yǔ)句,,大家可以自己學(xué)著看,不懂的可以直接在后臺(tái)問(wèn),。另外強(qiáng)調(diào)一點(diǎn),,一般天氣預(yù)報(bào)是拿中國(guó)天氣網(wǎng)接口做的會(huì)比這個(gè)更好,能夠顯示縣區(qū)級(jí)的天氣,,但是需要搞個(gè)城市代碼表,,留到以后說(shuō)吧,新浪的接口可以直接用城市名查就先演示下,。

三,、退訂消息接收

不知道還有多少人記得我曾寫過(guò)一篇《那些離開的朋友們》,是因?yàn)槲⑿虐淹擞喯⒔涌陂_了,,每天看到不少人退訂心里有點(diǎn)小難過(guò)寫的,,到今天我看了下差不多有2000個(gè)退訂用戶了,估計(jì)是我現(xiàn)在寫的東西不合他們胃口,。

退訂消息接口的代碼很簡(jiǎn)單,,跟用戶訂閱一樣是一個(gè)事件類型的消息,只是事件類型的標(biāo)示是”unsubscribe“,,退訂用戶最好是配合數(shù)據(jù)庫(kù)來(lái)記錄,,我這里給大家的是一個(gè)保存成文件的例子,如下圖:

代碼添加的位置請(qǐng)看仔細(xì)了,,在事件消息判斷里的獲取事件類型之后,。代碼很短,解釋如下:

第300行,,判斷事件類型標(biāo)示是否為”unsubscribe“,,大家可以看下訂閱消息是”subscribe“;

第303行,,新建一個(gè)Storage的對(duì)象,;

第305行,寫入文件,,文件名為退訂用戶的OPENID,,文件后綴是.txt,內(nèi)容我用了退訂時(shí)間,。

當(dāng)用戶退訂后在Storage的存儲(chǔ)空間里就會(huì)有一個(gè)文件生成,。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多