python模仿网页版微信发送消息功能


Posted in Python onFebruary 24, 2018

这个微信版网页版虽然繁琐,但是不是很难,全程不带加密的。有兴趣的可以试着玩一玩,如果有兴趣的话,可以完善一下,做一些比较有意思的东西。

开发环境:Windows10
开发语言:Python3.6
开发工具:pycharm
抓包工具:fiddler

抓的包如下:

python模仿网页版微信发送消息功能

import requests
import time
import re
from bs4 import BeautifulSoup
import json
import random
from copyheaders import headers_raw_to_dict
DEFAULT_HEADERS={
  b'Host': b'wx.qq.com',
  b'Connection': b'keep-alive',
  b'Cache-Control': b'max-age=0',
  b'User-Agent': b'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
  b'Upgrade-Insecure-Requests': b'1',
  b'Accept': b'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  b'Accept-Language': b'zh-CN,zh;q=0.9',
  }
def get_13_time():
  return str(int(time.time()*1000))
class WXRobot(object):
  def __init__(self):
    self.s = requests.session()
    self.s.verify = False
    self.s.headers = DEFAULT_HEADERS
    self.DeviceID='e'+str(random.random())[2:17]
  def visit_index(self):
    url = 'https://wx.qq.com/'
    self.s.get(url)

  def visit_jslogin(self):
    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&_={}'.format(get_13_time())
    r=self.s.get(url)
    text=r.text
    maths=re.findall(r'window.QRLogin.code = 200; window.QRLogin.uuid = "(.*?)";',text)[0]
    uuid=str(maths)
    self.uuid=uuid
  def visit_vcode(self):
    #获取验证码
    url='https://login.weixin.qq.com/qrcode/{}'.format(self.uuid)
    r=self.s.get(url)

    with open('qrcode.jpg','wb') as f:
      f.write(r.content)
      f.flush()
      f.close()
      print('等待扫描验证码。。。')
  def visit_login(self):
    url='https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid={}&tip=0&_={}'.format(self.uuid,get_13_time())
    r=self.s.get(url)
    text=r.text
    code=re.findall(r'''window.code=(.*?);''',text)[0]
    # print('获取状态码', code)
    if str(code)!='200':
      # print('两秒后重新调用')
      time.sleep(2)
      self.visit_login()
    elif str(code)=='200':
      maths = re.findall(r'''redirect_uri="(.*?)"''', text)[0]
      self.redirect_uri=maths
      print('redirect_uri获取完成...',self.redirect_uri)

  #得到一些关键字
  def visit_newloginpage(self):
    r=self.s.get(self.redirect_uri,allow_redirects=False)
    text=r.text
    bs=BeautifulSoup(text,'lxml')
    self.skey = bs.find('skey').text
    self.wxsid = bs.find('wxsid').text
    self.wxuin = bs.find('wxuin').text
    self.pass_ticket = bs.find('pass_ticket').text
    self.isgrayscale = bs.find('isgrayscale').text
    # print(self.skey,self.wxsid,self.wxuin,self.pass_ticket)


  #得到初始化信息
  def visit_webwxinit(self):
    url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?pass_ticket={}'.format(self.pass_ticket)
    data={
      "BaseRequest":{"Uin":self.wxuin ,"Sid":self.wxsid,"Skey":self.skey,"DeviceID":self.DeviceID}
    }
    r=self.s.post(url,json=data)
    r.encoding='utf-8'

    jsontext=r.json()
    # =json.loads(text)
    print('登录用户为:',jsontext["User"]["NickName"])
    self.FromUserName=jsontext["User"]["UserName"]
    self.group_list=jsontext['ContactList'] #
    SyncKey=jsontext["SyncKey"]["List"]
    ChatSet=jsontext["ChatSet"]
    ChatSetlist=str(ChatSet).split(',')
    self.ChatSet =[{"UserName":name ,"EncryChatRoomId":""} for name in ChatSetlist if name.startswith('@')]


  def visit_notify(self):
    url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify?pass_ticket={}'.format(self.pass_ticket)
    data={
      "BaseRequest": {"Uin": self.wxuin, "Sid": self.wxsid,
               "Skey": self.skey,
               "DeviceID": self.DeviceID},
      "Code": 3,
      "FromUserName": self.FromUserName,
      "ToUserName": self.FromUserName,
      "ClientMsgId": int(get_13_time())
    }
    r=self.s.post(url=url,json=data)
    r.encoding='utf-8'
    self.MsgID=r.json()['MsgID']
    print(r.json()['MsgID'],'消息id')
  #获取所有好友列表
  def getcontact(self):
    url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?pass_ticket={}&r={}&seq=0&skey=@{}'.format(self.pass_ticket,get_13_time(),self.skey)
    r=self.s.get(url)
    r.encoding='utf=8'
    contactjson=r.json()
    # print(contactjson)
    self.MemberList=contactjson["MemberList"]
    for name in self.MemberList:
      print(name['NickName'],name['UserName'])

  # 聊天列表
  def batchgetcontact(self):
    url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r={}&pass_ticket={}'.format(get_13_time(),self.pass_ticket)
    data={
      "BaseRequest": {"Uin":self.wxuin,
               "Sid": self.wxsid,
               "Skey": self.skey,
               "DeviceID": self.DeviceID},
       "Count": len(self.ChatSet),
       "List": self.ChatSet
       }
    r=self.s.post(url=url,json=data)
    r.encoding='utf-8'
    ContactList=r.json()["ContactList"]
    for i in ContactList:
      print('聊天窗口----',i.get('NickName'))

  def get_local(self):
    return str(time.time())+str(random.random())[2:9]
  def send_msg(self):

    ToUserName=input('你要发送给谁?')
    msg = input('请输入你要发送的信息内容')
    url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket={}'.format(self.pass_ticket)
    data={
      "BaseRequest": {"Uin":self.wxuin,
               "Sid": self.wxsid,
               "Skey": self.skey,
               "DeviceID": self.DeviceID},
      "Msg": {"Type": 1,
          "Content": msg,
          "FromUserName": self.FromUserName,
          "ToUserName": ToUserName,
          "LocalID": self.get_local(),
          "ClientMsgId": self.get_local()
          },
      "Scene": 0
    }
    r=self.s.post(url=url,json=data)
    json_data=r.json()
    if 0 == json_data['BaseResponse']['Ret']:
      print('消息发送成功')
    else:
      print('消息发送失败')
