itchatmp | 基于python微信公眾號(hào)接口

針對(duì)微信公眾平臺(tái)精算,圖形界面操作存在的許多功能限制伯病,在開發(fā)者中心設(shè)置回調(diào)URL和Token线欲,可以更加靈活地?cái)U(kuò)展各項(xiàng)功能明场。對(duì)于具備開發(fā)能力的人員奕巍,同時(shí)擁有一臺(tái)可供轉(zhuǎn)發(fā)消息的服務(wù)器鸽扁,itchatmp可以提供強(qiáng)大的技術(shù)支持框舔。

開發(fā)前準(zhǔn)備:

  1. Python版本:2.7礼患,3.5
  2. 供轉(zhuǎn)發(fā)的服務(wù)器
  3. 微信公眾平臺(tái)賬號(hào)

搭建web服務(wù)

Python Web框架有許多,最流行的如Django堡牡,F(xiàn)lask怠噪,WSGI等癌佩。這里重點(diǎn)推薦一個(gè)開源的微信公眾號(hào)接口itchatmp嗜憔。它將公眾號(hào)許多功能接口都整合到了代碼里秃励,開發(fā)者無需自行構(gòu)造請(qǐng)求訪問鏈接,簡(jiǎn)單易上手吉捶。

1. 安裝itchatmp

pip install itchatmp

注意:itchat基于tornado框架夺鲜,本人在python3.5版本安裝過程中,發(fā)現(xiàn)高版本的tornado(5.0以上)有許多兼容問題呐舔。如執(zhí)行import itchatmp時(shí)币励,發(fā)生RuntimeError: There is no current event loop in thread 'Thread-1';在接受圖片消息時(shí)珊拼,set_event_loop無法建立事件循環(huán)等食呻。

解決辦法:安裝較低版本的tornado。

pip uninstall tornado
pip install tornado==4.5.3

# 安裝futures庫(kù)報(bào)錯(cuò)
pip install futures==3.1.1

2. 設(shè)置自動(dòng)回復(fù)

  • 處理文本消息
def getBasicInfo(msg):
    date = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime(int(msg['CreateTime'])))   # 接收消息的時(shí)間
    user = msg['FromUserName']   # 關(guān)注用戶的OpenId澎现,同一個(gè)公眾號(hào)所有關(guān)注者都是唯一的
    return date, user

@itchatmp.msg_register(TEXT)
def text_reply(msg):
    content = msg['Content']

    date, user = getBasicInfo(msg)
    save_path = SAVE_PATH + TEXT_PATH + user + '.txt'  # 使用OpenID來保存不同用戶的消息記錄

    if not os.path.exists(save_path):
        with open(save_path,'w',encoding='utf-8') as file:
            file.write(date + " --- " + content + "\n")
    else:
        with open(save_path,'a',encoding='utf-8') as file:
            file.write(date + " --- " + content + "\n")

    return "消息保存成功"  # 去掉return語(yǔ)句時(shí)仅胞,表示不回復(fù)內(nèi)容

保存結(jié)果:


  • 處理多媒體消息

多媒體消息,包括圖片昔头,語(yǔ)音饼问,視頻,小視頻等揭斧,這類消息的共同點(diǎn)是,返回參數(shù)中都帶有MediaId峻堰。MediaId是消息媒體id讹开,可以使用該參數(shù),通過調(diào)用獲取臨時(shí)素材接口下載數(shù)據(jù)捐名。

@itchatmp.msg_register([IMAGE, VIDEO, SHORT_VIDEO, VOICE])
def media_reply(msg):
    date, user = getBasicInfo(msg)
    pathSymbol = {
        IMAGE: IMAGE_PATH,
        VIDEO: VIDEO_PATH,
        SHORT_VIDEO: SHORT_VIDEO_PATH,
        VOICE: VOICE_PATH
    }.get(msg["MsgType"])  # 通過判斷消息類型旦万,獲取媒體信息相應(yīng)的保存路徑
   
    r = itchatmp.messages.download(msg["MediaId"])
    filename = date + ' '+ user + os.path.splitext(r.get('FileName', 'myfile'))[1]  # 命名規(guī)則:時(shí)間 + OpenId +文件后綴名
    if 'File' in r:
        with open(SAVE_PATH + pathSymbol + filename, 'wb') as f:
            f.write(r['File'].getvalue())  # 保存數(shù)據(jù)到本地
    else:
        print(r)

微信公眾平臺(tái)上多媒體消息最多只能保存3天,上述代碼可以實(shí)時(shí)地將所有信息镶蹋,按照相應(yīng)的格式(jpg成艘,mp4赏半,amr等)永久保存在本地。

  • 其它消息

其它消息類型淆两,可以參考微信工作平臺(tái)技術(shù)文檔断箫,里面列舉了不同消息參數(shù)的格式,根據(jù)需要自定義回復(fù)內(nèi)容秋冰。

@itchatmp.msg_register(LOCATION)
def location_reply(msg):
    lat = msg['Location_X']
    lon = msg['Location_Y']
    label = msg['Label']

    return str(label) + '\n' + '經(jīng)度:' + lat + '\n' + '緯度:' + lon

