python 實現微信自動回覆(自動聊天)
介紹
微信自動回覆其實主要就是登入,接收訊息,回覆訊息三個功能,微信沒有提供方便的API,但是可以分析網頁版微信通訊原理,通過模擬瀏覽器來實現需要的功能。下面將給出微信網頁版通訊原理以及Python具體實現程式碼。
分析
-獲取uuid:
GET https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi- bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1486743163000-獲取二維碼:
GEThttps://login.weixin.qq.com/qrcode/4YyQFP2Daw== Param 4YyQFP2Daw== 即上面的uuid Response二維碼圖片-監聽是否掃描二維碼以及是否確認登入:
GET https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4YyQFP2Daw==
Param uuid 同上
Response
window.code=200;window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARxD7GSdBYtNHOxhK0BF0ek- @qrticket_0&uuid=4YyQFP2Daw==&lang=zh_CN&scan=1486743186"; code = 408 無響應,201 掃描二維碼但沒有登入(此時響應資料中還包含使用者頭像圖片base64編碼的字串,UserAvatar) 200 登入 redirect_uri 為接下來需要請求的地址-獲取後續訪問所需要的key等
GET https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?[email protected]_0&uuid=4YyQFP2Daw==
&lang=zh_CN&scan=1486743186pParam URL為上次返回的redirect_uri 引數已經帶上了
Response
<error><ret>0</ret><message></message><skey>@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad</skey><wxsid>0zEvAdWKm9ZZgYVn</wxsid><wxuin>1564527827</wxuin><pass_ticket>OLxGHwqL%2BWNArxvXaqjDy06qzdrSojq6DJwiBF19sgw2CibZSJBv1WwOXAfKnLIg</pass_ticket><isgrayscale>1</isgrayscale></error>-初始化
POSThttps://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-485039295&lang=zh_CN&pass_ticket=OLxGHwqL%2BWNArxvXaqjDy06qzdrSojq6DJwiBF19sgw2CibZSJBv1WwOXAfKnLIg
Param r ( - + 9位隨機數),pass_ticket,{"BaseRequest": {"Uin": "1564527827", "Skey": "@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad", "DeviceID": "
e924318232435460", "Sid": "0zEvAdWKm9ZZgYVn"}} 第三個引數其中為json資料,DeviceID為(e + 15位隨機數)Response返回json,包含使用者自己的資訊,最近聯絡人,訂閱的公眾號訊息等等;這裡只需要關注 [email protected]7a152e52ff 每位使用者都有一個UserName,但是每次登陸UserName都是重新分配的,
SyncKey 為一組key ,後面接收訊息需要將其作為引數,同時每次接收接收訊息時,也會返回一組SyncKey作為在下一次請求的引數,以此類推-狀態檢查
這裡會建立一個長連線,每次連線大約20秒左右,若新訊息,手機端發出退出網頁登入指令,或者狀態異常會返回特定的狀態碼GEThttps://wx.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=1486743215000&[email protected]_828c27e0_e98d62f6954235194f2b1252943f25ad&sid=0zEvAdWKm9Z
ZgYVn&uin=1564527827&deviceid=e891796429.95749&synckey=1_660530221%7C2_660530488%7C3_660530485%7C1000_1486721341&_=1486740215000Paramr(時間戳),skey,sid,uin,deviceid,synckey(將SyncKey中的多組key 以 key1_value1|key2_value2 的形式拼接成字串如:3_660530485|1000_1486721341),_ (時間戳)
Responsewindow.synccheck={retcode:"0",selector:"2"} retcode=0 正常 ,1101 退出登入,1102 會話異常 , selector= 0 無變化 2or6 有訊息
-接收訊息
若狀態檢查到有新訊息,則請求訊息 POST https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=0zEvAdWKm9ZZgYVn&[email protected]_828c27e0_e98d62f6954235194f2b1252943f25ad&lang=zh_CN&pass_ticket=OLxGHwqL%2BWNArxvXaqjDy06qzdrSojq6DJwiBF19sgw2CibZSJBv1WwOXAfKnLIg Param sid,skey,pass_ticket 以及 json資料 {"SyncKey": {"Count": 4, "List": [{"Key": 1, "Val": 660530221}, {"Key": 2, "Val": 660530488}, {"Key": 3, "Val": 660530485}, {"Key": 1000, "Val": 1486721341}]}, "BaseRequest": {"Sid": "0zEvAdWKm9ZZgYVn", "Skey": "@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad", "DeviceID": "e141257009.76972", "Uin": "1564527827"}, "rr": "-888098293"} 其中rr (- + 9位隨機數) Response json資料包含訊息的所有資訊,其中關注 [email protected]a3e77a152e52ff 訊息傳送者以及 Content 訊息內容-傳送訊息
POST https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?lang=zh_CN&pass_ticket=0%2BoUqOWdYEen6oDVFEIv5ncIIaJcWs1LeSi69C8tUTgcp36azGAl6a8uT02PiaHu Param pass_ticket, json資料{"Msg": {"FromUserName": "@9e718026650771acd6d759922e000fafceaa1a5fda83aea7b3b70bc1bd6c3774", "LocalID": "14867488199507670", "ClientMsgId": "14867488199507670", "ToUserName": "@9e718026650771acd6d759922e000fafceaa1a5fda83aea7b3b70bc1bd6c3774", "Content": "訊息內容", "Type": "1"}, "BaseRequest": {"Sid": "5Qn7rswOtPRHFw92", "Skey": "@crypt_828c27e0_ad386b3d4d68a282eda03d7d5b2d3104", "DeviceID": "e397471984070243", "Uin": "1564527827"}, "Scene": "0"} 其中LocalID,ClientMsgId 為13位時間戳加上5位隨機數 Response 返回響應的狀態碼,傳送成功會返回 LocalID 和 ClientMsgID 以上就是我們需要的知道的,當然其他比如讀取所有聯絡人等都是大同小異,這裡就不多贅述了。 到這裡還有關鍵的一步,那就是如何根據收到的訊息自動回覆,當然是接入其他可以聊天的程式了,這裡為了方便我使用的是牛人趣事的simsimi聊天機器人的外鏈,它不需要登入等操作,連request header 都不用偽造^0^,直接將接受的訊息post過去,將返回的訊息作為微信回覆訊息;當然也可以接入更智慧的機器人。-獲取自動回覆的訊息
POST http://www.niurenqushi.com/api/simsimi/ Param txt (傳送的訊息) Response {"code":100000,"text":"訊息"}程式碼
執行以下程式碼,會自動彈出二維碼圖片,手機掃碼登入之後開始執行,手機端傳送退出登入指令時結束。 重點在於流程和思路,程式碼也比較糙,註釋也就不加了,多指教^0dfd^# -*- coding:utf-8 -*-
#author:fengw
import urllib,urllib2,cStringIO,re,sys,os,cookielib,ssl,requests,time,json,random,threading,warnings
from PIL import Image
from matplotlib import pyplot as plt
import xml.etree.cElementTree as et
reload(sys)
sys.setdefaultencoding('utf-8')
warnings.filterwarnings("ignore")
def get_device_id():
return 'e'+str(random.random()*10000000000)[0:10]+str(random.random()*100000)[0:5]
def qrcode_img():
response=urllib2.urlopen(QRCODE_KEY_URL).read()
p=re.compile(r'(\d+(\.\d+)?)')
code=p.findall(response)[0][0]
if code =='200':
p=re.compile(r'\"(.*)\"')
qrcode_key=p.findall(response)[0]
qrcode_img_url=QRCODE_IMG_BASE_URL+qrcode_key
global CHECK_LOGIN_STATUS_BASE_URL
CHECK_LOGIN_STATUS_BASE_URL=CHECK_LOGIN_STATUS_BASE_URL+qrcode_key
qrcode_img=Image.open(cStringIO.StringIO(urllib2.urlopen(qrcode_img_url).read()))
plt.ion()
plt.figure()
plt.imshow(qrcode_img)
plt.figure()
plt.close(2)
else :
print 'sorry,request qrcode failed...'
time.sleep(2)
os._exit(0)
def listen_login():
run=True
times=0
msg='please scan the qrcode'
while run:
times+=1
print msg
response=urllib2.urlopen(CHECK_LOGIN_STATUS_BASE_URL).read()
p=re.compile(r'(\d+(\.\d+)?)')
code=p.findall(response)[0][0]
if code=='201':
msg= 'please login...'
plt.close()
if code=='200':
run=False
plt.close()
print 'login sucess,running....'
p=re.compile(r'\"(.*)\"')
redirect_url=p.findall(response)[0]
response=conn.get(url=redirect_url,allow_redirects=False,verify=False)
msg=response.text
global ret,message,skey,wxsid,wxuin,pass_ticket,isgrayscale
xml=et.fromstring(msg)
ret=xml[0].text
message=xml[1].text
skey=xml[2].text
wxsid=xml[3].text
wxuin=xml[4].text
pass_ticket=xml[5].text
isgrayscale=xml[6].text
if times==20:
run=False
def update_synckey(msg):
global synckey,syncheck_key
synckey=str(msg['SyncKey']).replace("u'","'")
for k_v in msg['SyncKey']['List']:
syncheck_key+='|'+str(k_v['Key'])+'_'+str(k_v['Val'])
syncheck_key=syncheck_key[1:]
def wx_init():
url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-485039295&lang=zh_CN&pass_ticket='+pass_ticket
data={'BaseRequest':{'DeviceID':'%s'%get_device_id(),'Sid':'%s'%wxsid,'Skey':'%s'%skey,'Uin':'%s'%wxuin}}
res=conn.post(url=url,headers=headers,data=json.dumps(data),verify=False)
response=res.text
msg=json.loads(response)
global user
user=msg['User']['UserName']
update_synckey(msg)
def get_contact_list():
base_url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&seq=0'
base_url+='&pass_ticket='+pass_ticket+'&r='+str(int(time.time())*1000)+'&skey='+skey
response=urllib2.urlopen(base_url).read()
data=json.loads(response)
f=open(r'd:/linklist.txt','w')
for friend in data['MemberList']:
msg=friend['NickName']+","+friend['RemarkName']+"\n"
f.write(msg.encode('utf-8'))
f.close()
def get_auto_reply(send_msg):
url='http://www.niurenqushi.com/api/simsimi/'
data={'txt':'%s'%send_msg}
res=conn.post(url=url,data=data)
res.encoding='utf-8'
return json.loads(res.text,'')['text']
def reply_msg(content,touser):
url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?lang=zh_CN&pass_ticket='+pass_ticket
#touser='filehelper'
ClientMsgId=str(int(time.time()))+str(random.random()*10000000)[0:7]
print 'recive msg :',content
sendmsg=get_auto_reply(content)
data={'BaseRequest':{'Uin':'%s'%wxuin,'Sid':'%s'%wxsid,'Skey':'%s'%skey,'DeviceID':'%s'%get_device_id()},'Msg':{'ClientMsgId':'%s'%ClientMsgId,'Content':'%s'%sendmsg.encode('utf-8'),'FromUserName':'%s'%user,'LocalID':ClientMsgId,'ToUserName':'%s'%touser,'Type':'1'},'Scene':'0'}
data=json.dumps(data,ensure_ascii=False)
res=conn.post(url=url,headers=headers,data=data.encode('utf-8'),verify=False)
print 'reply:',sendmsg
def recive_msg():
base_url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync'
base_url+='?sid='+wxsid+'&skey='+skey+'&lang='+'zh_CN'+'&pass_ticket='+pass_ticket
while True:
try:
rr='-'+str(random.random()*1000000000)[0:9]
data={'BaseRequest':{'Uin':'%s'%wxuin,'Sid':'%s'%wxsid,'Skey':'%s'%skey,'DeviceID':'%s'%get_device_id()},'SyncKey':eval(synckey),'rr':'%s'%rr}
res=conn.post(url=base_url,headers=headers,data=json.dumps(data),verify=False)
res.encoding='utf-8'
response=res.text
if response==None:
continue
data=json.loads(response)
update_synckey(data)
for msg in data['AddMsgList']:
content=msg['Content']
fromuser=msg['FromUserName']
if fromuser==user:
continue
if content[0:4]=='<':
continue
#print 'recived msg:',content.decode('unicode_escape'),'from user :',fromuser
threading.Thread(target=reply_msg,args=(content,fromuser)).start()
time.sleep(2)
except Exception as e :
pass
def sync_check():
listen=True
base_url='https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck'
base_url+='?r='+str(int(time.time())*1000)+'&skey='+skey+'&sid='+wxsid+'&uin='+wxuin+'&deviceid='+get_device_id()+'&synckey='+syncheck_key+'&_='+str(int(time.time())*1000-3000000)
request = urllib2.Request(url=base_url, headers=headers)
while listen:
try:
res=conn.get(url=base_url,headers=headers,verify=False)
response=res.text
p=re.compile(r'(\d+(\.\d+)?)')
retcode=p.findall(response)[0][0]
if retcode=='1101' or retcode=='1102':
print 'login out ...'
listen=False
os._exit(0)
time.sleep(2)
except Exception:
pass
if __name__ == '__main__':
ssl._create_default_https_context = ssl._create_unverified_context
QRCODE_KEY_URL='https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_='+str(int(time.time())*1000)
QRCODE_IMG_BASE_URL='https://login.weixin.qq.com/qrcode/'
CHECK_LOGIN_STATUS_BASE_URL='https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid='
ret,message,skey,wxsid,wxuin,pass_ticket,isgrayscale='','','','','','',''
synckey,user='',''
syncheck_key=''
cookie=cookielib.CookieJar()
handler=urllib2.HTTPCookieProcessor(cookie)
debug_h=urllib2.HTTPSHandler(debuglevel=0)
opener=urllib2.build_opener(handler,debug_h)
urllib2.install_opener(opener)
conn=requests.session()
headers = { 'Host': 'wx.qq.com',
'Connection': 'keep-alive',
'Accept': 'application/json, text/plain, */*',
'Origin': 'https://wx.qq.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0',
'Content-Type': 'application/json;',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'
}
#獲取微信二維碼並顯示
qrcode_img()
#監聽使用者掃描二維碼和登入動作
listen_login()
#微信初始化
wx_init()
#開啟子執行緒監聽登入狀態
check_status_task=threading.Thread(target=sync_check)
check_status_task.start()
#get_contact_list()
#主執行緒監聽訊息
recive_msg()
~第一次寫,請無視排版~肯定是編輯器的問題,怎麼感覺比word還難
相關推薦
python實現微信群聊定時自動回覆
因為要搞歸寢資訊,我就搞了一個程式碼,有問題的話可以評論 2.安裝itchat模組 windows+R輸入cmd開啟後輸入 pip install itchat 3.安裝schedule模組 pip install schedule
新手看完Python實現微信跳一跳自動執行,再忍不住了
我相信現在很多人都在玩微信的跳一跳小遊戲,前面幾天,很多人在朋友圈晒「跳一跳」人工智慧開掛教程:如何讓電腦自己玩微信跳一跳。 很多朋友表示不太懂這是什麼。 首先,這不是一個「破解外掛」安裝教程,而是一個「破解軟體」製作教程,要靠自己用程式碼一點點寫出來,你需要有一定的程式設計基礎,這裡用的是
python實現微信每日一句自動傳送給喜歡的人
# -*- coding: utf-8 -*- ''' 這是一個用來測試微信自動傳送訊息的demo 參考了一篇部落格 部落格地址:http://www.cnblogs.com/botoo/p/86223
兩行程式碼實現微信多開(電腦版)
轉自:http://www.hurbai.com 首先在桌面建立一個 .bat檔案,我這裡命名 微信多開.bat 然後將 微信多開.bat 檔案用Notepad++或者記事本開啟將以下兩行程式碼複製貼上過去儲存即可實現多開的效果。 PATH C:\Program Files (x8
python 實現微信自動回覆(自動聊天)
介紹 微信自動回覆其實主要就是登入,接收訊息,回覆訊息三個功能,微信沒有提供方便的API,但是可以分析網頁版微信通訊原理,通過模擬瀏覽器來實現需要的功能。下面將給出微信網頁版通訊原理以及Python具體實現程式碼。 分析 -獲取uuid: GET https://log
使用Python實現微信自動回覆
1. 獲取其一個圖靈機器人的API 可以從下面這個官網上註冊賬號,獲取圖靈機器人的API. http://www.tuling123.com/ 註冊成功後,我們就可以獲得下面這個api的key了. 2.全部Python程式碼如下: 註釋在程式碼內
python實現微信訊息群發和微信自動回覆
基於python的第三方庫itchat, 實現微信祝福分組群發和自動回覆好友祝福的功能。 這裡的分組傳送實現原理是這樣的, 首先你想群發訊息給誰, 就把誰拉到一個群聊裡,然後程式碼遍歷群聊裡的所有成員, 挨個私信發祝福。 需要明確的有一下幾點: 1. 
python-微信自動回覆(附原始碼)
今天發現一個好玩的專案,用python實現微信自動回覆。 來源:https://mp.weixin.qq.com/s/3q5l14c1BvJUtEmEkOA_Rw 用起來記得把引數改改。 原始碼: import itchat impor
Python實現微信自動回覆和指定傳送群聊訊息
閱讀本文大約需要5分鐘 先說一件事,抱著“沉澱成本不是成本”的態度,最近會將以前寫的文章刪除或者進行合併,按照高人的指點進行格式上和內容上的完善。 因為一直寫基礎的緣故,今天朋友提了下面這樣一個需求。就順便寫了一個小專案和大家分享一下 (圖片是微信截圖貼上不了,
超簡單Python實現微信機器人自動回覆
下面這個小文章適合初學Python的童鞋哦~~~一個很好用的微信庫:itchat拿使用圖靈機器人設定自動回覆,讓機器人跟微信好友傻傻的聊天,機器人比小編還會聊天,無論是對美眉還是漢紙,上來就是愛!愛!愛!簡直太辣眼睛!!!用它進行來調戲微信好友,簡直6的一筆!(記住一條!千萬
10分鐘教你用Python實現微信自動回覆
01 前言&&效果展示 相信大家都有忙碌的時候,不可能一直守在微信上及時回覆訊息。但微信又不能像QQ一樣設定自動回覆。無妨,今天,我們就來用Python實現微信的自動回覆功能吧,並且把接收到的訊息統一發送到檔案助手裡面,方便統一檢視。 效果如下: 02 環境準備 Python版本:3.6
Python實現微信自動回復機器人詳細教程
cmd命令 ltr 官網 文本 ply request 多次 reply gist 首先,我們需要安裝並配置好Python環境,並安裝requests和itchat包,我用的是Windows7環境!https://www.python.org/ python官網 下載
20行程式碼實現微信拜年訊息智慧自動回覆
又是一年新春時,相信大家都會收到來自親朋好友的祝福轟炸。在這種時候,不回覆顯得有點不近人情,但是一個個手打回復又會讓人覺得手太累。尤其是大部分好友都是複製群發的訊息,雖說“群發的簡訊我不回”也
Python實現微信自動拉群機器人
微信群的使用者新增邏輯是 —— 當群人數達到100人後,使用者無法再通過掃描群二維碼加入,只能讓使用者先新增群內聯絡人微信,再由聯絡人把使用者拉進來。這樣,聯絡人員的私人微信會新增大量陌生人,給其帶來不必要的打擾,而且純人工操作,也容易出現紕漏。 那麼,是否可以通過程
django搭建微信公眾號後臺——自動回覆(7.20)
其實大部分還是依賴開發包,然後這個流程一直沒怎麼搞清楚所以略坑。 接入驗證的時候用的GET方法帶引數,接收引數然後驗證並返回echostr。 使用者向伺服器傳送訊息時,如果是明文傳送就直接request.body獲取xml包然後處理就好了,和GET的無關,如
python實現微信付款碼支付(刷卡支付)(純python)
參考連結https://github.com/Jolly23/wx_pay_python https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1 use.py from wx_pay impo
微信群助手(自動整理拼車資訊)
#!/usr/bin/env python # coding: utf-8 import itchat, sys reload(sys) sys.setdefaultencoding('utf8') def man(chatroomName): i
python實現微信機器人: AI智慧回覆
上一篇介紹了微信自動回覆的方法, 不過只能回覆預先設定的語句。 目前市面上有不少智慧聊天的系統,接入這些系統就能實現一個簡易的智慧聊天機器人。前期準備:在網站http://www.tuling123.com/註冊賬號,我們能獲得一個token,一個免費的token每天的呼叫上
圖靈機器人介面實現自動回覆(web版)
這周剛好在研究網站裡的自動回覆客服( 機器人),在網上看了很多資料,大都是基於移動端,網頁版的少之又少。在踩了無數個坑之後終於摸索出了一條泥濘小路(哭兮兮),在這裡跟大家分享一下,有不足之處歡迎指正(當然各位路過的大佬有更好的實現也可以一起探討哈哈哈哈)。咳咳話題有點
Python實現微信好友簽名詞雲的構建(itchat、jieba、wordcloud)
最近Python操作微信的文章挺火的,結合前面介紹過的jieba和wordcloud做一個簡單的微信好友簽名的詞雲。 操作微信的庫有很多,現在比較流行的就是itchat,https://github.com/littlecodersh/ItChat 這個庫對