if __name__ == '__main__':
  wx=WXRobot()
  wx.visit_index()
  wx.visit_jslogin()
  wx.visit_vcode()
  wx.visit_login()
  wx.visit_newloginpage()
  wx.visit_webwxinit()
  wx.visit_notify()
  wx.getcontact()
  wx.batchgetcontact()
  while True:
    wx.send_msg()
  # wx.x() #心跳包
  # time.sleep(50)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python下使用Psyco模块优化运行速度
Apr 05 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
浅谈python抛出异常、自定义异常, 传递异常
Jun 20 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
Django在pycharm下修改默认启动端口的方法
Jul 26 Python
Django中URL的参数传递的实现
Aug 04 Python
Python 解析xml文件的示例
Sep 29 Python
python中PyQuery库用法分享
Jan 15 Python
解决pytorch读取自制数据集出现过的问题
May 31 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 #Python
python opencv之分水岭算法示例
Feb 24 #Python
python3爬取各类天气信息
Feb 24 #Python
python opencv之SIFT算法示例
Feb 24 #Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 #Python
python opencv之SURF算法示例
Feb 24 #Python
几种实用的pythonic语法实例代码
Feb 24 #Python
You might like
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
基于PHP文件操作的详解
2013/06/05 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
简单谈谈favicon
2015/06/10 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
javascript 闭包详解
2015/07/02 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
python list中append()与extend()用法分享
2013/03/24 Python
python常规方法实现数组的全排列
2015/03/17 Python
使用Python写CUDA程序的方法
2017/03/27 Python
Python 中的lambda函数介绍
2018/10/10 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
python实现斗地主分牌洗牌
2020/06/22 Python
Python如何输出警告信息
2020/07/30 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
煤矿安全生产月活动总结
2014/07/05 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
六五普法学习心得体会
2016/01/21 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL