python 实现微信自动回复(自动聊天)
介绍
微信自动回复其实主要就是登录,接收消息,回复消息三个功能,微信没有提供方便的API,但是可以分析网页版微信通信原理,通过模拟浏览器来实现需要的功能。下面将给出微信网页版通信原理以及Python具体实现代码。
分析
-获取uuid:
-获取二维码:
-监听是否扫描二维码以及是否确认登录:
GET https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4YyQFP2Daw==
Param uuid 同上
Response
-获取后续访问所需要的key等
GET https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARxD7GSdBYtNHOxhK0BF0ek-@qrticket_0&uuid=4YyQFP2Daw==
Param URL为上次返回的redirect_uri 参数已经带上了
Response
-初始化
POST https://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": "
Response 返回json,包含用户自己的信息,最近联系人,订阅的公众号消息等等;这里只需要关注 UserName=@821c154488cdddbfb04141aa8f681174305d21d67a24cfd6eca3e77a152e52ff 每位用户都有一个UserName,但是每次登陆UserName都是重新分配的,
-状态检查
GET https://wx.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=1486743215000&skey=@crypt_828c27e0_e98d62f6954235194f2b1252943f25ad&sid=0zEvAdWKm9Z
Param r(时间戳),skey,sid,uin,deviceid,synckey(将SyncKey中的多组key 以 key1_value1|key2_value2 的形式拼接成字符串如:3_660530485|1000_1486721341),_ (时间戳)
Response window.synccheck={retcode:"0",selector:"2"} retcode=0 正常 ,1101 退出登录,1102 会话异常 , selector= 0 无变化 2or6 有消息
-接收消息
-发送消息
-获取自动回复的消息
代码
# -*- 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_keyglobal CHECK_LOGIN_STATUS_BASE_URLCHECK_LOGIN_STATUS_BASE_URL=CHECK_LOGIN_STATUS_BASE_URL+qrcode_keyqrcode_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=Truetimes=0msg='please scan the qrcode'while run:times+=1print msgresponse=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=Falseplt.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.textglobal ret,message,skey,wxsid,wxuin,pass_ticket,isgrayscalexml=et.fromstring(msg)ret=xml[0].textmessage=xml[1].textskey=xml[2].textwxsid=xml[3].textwxuin=xml[4].textpass_ticket=xml[5].textisgrayscale=xml[6].textif times==20:run=False
def update_synckey(msg):global synckey,syncheck_keysynckey=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 useruser=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='+skeyresponse=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 :',contentsendmsg=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_ticketwhile 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:continuedata=json.loads(response)update_synckey(data)for msg in data['AddMsgList']:content=msg['Content']fromuser=msg['FromUserName']if fromuser==user:continueif 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 :passdef sync_check():listen=Truebase_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.textp=re.compile(r'(\d+(\.\d+)?)')retcode=p.findall(response)[0][0]if retcode=='1101' or retcode=='1102':print 'login out ...'listen=Falseos._exit(0)time.sleep(2)except Exception:pass
if __name__ == '__main__': ssl._create_default_https_context = ssl._create_unverified_contextQRCODE_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 实现微信自动回复(自动聊天)相关推荐
- python实现微信自动回复机器人+查看别人撤回的消息(部署到云服务器)
python实现微信自动回复机器人+查看别人撤回的消息(部署到云服务器) 声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关 目录 python实现微信自动回复机器人+查看别 ...
- python 贴吧自动回复机-python实现微信自动回复机器人功能
一 简单介绍 wxpy基于itchat,使用了 Web 微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展.实现了微信登录.收发消息.搜索好友.数据统计等功能. 安装:wxpy ...
- python 贴吧自动回复机-Python实现微信自动回复机器人详细教程
首先,我们需要安装并配置好Python环境,并安装requests和itchat包,我用的是Windows7环境! https://www.python.org/ python官网 下载 然后直接打开 ...
- Python 实现微信自动回复的方法
1:安装itchat pip install itchat 2:简单实例: (1):发送信息 import itchat itchat.auto_login() # 登录微信 name = itcha ...
- python 贴吧自动回复_利用Python实现微信自动回复!我打游戏再也不怕女朋友发信息了...
Python中itchat模块对于操作微信来说是个福音,今天,我们就用Python实现微信自动回复,同时调用图灵机器人,实现智能回复. 具体代码如下: #导入库import itchatimport ...
- 如何用计算机自动回复微信,10分钟教你用Python实现微信自动回复功能
01 前言&&效果展示 相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息.但微信又不能像QQ一样设置自动回复.无妨,今天,我们就来用Python实现微信的自动回复功能吧,并且把 ...
- 用python刷微信阅读_使用python让微信读书自动翻页
微信读书目前是朋友圈最流行的一款读书app,但是很遗憾微信读书没有自动翻页模式,不过这可难不倒程序员,写个程序让它自动翻页不久好了. 而且微信读书有这样一个激励政策:"每阅读30分钟可兑1赠 ...
- python微信自动回复代码_使用python实现微信自动回复功能
有时忙着时候,我们可以设置微信自动回复,这样又不会无视别人信息,又能节省时间,具体怎么实现呢?本文实例为大家分享了python实现微信自动回复的具体代码,供大家参考. 具体内容如下 预装: pytho ...
- python实现淘宝自动回复_10分钟教你用Python实现微信自动回复功能
01 前言&&效果展示 相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息.但微信又不能像QQ一样设置自动回复.无妨,今天,我们就来用Python实现微信的自动回复功能吧,并且把 ...
- 旺旺机器人的快捷短语_快答自动回复系统|快答自动回复(自动聊天机器人)v1.3.9.0 免费版 - 极光下载站...
快答自动回复软件是一款聊天自动恢复机器人,支持QQ(办公TIM).微信.千牛旺旺.拼多多.陌陌等聊天软件,用户设置好常用的语句后就可以根据关键词进行快速自动恢复,字数不收限制,还可以自动添加图片等. ...
最新文章
- 计算机界最大“追书坑”,82岁大神高德纳仍在写《计算机程序设计艺术》4B卷...
- 第十六届全国大学生智能汽车竞赛总决赛 AI视觉组线上赛细则草案 - 初步版本
- Mozilla计划向Firefox浏览器中添加违规警告
- python 获得当前运行脚本文件的路径
- 献给新一代人工智能后浪——《后丹》
- 定时执行vacuum
- 简单的笔记本JAVA_超简单笔记本改造nas--一个萌新的摸爬滚打
- sublime能编译PHP吗,让sublime编译php、js
- 微信群突然冒出“免费教画画”的女大学生,套路太深,千万别上当!
- 从零开始学OpenCV(一)——OpenCV的安装
- 最简单的pdf加水印方法,五个步骤很详细
- Office基础操作:Word、PPT 表格文字居中
- C#如何在EPPlus中冻结首行,冻结Excel首行
- An error occurred.
- 【React】unmountComponentAtNode卸载组件
- 什么是html的语义化?
- CSS 重要属性与定位
- 【element ui --- DateTimePicker,有效时间不能晚于当前时间】
- mt7 android6.0 回退,Mate7 M版本(Android 6.0)B553发布说明及问题反馈
- 群晖的home和homes共享文件夹介绍
热门文章
- MySQL-14使用子查询-必知必会
- EasyNLP 发布融合语言学和事实知识的中文预训练模型 CKBERT
- windows server关闭系统自动更新
- html css remove,CSS類別操作--.removeClass()
- css过渡、动画3D环绕相册
- dw中css制作导航,四点告诉你Dreamweaver中制作漂亮导航条的方法
- ASML公司Q3季度营收27.9亿欧元
- 目前开发人工日多少钱_行内人解读开发一个App需要多少钱?-今日头条
- 华为路由器显示网络未连接到服务器,如何解决华为路由器Q1连接没有网络的问题?...
- raspberrypi