前言
前面借用itchat
庫(kù)援所,用簡(jiǎn)短的代碼實(shí)現(xiàn)獲取微信好友信息彼水,其實(shí)微信好友信息模型中信息量很多,演示中只打印出了幾個(gè)常用的字段的值葱她。
今天就來(lái)學(xué)習(xí)一下同樣借用itchat
庫(kù)宋光,用簡(jiǎn)短的代碼來(lái)實(shí)現(xiàn)微信好友消息自動(dòng)回復(fù)的功能貌矿。
微信好友模型
在微信好友模型中,信息量很多罪佳。但要知道逛漫,標(biāo)識(shí)好友唯一性的是UserName
字段,效用就像每個(gè)人的身份證號(hào)一樣赘艳。微信好友間發(fā)消息酌毡,正是通過(guò)該字段發(fā)送的。
微信好友模型:
{'RemarkName': '翠翠姐',
'DisplayName': '',
'AttrStatus': 4357,
'RemarkPYInitial': 'CCJ',
'IsOwner': 0,
'StarFriend': 0,
'PYInitial': 'KYMYT',
'RemarkPYQuanPin': 'cuicuijie',
'HideInputBarFlag': 0,
'KeyWord': '', 'NickName': '快樂(lè)每一天',
'City': '濮陽(yáng)',
'OwnerUin': 0, 'VerifyFlag': 0,
'MemberList': <ContactList: []>,
'EncryChatRoomId': '', 'AppAccountFlag': 0,
'Signature': '走自己的路蕾管,讓別人去說(shuō)吧枷踏!',
'Alias': '', 'ContactFlag': 65539, 'UniFriend': 0,
'SnsFlag': 1, 'PYQuanPin': 'kuaiyuemeiyitian',
'UserName': '@2114996ce5f2106a069c5551eb8793a38f760a201dfb78a48f81956f2ba12b5d',
'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=648544802&username=@2114996ce5f2106a069c5551eb8793a38f760a201dfb78a48f81956f2ba12b5d&skey=@crypt_fb49ed2_90734d134f29dbaad2fff959eaccd7b8',
'ChatRoomId': 0, 'MemberCount': 0, 'Statues': 0,
'Sex': 2,
'Uin': 0,
'Province': '河南'}
用到的庫(kù)和注冊(cè)并獲取圖靈機(jī)器人apiKey
本次演示的功能,需要兩個(gè)庫(kù):itchat掰曾、request
旭蠕,沒(méi)有安裝的請(qǐng)先安裝。
注冊(cè)圖靈機(jī)器人,請(qǐng)移步到官網(wǎng):http://www.tuling123.com/
掏熬,創(chuàng)建完機(jī)器人后佑稠,會(huì)獲取到一個(gè)apiKey。
每一個(gè)激活用戶都可以通過(guò)圖靈機(jī)器人開(kāi)放平臺(tái)獲取多個(gè)APIKEY(當(dāng)前每個(gè)用戶可最多獲取5個(gè)APIKEY)旗芬,用戶可以根據(jù)自己的需要獲取不同的圖靈APIKEY來(lái)應(yīng)用于多種場(chǎng)景舌胶,獲取成功后就等于拿到了開(kāi)啟圖靈服務(wù)的鑰匙。
登入圖靈賬號(hào)疮丛,在機(jī)器人管理列表中即可看到每一個(gè)機(jī)器人的API KEY幔嫂。
我的是apikey:9277c7b4d71845d78fab814a75746117
,你的apiKey肯定和我的不一樣誊薄,你測(cè)試的話履恩,可以暫時(shí)用我的。
開(kāi)發(fā)思路及示例
微信好友消息自動(dòng)回復(fù)功能的實(shí)現(xiàn)思路:
1.登錄微信
2.獲取微信好友發(fā)來(lái)的信息
3.根據(jù)拿到的微信好友發(fā)來(lái)的消息呢蔫,去調(diào)用圖靈機(jī)器人接口似袁,獲取到要自動(dòng)回復(fù)的內(nèi)容。
4.把自動(dòng)回復(fù)的內(nèi)容回復(fù)給微信好友咐刨。
微信好友消息自動(dòng)回復(fù)功能,完整代碼如下:
import itchat
import requests
# 登錄微信
itchat.auto_login(hotReload=True)
# 根據(jù)微信好友發(fā)來(lái)的消息調(diào)用圖靈機(jī)器人接口扬霜,獲取要回復(fù)的內(nèi)容
def get_friend_msg_info(message):
data={
"key": "9277c7b4d71845d78fab814a75746117",
"info": message,
"userid": "robot"
}
# 調(diào)用圖靈機(jī)器人接口
api_url = "http://openapi.tuling123.com/openapi/api"
try:
# 通過(guò)post請(qǐng)求方式調(diào)用接口定鸟,返回結(jié)果是json格式的數(shù)據(jù)
result = requests.post(api_url,data=data).json()
return result
except:
return None
# 接收好友發(fā)來(lái)的消息并自動(dòng)回復(fù)
@itchat.msg_register(itchat.content.TEXT)
def auto_reply(msg_info):
# 當(dāng)從接口獲取不到消息時(shí),會(huì)回復(fù)以下默認(rèn)消息
default_msg = "你是猴子請(qǐng)來(lái)的救兵嗎著瓶?"
# 接收到的來(lái)自好友的文字消息
friend_msg = msg_info["Text"]
# 打印消息模型
# print(msg_info)
# 調(diào)用接口獲取要回復(fù)的內(nèi)容
reply_msg = get_friend_msg_info(friend_msg)["text"]
# 回復(fù)消息為None的校驗(yàn)
if reply_msg is None:
reply_msg = default_msg
# 獲取微信好友的唯一id:
friend_user_name = msg_info["FromUserName"]
# 發(fā)送消息
itchat.send(reply_msg, friend_user_name)
# 根據(jù)userName查找微信好友,以方便接下來(lái)的打印到控制臺(tái)
friend = itchat.search_friends(userName=friend_user_name)
print("【{}】:{}".format(friend["NickName"], msg_info["Content"]))
print("【robot回復(fù)】:{}".format(reply_msg))
# 開(kāi)啟自動(dòng)回復(fù)
itchat.run()
運(yùn)行結(jié)果:
Start auto replying.
【大胖噠】:今天天氣怎么樣联予?
【robot回復(fù)】:請(qǐng)問(wèn)你想查詢哪個(gè)城市
【大胖噠】:上海
【robot回復(fù)】:上海:周六 07月28日,雷陣雨轉(zhuǎn)多云 東南風(fēng)3-4級(jí),最低氣溫27度,最高氣溫36度
【大胖噠】:最近有什么新電影材原?
【robot回復(fù)】:影評(píng)還是不錯(cuò)的沸久,可以看看~
【大胖噠】:笨蛋,你說(shuō)的哪個(gè)呀余蟹?
【robot回復(fù)】:說(shuō)你啊
【大胖噠】:[壞笑]
【robot回復(fù)】:既然這么說(shuō)卷胯,給我一個(gè)評(píng)價(jià)吧!
【大胖噠】:[西瓜]
【robot回復(fù)】:西瓜榨成汁很好喝哦威酒。
【大胖噠】:是吧窑睁?
【robot回復(fù)】:嗯是阿。
【大胖噠】:你都會(huì)做什么葵孤?
【robot回復(fù)】:陪你聊担钮,陪你鬧,還不夠嗎尤仍?
【大胖噠】:不夠
【robot回復(fù)】:真心夠了
【大胖噠】:[豬頭]
【robot回復(fù)】:大豬頭箫津,圓又圓,兩只耳朵立起來(lái)。
對(duì)以上做出以下解析說(shuō)明:
1.登錄微信
登錄微信苏遥,有2種方式饼拍,其實(shí)前面在演示獲取微信好友信息時(shí),已解釋過(guò)暖眼。
微信登錄方式一:掃描登錄惕耕。當(dāng)運(yùn)行到該行代碼時(shí),會(huì)自動(dòng)彈出一個(gè)二維碼诫肠,掃描登錄司澎。這種登錄方式,每次運(yùn)行項(xiàng)目需要掃碼重新登錄栋豫。
# 登錄微信(每次需要掃碼登錄)
# itchat.login()
微信登錄方式二:自動(dòng)登錄挤安。當(dāng)運(yùn)行到該行代碼時(shí),會(huì)在項(xiàng)目中自動(dòng)生成一個(gè)文件:itchat.pkl
丧鸯。在半個(gè)小時(shí)內(nèi)可以自動(dòng)登錄蛤铜。
# 自動(dòng)登錄
itchat.auto_login(hotReload=True)
2.獲取微信好友發(fā)來(lái)的信息
上面定義了一個(gè)自動(dòng)回復(fù)函數(shù)def auto_reply(msg_info):
,并且被@itchat.msg_register(itchat.content.TEXT)
修飾丛肢。@itchat.msg_register(itchat.content.TEXT)
是Python中的裝飾器围肥,裝飾器可以簡(jiǎn)單粗暴的理解為增強(qiáng)函數(shù)的能力作用,后面會(huì)詳細(xì)學(xué)習(xí)Python中的裝飾器蜂怎。
此處只要先知道穆刻,被@itchat.msg_register(itchat.content.TEXT)
修飾的函數(shù),當(dāng)收到微信消息后杠步,會(huì)回調(diào)該函數(shù)即可氢伟。當(dāng)然這里的被修飾的函數(shù)名可以隨意命名,只要符合Python的函數(shù)命名規(guī)范即可幽歼。
獲取微信好友發(fā)來(lái)的信息:
# 接收到的來(lái)自好友的文字消息
friend_msg = msg_info["Text"]
為什么要這么寫(xiě)朵锣?我們可以打印接收到消息時(shí)的消息模型:
{'User':
<User: {'UniFriend': 0, 'IsOwner': 0, 'AppAccountFlag': 0, 'Statues': 0, 'OwnerUin': 0, 'ContactFlag': 3, 'PYInitial': 'DPD', 'AttrStatus': 234277, 'Province': '', 'Uin': 0, 'MemberList': <ContactList: []>, 'PYQuanPin': 'dapanda',
'HideInputBarFlag': 0,
'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=668360559&username=@febf4560290f0ce011aeba6976d152ad7b727deac349e0f32e82ab1040283bd6&skey=@crypt_fb49ed2_65e2e556deb28b64b2ebfc81ff0ace0b',
'NickName': '大胖噠',
'UserName': '@febf4560290f0ce011aeba6976d152ad7b727deac349e0f32e82ab1040283bd6', 'RemarkPYInitial': '',
'Signature': '', 'MemberCount': 0, 'KeyWord': '',
'City': '', 'DisplayName': '', 'EncryChatRoomId': '', 'VerifyFlag': 0,
'Sex': 0, 'RemarkPYQuanPin': '', 'ChatRoomId': 0, 'StarFriend': 0, 'SnsFlag': 1, 'Alias': '', 'RemarkName': ''}>,
'AppMsgType': 0,
'Url': '', 'Status': 3, 'HasProductId': 0,
'Content': '明天天氣怎么樣?',
'FileSize': '', 'OriContent': '', 'PlayLength': 0,
'MsgId': '274219144960351869',
'SubMsgType': 0, 'ImgWidth': 0, 'MsgType': 1,
'Text': '明天天氣怎么樣甸私?',
'RecommendInfo':
{'UserName': '', 'QQNum': 0, 'Signature': '', 'Scene': 0, 'Content': '', 'City': '', 'AttrStatus': 0, 'Province': '', 'Sex': 0, 'OpCode': 0, 'VerifyFlag': 0, 'Ticket': '', 'Alias': '', 'NickName': ''},
'EncryFileName': '', 'ImgHeight': 0, 'Type': 'Text', 'ImgStatus': 1,
'ToUserName': '@838da50c4c618efdb660616d3b2da5f8c239fe750a83494ea025a73951403c7e',
'AppInfo': {'Type': 0, 'AppID': ''},
'VoiceLength': 0, 'NewMsgId': 274219144960351869,
'CreateTime': 1532747207,
'MediaId': '',
'FromUserName': '@febf4560290f0ce011aeba6976d152ad7b727deac349e0f32e82ab1040283bd6',
'FileName': '', 'StatusNotifyCode': 0,
'StatusNotifyUserName': '',
'Ticket': '', 'ForwardFlag': 0}
根據(jù)模型結(jié)構(gòu)诚些,可以準(zhǔn)確拿到好友發(fā)來(lái)的消息:msg_info["Text"]
3.根據(jù)拿到的微信好友發(fā)來(lái)的消息,去調(diào)用圖靈機(jī)器人接口颠蕴,獲取到要自動(dòng)回復(fù)的內(nèi)容泣刹。
# 根據(jù)微信好友發(fā)來(lái)的消息調(diào)用圖靈機(jī)器人接口,獲取要回復(fù)的內(nèi)容
def get_friend_msg_info(message):
data={
"key": "9277c7b4d71845d78fab814a75746117",
"info": message,
"userid": "robot"
}
# 調(diào)用圖靈機(jī)器人接口
api_url = "http://openapi.tuling123.com/openapi/api"
try:
# 通過(guò)post請(qǐng)求方式調(diào)用接口犀被,返回結(jié)果是json格式的數(shù)據(jù)
result = requests.post(api_url,data=data).json()
return result
except:
return None
這里定義了一個(gè)函數(shù)椅您,根據(jù)拿到的微信好友發(fā)來(lái)的消息,去調(diào)用圖靈機(jī)器人接口寡键,獲取到要自動(dòng)回復(fù)的內(nèi)容掀泳。
根據(jù)圖靈機(jī)器人官方的開(kāi)發(fā)文檔雪隧,可以獲取到基本url
、入?yún)?code>apikey员舵、info脑沿、userid、請(qǐng)求方式post
马僻、返回的數(shù)據(jù)格式json
庄拇。我們?cè)儆胷equest模塊去調(diào)用該接口:requests.post(api_url,data=data).json()
。
4.把自動(dòng)回復(fù)的內(nèi)容回復(fù)給微信好友韭邓。
有了要回復(fù)的內(nèi)容后措近,那么多好友,要把消息回復(fù)給誰(shuí)女淑?這就是前面說(shuō)的微信好友的唯一性標(biāo)識(shí)UserName
瞭郑,再消息模型中,可以通過(guò):friend_user_name = msg_info["FromUserName"]
獲取得到鸭你。
# 獲取微信好友的唯一id:
friend_user_name = msg_info["FromUserName"]
# 發(fā)送消息
itchat.send(reply_msg, friend_user_name)
發(fā)送給好友屈张,調(diào)用的是itchat.send(reply_msg, friend_user_name)
,該方法有兩個(gè)參數(shù):參數(shù)1:要回復(fù)的內(nèi)容袱巨,參數(shù)2:好友的唯一性ID,即UserName
阁谆。
小結(jié)
借用itchat、request
庫(kù)愉老,用簡(jiǎn)短的代碼來(lái)實(shí)現(xiàn)微信好友消息自動(dòng)回復(fù)的功能笛厦。