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操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
Python实现的计算器功能示例
Apr 26 Python
python中的常量和变量代码详解
Jul 25 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
用python打印菱形的实操方法和代码
Jun 25 Python
NumPy中的维度Axis详解
Nov 26 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
python3 实现调用串口功能
Dec 26 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
如何利用python实现Simhash算法
Jun 28 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用正则表达式匹配URL的简单方法
2013/11/12 PHP
PHP查询快递信息的方法
2015/03/07 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
js验证模型自我实现的具体方法
2013/06/21 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
python 删除非空文件夹的实例
2018/04/26 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
详解python的super()的作用和原理
2020/10/29 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
总监职责范文
2013/11/09 职场文书
实习单位评语
2014/04/26 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
客户答谢会活动方案
2014/08/31 职场文书
党支部四风整改方案
2014/10/25 职场文书
员工辞职信范文大全
2015/05/12 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
关于感恩的作文
2019/08/26 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
Python基础之数据结构详解
2021/04/28 Python
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server
Android Rxjava3 使用场景详解
2022/04/07 Java/Android