Python学习---模拟微信网页登录180410

WEB微信

网页登录的猜想:

a. 访问页面出现二维码

b. 长轮询监听是否已经扫码并且点击确认

c. 如何进行会话保持

d. 如何获取用户列表

e. 如何发送消息(接收消息)

过程:访问微信官网[https://wx.qq.com/]  --> 打开微信[已登录]扫一扫  -->  扫描网页图片

App内获取数据都是通过RUL进行获取的

长轮询: 发送一次请求后,就一直在等待消息的返回,如果超过规定时间后,就结束该请求,发送下次的请求。

轮 询: 定时的不停的交替的发送请求到服务器,不等待消息的返回

注:pending:表示一直在进行中的请求

二维码分析

获取二维码:

二维码的URL:

   https://login.weixin.qq.com/qrcode/{0} 

生成二维码的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&_=1523003695511 

长轮询的URL【监听是否扫码的URL】:

https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=AY0FL0UZwA==&tip=1&r=1700853510&_=1523012536082 

二维码组成:

生成二维码的URL

监听后台是否扫描二维码的URL:

长轮询的URL【Ajax请求】:

https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=AY0FL0UZwA==&tip=1&r=1700853510&_=1523012536082 

状态码分析

状态码 # 201: 扫码,未确认

# 200: 扫码,确认

# 408: pengding请求结束

# 400:  pending中

消息接收分析

获取pass_ticket请求URL:

https://wx.qq.com/cgi-bin/mmwebwx-bin/[email protected]_0&uuid=QY2NxTcDcw==&lang=zh_CN&scan=1523018755&fun=new&version=v2&lang=zh_CN 

获取一个票据【内有pass_ticket凭据】

 <error>
	<ret>0</ret>
	<message></message>
	<skey>@crypt_317889ae_68dfe71ead4387706d86b05e68a8c467</skey>
	<wxsid>/QEleZmXf4vzAkHb</wxsid>
	<wxuin>1466456560</wxuin>
	<pass_ticket>cDQsACmeE%2FDaGGJHEHywz</pass_ticket>
	<isgrayscale>1</isgrayscale>
</error>

用户初始化:登录并且获取最近联系人以及公众号

用户初始化URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1687552055&lang=zh_CN&pass_ticket=eSd509Kzdhcw4%252BDOYB7s0iV8ik2D%252FxYdOL5fwTSm9cvAaa7sLxZoz3mE88unS4sT 

获取联系人列表【Ajax请求】:每个人的用户唯一ID,用户名

获取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=iH0mJhfpq1FrP44X18ovjrVFJfYqEszXSXGuuknxYJ4MATxoaFuPys&r=152302957&seq=0&[email protected]_29c62c055f8ff7e6d66c2fa05fb7 

发送或接受消息:

获取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=WGuxtLFLPXUiXteMkgmTmSeq5BPUJlEdXk92%252FtnYEGnj3fnB8K3%252ByODprlQBNC9u 

Pass_ticket

用户初始化:

用户初始化URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1687552055&lang=zh_CN&pass_ticket=eSd509Kzdhcw4%252BDOYB7s0iOL5fwTSm9cvAaaE88unS4sT 

   注意:这里的请求Request_payload代表的就是JSON请求

获取联系人列表:

获取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=iH0mJhfpq1FrP44X18ovjrVFJfYqEszXSXGuuknxYJ4MATxoaFuPys&r=152302957&seq=0&[email protected]_29c62c055f8ff7e6d66c2fa05fb7 

接受消息的状态码:

消息接收:

发送消息:

解决发送消息中文乱码问题:

【辅助学习】Python学习---Django的request.post源码分析

中文乱码问题解决:方案一:

form_data = {
    ‘BaseRequest‘: {
        ‘DeviceID‘: ‘e531777446530354‘,
        ‘Sid‘: TICKET_DICT[‘wxsid‘],
        ‘Skey‘: TICKET_DICT[‘skey‘],
        ‘Uin‘: TICKET_DICT[‘wxuin‘]
    },
    ‘Msg‘: {
        "ClientMsgId": str(time.time()),
        # "Content": ‘%(content)s‘,   # 方案二用
        "Content": msg,  # 方案一直接传递内容
        "FromUserName": from_user_id,
        "LocalID": str(time.time()),
        "ToUserName": to_user_id,
        "Type": 1
    },
    ‘Scene‘: 0
}
import json
form_data_str = json.dumps(form_data, ensure_ascii=False)
form_data_bytes = bytes(form_data_str, encoding=‘utf-8‘)
all_cookie_dict = {}
all_cookie_dict.update(LOGIN_COOKIE_DICT)
all_cookie_dict.update(TICKET_COOKIE_DICT)
# 因为我们data发送的字符串,但是微信用的是JSON格式,所以我们需要自己添加请求头
# 告诉服务器,我发送的是data数据,且是以JSON格式发送  ==》 等价于发送了JSON格式数据
# requests.post(url, json={‘key‘:‘value"})  ==> requests.post(url, data={‘key‘:‘value"} ,headers={‘Content-Type‘: ‘application/json‘})
response = requests.post(send_url, data=form_data_bytes, cookies=all_cookie_dict, headers={
    ‘Content-Type‘: ‘application/json‘})

中文乱码问题解决:方案二:

form_data = {
    ‘BaseRequest‘: {
        ‘DeviceID‘: ‘e531777446530354‘,
        ‘Sid‘: TICKET_DICT[‘wxsid‘],
        ‘Skey‘: TICKET_DICT[‘skey‘],
        ‘Uin‘: TICKET_DICT[‘wxuin‘]
    },
    ‘Msg‘: {
        "ClientMsgId": str(time.time()),
        "Content": ‘%(content)s‘,   # 方案二用
        # "Content": msg, # 方案一用
        "FromUserName": from_user_id,
        "LocalID": str(time.time()),
        "ToUserName": to_user_id,
        "Type": 1
    },
    ‘Scene‘: 0
}
import json
# form_data_str是字符串
form_data_str = json.dumps(form_data)
# 字符串进行格式化
form_data_str = form_data_str % {‘content‘: msg}  # content是上面字典中的占位符号
# 字符串转换成字节
form_data_bytes = bytes(form_data_str, encoding=‘utf-8‘)
all_cookie_dict = {}
all_cookie_dict.update(LOGIN_COOKIE_DICT)
all_cookie_dict.update(TICKET_COOKIE_DICT)
# 因为我们data发送的字符串,但是微信用的是JSON格式,所以我们需要自己添加请求头
# 告诉服务器,我发送的是data数据,且是以JSON格式发送  ==》 等价于发送了JSON格式数据
# requests.post(url, json={‘key‘:‘value"})  ==> requests.post(url, data={‘key‘:‘value"} ,headers={‘Content-Type‘: ‘application/json‘})
response = requests.post(send_url, data=form_data_bytes, cookies=all_cookie_dict, headers={
    ‘Content-Type‘: ‘application/json‘})

【辅助学习】Python学习---JSON补充内容[中文编码 + dumps解析]

微信接收消息

接收消息的URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=PdtuiorPozsWH4r3&[email protected]_29bab75e_c405fdf274568e5d5cb96e945449d5bc&pass_ticket=FqGrU0jBkvsmxIRa%252BtbaI8eUWScVv3DKAIAQrHoVLOYJ73AInLYuzs097cDgr4iR

检查接收消息类型URL:

https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=1523357524934&skey=%40crypt_29bab75e_c405fdf274568e5d5cb96e945449d5bc&sid=PdtuiorPozsWH4r3&uin=1600696821&deviceid=e262718862528046&synckey=1_683967369%7C2_683969564%7C3_683969533%7C11_683969510%7C201_1523357498%7C1000_1523351282%7C1001_1523351354%7C2001_1523351252%7C2002_1523332191&_=1523355846860

无法获取用户列表问题解决:

Web微信二维码的实现

更多参考

原文地址:https://www.cnblogs.com/ftl1012/p/9425458.html

时间: 2024-08-22 02:51:43

Python学习---模拟微信网页登录180410的相关文章

微信开发笔记——微信网页登录授权,获取用户信息

最近做了一个公司的微信的公众号,对微信的流程清楚了不少,这里记录下,算不上多高深的,只希望能帮助到一部分人吧. 我们公司的测试微信公众号:NPCgo 可以感受下,哈哈~~ 闲话少说,开始: 首先大家要看下微信的API文档. 微信网页授权,获取用户的微信官方API文档地址:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 三次握手微信认证流程(我自己简称三次握手): 1.用户同意授权,获取code 2.通过c

VC显示网页验证码、模拟CSDN网页登录

摘要:by:koma 这两天,本来想花点时间研究一下QQ空间.农场外挂,于是抓包分析一了下,只可惜,在QQ网页登录时进行了加密处理,可惜我对网页编程一窍不通.有些朋友曾讲过那些是通过JS代码进行加密,可惜我JS也是一片空白,真是出师未杰身先死,惭愧惭愧...... 于...by:koma 这两天,本来想花点时间研究一下QQ空间.农场外挂,于是抓包分析一了下,只可惜,在QQ网页登录时进行了加密处理,可惜我对网页编程一窍不通.有些朋友曾讲过那些是通过JS代码进行加密,可惜我JS也是一片空白,真是“出

Python学习之微信公众号接入 一 验证

最近看了些Python的书,但是感觉没有什么进步,想做点事情试试,刚好我以前弄了一个微信公众号,好久不管理了 这次就用它来练练手. 看网上有些教程告诉怎么弄的,我弄了半天终于把验证这步通过了,记录一下: 微信公众号名称:今天做了没 微信公众号:now-to-do 有兴趣的可以加一下,虽然其实没有什么功能呢. 我参考的是这些内容: http://www.yangyanxing.com/?p=859 http://ke.qq.com/video/index.html?course_id=21303

微信网页登录Tips

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 以这篇文章为例,一般都是用户在第三方app中登录时,由第三方去申请资源服务器的登录权限等.即用户在云打印的app中申请google的登录权限. 微信公众平台的网页授权其实本质也是一样. 公众号本质就是一个第三方app,从每个公众号都有一个appId和一个appSerect也可以看出. 公众号其实并不知道关注它的用户的基本信息,它只知道关注用户的一个openId而已, 所以公众号想要获取用户

Python学习之微信公众号接入 二 回显用户消息

刚才弄完了,验证了,现在就开始弄个简单的东西.在UNIX网络编程中一般都是写一个回显的功能, 这里也写成一个回显的. http://www.yangyanxing.com/?p=859这是我照着他的试的 http://sae.sina.com.cn/doc/python/tutorial.html这个是SAE的开发文档,可以直接在里面搜web.py就可以 看到大小写熟悉的东西. 其实我是完全按照上面地址的那个教程里做的,但是遇到了些问题,不过最后处理了,不过其实还有不懂的,就像 中文的问题.下面

python学习一:用户登录

一,用户登录需求: 1,用户名,密码要保存在文件中. 2,用户可以尝试登录三次,三次之后账户锁定,用户锁定信息保存在文件中,用户输入正确重置锁定信息. 程序代码: #!/usr/bin/env python# -*- coding:utf-8 -*-username = [] #-----------------------------------------------for line in open('user.txt'): line=line.replace('\n','').split(

Python学习之微信公众号接入 四 操作MySql

先记下一个学习的,可以参考他的来使用. http://bookshadow.com/weblog/2014/02/05/sae-python-dbhandler/ 今天有点晚了,明天再练习.

Python学习之简单网页爬虫

0x00案例   爬取博客园某页面的所有图片并下载到本地 连续搞了一周的python,收获颇多,主要还是锻炼了自己的脾气...话不多说,先贴上脚本 #coding:utf-8 import urllib2 import re url="https://www.cnblogs.com/peterpan0707007/p/7620048.html" headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:59.0) Ge

Python学习 第一天——用户名登录退出

 首先使用input获取用户名和用户密码,然后将获取的信息和计算机已存储的信息作比对.如果信息正确,则欢迎用户.用户共有三次输入机会,错误次数一旦超过三次,就会锁定用户. 1 #coding=utf-8 2 #Version:python 3.6.0 3 #Tools:Pycharm 2017.3.2 4 _date_ = '2018/4/15/015 17:04' 5 _author_ = 'Hongyong' 6 7 bob_username = "bob" 8 bob_passw