例如對(duì)收到的地理位置消息仲义,可以自動(dòng)回復(fù)該位置的名稱,經(jīng)緯度信息剑勾。


3. 一個(gè)簡(jiǎn)單的例子

import itchatmp

itchatmp.update_config(itchatmp.WechatConfig(
    token='yourToken', 
    appId = 'yourAppId',
    appSecret = 'yourAppSecret'))

@itchatmp.msg_register(itchatmp.content.TEXT)
def text_reply(msg):
    return msg['Content']

itchatmp.run()

此處的appId埃撵,appSecret分別為開發(fā)者ID,開發(fā)者密碼虽另,可以在微信工作平臺(tái)查看暂刘,見下一步。token用于驗(yàn)證開發(fā)者服務(wù)器捂刺,由開發(fā)者隨機(jī)設(shè)置(3-32字符)谣拣。

在服務(wù)器上運(yùn)行該程序(默認(rèn)開啟80端口),外網(wǎng)訪問出現(xiàn)以下語(yǔ)句時(shí)叠萍,表示服務(wù)開啟成功芝发。


服務(wù)器配置

1. 開發(fā)者ID(AppID),開發(fā)者密碼(AppSecret)苛谷,IP白名單

公眾號(hào)開發(fā)信息
  • 開發(fā)者ID可以在微信公眾平臺(tái) - 開發(fā) - 基本配置 - 公眾號(hào)開發(fā)信息中查看辅鲸。
  • 開發(fā)者密碼是校驗(yàn)公眾號(hào)開發(fā)者身份的密碼,公眾平臺(tái)不會(huì)單獨(dú)儲(chǔ)存AppSecret腹殿,因此在初次設(shè)置后需要另行保存独悴。
  • 將提供轉(zhuǎn)發(fā)的服務(wù)器地址添加到IP白名單中。

2. 配置服務(wù)器

填寫服務(wù)器配置
  • URL填寫服務(wù)器地址锣尉,http協(xié)議必須使用80端口刻炒。
  • 將開啟web服務(wù)代碼中設(shè)置的token填到這里。
  • 點(diǎn)擊隨機(jī)生成EncodingAESKey自沧。
  • 個(gè)人訂閱號(hào)坟奥,消息加解密方式可以選擇明文模式。

在提交服務(wù)器配置信息時(shí)拇厢,會(huì)進(jìn)行token驗(yàn)證爱谁。因此提交前確保在服務(wù)器上已經(jīng)搭建好web服務(wù),并且成功運(yùn)行孝偎,否則會(huì)出現(xiàn)請(qǐng)求URL超時(shí)提示访敌。

關(guān)于接口權(quán)限

針對(duì)個(gè)人未認(rèn)證訂閱號(hào),可以使用的接口主要有:

  • 接收消息(所有類型消息)
  • 發(fā)送消息(僅僅支持自動(dòng)回復(fù))
  • 永久素材的管理(上傳衣盾,修改寺旺,刪除)
  • 其它圖像爷抓、音頻接口,界面操作等

在開發(fā)者中心開啟了回調(diào)URL和Token后阻塑,公眾平臺(tái)設(shè)置的自動(dòng)回復(fù)蓝撇、自定義菜單等功能都將失效并且停用。而個(gè)人訂閱號(hào)不具備自定義菜單接口權(quán)限叮姑,因此在改用開發(fā)者模式后唉地,可能會(huì)丟失平臺(tái)上設(shè)置的自定義菜單信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末传透,一起剝皮案震驚了整個(gè)濱河市耘沼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朱盐,老刑警劉巖群嗤,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兵琳,居然都是意外死亡狂秘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門躯肌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來者春,“玉大人,你說我怎么就攤上這事清女∏蹋” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嫡丙,是天一觀的道長(zhǎng)拴袭。 經(jīng)常有香客問我,道長(zhǎng)曙博,這世上最難降的妖魔是什么拥刻? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮父泳,結(jié)果婚禮上般哼,老公的妹妹穿的比我還像新娘。我一直安慰自己惠窄,他們只是感情好逝她,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睬捶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪近刘。 梳的紋絲不亂的頭發(fā)上擒贸,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天臀晃,我揣著相機(jī)與錄音,去河邊找鬼介劫。 笑死徽惋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的座韵。 我是一名探鬼主播险绘,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼誉碴!你這毒婦竟也來了宦棺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤黔帕,失蹤者是張志新(化名)和其女友劉穎代咸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體成黄,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呐芥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奋岁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片思瘟。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖闻伶,靈堂內(nèi)的尸體忽然破棺而出滨攻,到底是詐尸還是另有隱情,我是刑警寧澤虾攻,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布铡买,位于F島的核電站,受9級(jí)特大地震影響霎箍,放射性物質(zhì)發(fā)生泄漏奇钞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一漂坏、第九天 我趴在偏房一處隱蔽的房頂上張望景埃。 院中可真熱鬧,春花似錦顶别、人聲如沸谷徙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)完慧。三九已至,卻和暖如春剩失,著一層夾襖步出監(jiān)牢的瞬間屈尼,已是汗流浹背册着。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脾歧,地道東北人甲捏。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鞭执,于是被迫代替她去往敵國(guó)和親司顿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容