python实现扫码登录微信公众号
一、通过研究观察找到相关链接地址
- 所需的相关参数都在链接的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()
六 、 更多文章
- 后期小编将开设登录后批量采集各平台数据(点赞、播放量、评论、图片、视频、音乐等)专栏文章!记得关注哟!😜
- 如果文章能帮到您,愿意给小编点个 赞 👍 吗,么么哒~😘 (●’◡’●)