Python扫码登录保存和验证cookies值——微信公众号篇(四)

一、通过研究观察找到相关链接地址

  • 所需的相关参数都在链接的cookie里面,无需提取但需要session类累计保存运行
  • 第一个生成需要的相关参数的链接地址

访问:https://mp.weixin.qq.com/
获取:ua_id值

session = requests.session()
session.get('https://mp.weixin.qq.com/', headers=headers)
print(session.cookies)
#输出能获取ua_id=yHRNpHnt7bFVbqx……
  • 第二个生成需要的相关参数的链接地址

访问:https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startloginhttps://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin
获取:uuid值

  • 该网址是通过POST访问,找到date参数就可以访问
  • date 有个变量值sessionid,通过观察该变量值是时间戳,可以用:int(time.time() * 1000)代替
session = requests.session()
session.get('https://mp.weixin.qq.com/', headers=headers)
session.post('https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin', data='userlang=zh_CN&redirect_url=&login_type=3&sessionid={}&token=&lang=zh_CN&f=json&ajax=1'.format(int(time.time() * 1000)),  headers=headers)
print(session.cookies)
#输出获取两个cookies ua_id=NW13T3J20qDl2V…… uuid=61663af89f……

二、通过上面两个值再运行访问二维码链接地址

  • 找到生成的二维码链接
loginurl = 'https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=getqrcode&random={}'.format(int(time.time() * 1000))
  • 发现网址中random值也是时间戳,同上方法
  • 打开二维图片码进行扫码操作,同上篇方法
class showpng(Thread):
    def __init__(self, data):
        Thread.__init__(self)
        self.data = data
    def run(self):
        img = Image.open(BytesIO(self.data))
        img.show()

session = requests.session()
session.get('https://mp.weixin.qq.com/', headers=headers)
session.post('https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin', data='userlang=zh_CN&redirect_url=&login_type=3&sessionid={}&token=&lang=zh_CN&f=json&ajax=1'.format(int(time.time() * 1000)), headers=headers)
loginurl = session.get('https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=getqrcode&random={}'.format(int(time.time() * 1000)))
t = showpng(loginurl.content)
t.start()

三、找到扫码后确认链接地址

  • 通过观察下面是确认链接地址,cookie参数自动带入中,无其他参数
lateurl = 'https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1'
  • 通过session类作用下,可直接访问
dateurl = 'https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1'
        while 1:
            date = session.get(dateurl).json()
            if date['status'] == 0:
                print('二维码未失效,请扫码!')
            elif date['status'] == 6:
                print('已扫码,请确认!')
            if date['status'] == 1:
                print('已确认,登录成功!')
    time.sleep(3)
#输出date = {'acct_size': 0, 'base_resp': {'err_msg': 'ok', 'ret': 0}, 'status': 0, 'user_category': 0}
#通过测试判断参数数值的作用。

四、找到最后访问链接地址获取真正登录信息

  • 利用抓包软件找到了最后一个链接地址,确保获取最终cookies
  • 也是通过post访问,找到链接地址和访问参数就可以获取下一步参数
date = 'userlang=zh_CN&redirect_url=&cookie_forbidden=0&cookie_cleaned=1&plugin_used=0&login_type=3&token=&lang=zh_CN&f=json&ajax=1'
url = 'https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login'
url = session.post('https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login', data='userlang=zh_CN&redirect_url=&cookie_forbidden=0&cookie_cleaned=1&plugin_used=0&login_type=3&token=&lang=zh_CN&f=json&ajax=1', headers=headers).json()
#输出url = {'base_resp': {'err_msg': 'ok', 'ret': 0}, 'redirect_url': '/cgi-bin/home?t=home/index&lang=zh_CN&token=10……'}
  • 通过上面链接访问,获取了参数值:redirect_url
  • 用redirect_url值再前面加上:https://mp.weixin.qq.com
session.get('https://mp.weixin.qq.com{}'.format(url['redirect_url']), headers=headers)
#访问这个链接才是最后登录信息cookies值

五、最后保存cookies值并进行验证是否有效或登录状态

  • 保存cookie和验证cookie就不详细介绍,直接出完整代码可以看懂

完整代码

# -*- coding: utf-8 -*-
import pickle
import agent
from threading import Thread
import time
import requests
from io import BytesIO
from PIL import Image
import os

requests.packages.urllib3.disable_warnings()

headers = {'User-Agent': agent.get_user_agents(), 'Referer': "https://mp.weixin.qq.com/","Host": "mp.weixin.qq.com"}


class showpng(Thread):
    def __init__(self, data):
        Thread.__init__(self)
        self.data = data

    def run(self):
        img = Image.open(BytesIO(self.data)) 
        img.show()

def islogin(session):
    try:
        session.cookies.load(ignore_discard=True)
    except Exception:
        pass
    loginurl = session.get("https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1").json()
    if loginurl['base_resp']['ret'] == 0:
        print('Cookies值有效,无需扫码登录!')
        return session, True
    else:
        print('Cookies值已经失效,请重新扫码登录!')
        return session, False

def gzhlogin():
    # 写入
    session = requests.session()
    if not os.path.exists('gzhcookies.cookie'):
        with open('gzhcookies.cookie', 'wb') as f:
            pickle.dump(session.cookies, f)
    # 读取
    session.cookies = pickle.load(open('gzhcookies.cookie', 'rb'))
    session, status = islogin(session)
    if not status:
        session = requests.session()
        session.get('https://mp.weixin.qq.com/', headers=headers)
        session.post('https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin', data='userlang=zh_CN&redirect_url=&login_type=3&sessionid={}&token=&lang=zh_CN&f=json&ajax=1'.format(int(time.time() * 1000)), headers=headers)
        loginurl = session.get('https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=getqrcode&random={}'.format(int(time.time() * 1000)))
        dateurl = 'https://mp.weixin.qq.com/cgi-bin/scanloginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1'
        t = showpng(loginurl.content)
        t.start()
        while 1:
            date = session.get(dateurl).json()
            if date['status'] == 0:
                print('二维码未失效,请扫码!')
            elif date['status'] == 6:
                print('已扫码,请确认!')
            if date['status'] == 1:
                print('已确认,登录成功!')
                url = session.post('https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login', data='userlang=zh_CN&redirect_url=&cookie_forbidden=0&cookie_cleaned=1&plugin_used=0&login_type=3&token=&lang=zh_CN&f=json&ajax=1', headers=headers).json()
                session.get('https://mp.weixin.qq.com{}'.format(url['redirect_url']), headers=headers)                
                break
            time.sleep(2)
        with open('gzhcookies.cookie', 'wb') as f:
            pickle.dump(session.cookies, f)
    return session


if __name__ == '__main__':
    gzhlogin()

六 、 更多文章

  1. 抖音篇(一)
  2. 快手篇(二)
  3. 微视篇(三)
  4. 微博篇(五)
  5. B站篇(六)
  6. 视频号篇(七)
  • 后期小编将开设登录后批量采集各平台数据(点赞、播放量、评论、图片、视频、音乐等)专栏文章!记得关注哟!😜
  • 如果文章能帮到您,愿意给小编点个 👍 吗,么么哒~😘 (●’◡’●)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值