Python模拟登陆 —— 征服验证码 8 微信网页版

编程入门 行业动态 更新时间:2024-10-20 16:28:14

Python模拟登陆 —— 征服<a href=https://www.elefans.com/category/jswz/34/1771040.html style=验证码 8 微信网页版"/>

Python模拟登陆 —— 征服验证码 8 微信网页版

微信登录界面

微信网页版使用了UUID含义是通用唯一识别码来保证二维码的唯一性。
先用一个伪造的appid获得uuid。

params = {'appid': 'wx782c26e4c19acffb','fun': 'new','lang': 'zh_CN','_': int(time.time()),}

不伪造的话,会有400错误,拿不到uuid。

二维码在网页源代码也是查不到的,这时就需要uuid了。

url = '/' + uuid

微信的登录需要多次请求数据,并根据返回的数据进行提取。
扫码成功的返回如果是200,证明扫码成功。

然后需要模拟微信的初始化同步过程。

同步完成之后,打印通信录。

微信确实复杂!这么做的话不留下cookie,提高了安全性。web QQ的原理也差不多,毕竟一家做的。

import os
import re
import time
import sys
import subprocess
import requests
import xml.dom.minidom
import jsonsession = requests.session()
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'
}QRImgPath = os.path.split(os.path.realpath(__file__))[0] + os.sep + 'webWeixinQr.jpg'
uuid = ''
tip = 0
base_uri = ''
redirect_uri = ''
skey = ''
wxsid = ''
wxuin = ''
pass_ticket = ''
deviceId = 'e000000000000000'
BaseRequest = {}
ContactList = []
My = []
SyncKey = ''def getUUID():global uuid,sessionurl = ''params = {'appid': 'wx782c26e4c19acffb','fun': 'new','lang': 'zh_CN','_': int(time.time()),}response = session.get(url, params=params)data = response.content.decode('utf-8')# print(data) >>> window.QRLogin.code = 200; window.QRLogin.uuid = "oZwt_bFfRg==";regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"'pm = re.search(regx, data)code = pm.group(1)uuid = pm.group(2)if code == '200':return Truereturn Falsedef showQRImage():global tipurl = '/' + uuidparams = {'t': 'webwx','_': int(time.time()),}response = session.get(url, params=params)tip = 1with open(QRImgPath, 'wb') as f:f.write(response.content)f.close()if sys.platform.find('darwin') >= 0:subprocess.call(['open', QRImgPath])elif sys.platform.find('linux') >= 0:subprocess.call(['xdg-open', QRImgPath])else:os.startfile(QRImgPath)print('请使用微信扫描二维码以登录')def waitForLogin():global tip, base_uri, redirect_uriurl = '=%s&uuid=%s&_=%s' % (tip, uuid, int(time.time()))response = session.get(url)data = response.content.decode('utf-8')# print(data)# window.code=500;regx = r'window.code=(\d+);'pm = re.search(regx, data)code = pm.group(1)if code == '201':  # 已扫描print('成功扫描,请在手机上点击确认以登录')tip = 0elif code == '200':  # 已登录print('正在登录...')regx = r'window.redirect_uri="(\S+?)";'pm = re.search(regx, data)redirect_uri = pm.group(1) + '&fun=new'base_uri = redirect_uri[:redirect_uri.rfind('/')]# closeQRImageif sys.platform.find('darwin') >= 0:  # for OSX with Previewos.system("osascript -e 'quit app \"Preview\"'")elif code == '408':  # 超时pass# elif code == '400' or code == '500':return codedef login():global skey, wxsid, wxuin, pass_ticket, BaseRequestresponse = session.get(redirect_uri)data = response.content.decode('utf-8')# print(data)'''<error><ret>0</ret><message>OK</message><skey>xxx</skey><wxsid>xxx</wxsid><wxuin>xxx</wxuin><pass_ticket>xxx</pass_ticket><isgrayscale>1</isgrayscale></error>'''xml.domdoc = xml.dom.minidom.parseString(data)root = doc.documentElementfor node in root.childNodes:if node.nodeName == 'skey':skey = node.childNodes[0].dataelif node.nodeName == 'wxsid':wxsid = node.childNodes[0].dataelif node.nodeName == 'wxuin':wxuin = node.childNodes[0].dataelif node.nodeName == 'pass_ticket':pass_ticket = node.childNodes[0].data# print('skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s' % (skey, wxsid,# wxuin, pass_ticket))if not all((skey, wxsid, wxuin, pass_ticket)):return FalseBaseRequest = {'Uin': int(wxuin),'Sid': wxsid,'Skey': skey,'DeviceID': deviceId,}return Truedef webwxinit():url = base_uri + \'/webwxinit?pass_ticket=%s&skey=%s&r=%s' % (pass_ticket, skey, int(time.time()))params = {'BaseRequest': BaseRequest}h = headersh['ContentType'] = 'application/json; charset=UTF-8'response = session.post(url, data=json.dumps(params), headers=h)data = response.content.decode('utf-8')#print(data)global ContactList, My, SyncKeydic = json.loads(data)ContactList = dic['ContactList']My = dic['User']SyncKeyList = []for item in dic['SyncKey']['List']:SyncKeyList.append('%s_%s' % (item['Key'], item['Val']))SyncKey = '|'.join(SyncKeyList)ErrMsg = dic['BaseResponse']['ErrMsg']Ret = dic['BaseResponse']['Ret']if Ret != 0:return Falsereturn Truedef webwxgetcontact():url = base_uri + \'/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (pass_ticket, skey, int(time.time()))h = headersh['ContentType'] = 'application/json; charset=UTF-8'response = session.get(url, headers=h)data = response.content.decode('utf-8')# print(data)dic = json.loads(data)MemberList = dic['MemberList']# 倒序遍历,不然删除的时候出问题..SpecialUsers = ["newsapp", "fmessage", "filehelper", "weibo", "qqmail", "tmessage", "qmessage", "qqsync", "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp", "masssendapp","meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder", "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxitil", "userexperience_alarm"]for i in range(len(MemberList) - 1, -1, -1):Member = MemberList[i]if Member['VerifyFlag'] & 8 != 0:  # 公众号/服务号MemberList.remove(Member)elif Member['UserName'] in SpecialUsers:  # 特殊账号MemberList.remove(Member)elif Member['UserName'].find('@@') != -1:  # 群聊MemberList.remove(Member)elif Member['UserName'] == My['UserName']:  # 自己MemberList.remove(Member)return MemberListdef main():if not getUUID():print('获取uuid失败')returnshowQRImage()time.sleep(1)while waitForLogin() != '200':passos.remove(QRImgPath)if not login():print('登录失败')return#登录完成, 下面查询好友if not webwxinit():print('初始化失败')returnMemberList = webwxgetcontact()print('通讯录共%s位好友' % len(MemberList))for x in MemberList :sex = '未知' if x['Sex'] == 0 else '男' if x['Sex'] == 1 else '女'print('昵称:%s, 性别:%s, 备注:%s, 签名:%s' % (x['NickName'], sex, x['RemarkName'], x['Signature']))if __name__ == '__main__':print('开始')main()

更多推荐

Python模拟登陆 —— 征服验证码 8 微信网页版

本文发布于:2024-03-23 15:31:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1739811.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:验证码   网页   Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!