zoukankan      html  css  js  c++  java
  • Python学习---模拟微信网页登录180410

    WEB微信

    网页登录的猜想:

            a. 访问页面出现二维码

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

            c. 如何进行会话保持

            d. 如何获取用户列表

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

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

     image

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

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

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

    image

    注: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 

    二维码组成:

    image

    生成二维码的URL

    image

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

    长轮询的URL【Ajax请求】:

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

    image

    状态码分析

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

              # 200: 扫码,确认

              # 408: pengding请求结束

              # 400:  pending中

    image

    image

    image

    消息接收分析

    获取pass_ticket请求URL:

    https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ATsWUC3qlrRteYUWzz_8hBMH@qrticket_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&skey=@crypt_29c62c055f8ff7e6d66c2fa05fb7 

    发送或接受消息:

    获取URL:

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

    Pass_ticket

    image

    用户初始化:

        用户初始化URL:

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

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

    image

    获取联系人列表:

    获取URL:

    https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=iH0mJhfpq1FrP44X18ovjrVFJfYqEszXSXGuuknxYJ4MATxoaFuPys&r=152302957&seq=0&skey=@crypt_29c62c055f8ff7e6d66c2fa05fb7 

    image

    接受消息的状态码:

    image

    消息接收:

    image

    发送消息:

    image

    image

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

    image

    【辅助学习】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&skey=@crypt_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

    image

    image

    image

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

    image

    image

    Web微信二维码的实现

    image

    更多参考

  • 相关阅读:
    面试汇总
    Windows 环境下的 protoc 安装(转)
    Hbase 元数据一致性检查(转)
    Slow ReadProcessor&amp;Error Slow BlockReceiver错误日志分析(转)
    Hbase CMS GC 调优。
    [技术]排查线上问题
    crontab 误删恢复
    Hbase balancer RSgroup shell 脚本
    Hbase运维手册(1)
    Presto JVM.config
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9425458.html
Copyright © 2011-2022 走看看