python实现扫码登录快手网页版
一、找到生成登录二维码地址获取参数
- 利用抓包软件找到二维码地址
loginurl = 'https://id.kuaishou.com/rest/c/infra/ks/qr/start'
- 通过观察可以获取POST参数
sid: kuaishou.web.cp.api
- 进行访问获取所需要参数
- imageData(二维码图片)
- qrLoginToken
- qrLoginSignature
headers = {'User-Agent': agent.get_user_agents()}
session = requests.session()
loginurl = 'https://id.kuaishou.com/rest/c/infra/ks/qr/start'
urldata = session.post(loginurl, data={"sid": "kuaishou.web.cp.api"},headers=headers).json()
#输出urldata = {'result': 1, 'expireTime': 1614817576755, 'qrLoginSignature': '3l……', 'imageData': 'iVBORw0KGgo……', 'callback': '', 'qrLoginToken': 'bX……', 'sid': 'kuaishou.web.cp.api'}
- 获取了二维码图片后进行扫码操作
class showpng(Thread):
def __init__(self, data):
Thread.__init__(self)
self.data = data
def run(self):
img = Image.open(BytesIO(self.data))
img.show()
testpng = base64.b64decode(urldata['imageData'])
t = showpng(testpng)
t.start()
- 弹出二维码进行扫码确认
二、找到第二个确认链接地址
- 通过抓包软件我们可以找到确认链接地址
tokenurl = 'https://id.kuaishou.com/rest/c/infra/ks/qr/scanResult'
tokendate = session.post(tokenurl, data={"qrLoginToken": token, "qrLoginSignature": Signat}, headers=headers).json()
#输出tokendate = '{'result': 1, 'user': {'following': True, 'eid': '3x……', 'headurls': [{'cdn': 'tx2.a.yximgs.com', 'url': 'https://……'}, {'cdn': 'js2.a.yximgs.com', 'url': 'htt……'}], 'headurl': 'https……', 'visitorBeFollowed': False, 'user_sex': 'M', 'user_id': 3……, 'user_name': '叶……'}}
'
- 通过上访问输出可以看出已经获取了登录后的用户信息,但是并没有真正获取到登录后用户Cookies值
- 我们再继续寻找第二个第三个链接……通过抓包软件我找到三个链接地址,通过层层访问才最终找到真正的cookies值
需要的参数有 qrLoginToken、qrLoginSignature
第一个链接:https://id.kuaishou.com/rest/c/infra/ks/qr/acceptResult
通过第一个链接获取了参数 qrToken,然后进行访问
第二个链接: https://id.kuaishou.com/pass/kuaishou/login/qr/callback
通过第一个链接获取了参数kuaishou.web.cp.api.at,然后再进行访问
第三个链接:https://www.kuaishou.com/account/login/api/verifyToken
最后生成了需要的cookies值
tokenurl = 'https://id.kuaishou.com/rest/c/infra/ks/qr/scanResult'
session.post(tokenurl, data={"qrLoginToken": token, "qrLoginSignature": Signat}, headers=headers)
date = session.post('https://id.kuaishou.com/rest/c/infra/ks/qr/acceptResult', data={"qrLoginToken": token, "qrLoginSignature": Signat, "sid": "kuaishou.web.cp.api"}, verify=False)
date1 = session.post('https://id.kuaishou.com/pass/kuaishou/login/qr/callback', data={"qrToken": date.json()['qrToken'], "sid": "kuaishou.web.cp.api"}, verify=False)
session.post('https://www.kuaishou.com/account/login/api/verifyToken', json={"authToken": date1.json()['kuaishou.web.cp.api.at'], "sid": "kuaishou.web.cp.api"}, verify=False, headers=headers)
三、最后保存cookies值并进行验证
完整代码
# -*- coding: utf-8 -*-
import base64
import agent
from threading import Thread
import time
import requests
from io import BytesIO
import http.cookiejar as cookielib
from PIL import Image
import os
requests.packages.urllib3.disable_warnings()
headers = {'User-Agent': agent.get_user_agents()}
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.post("https://cp.kuaishou.com/rest/pc/authority/account/current", json={"kuaishou.web.cp.api_ph": "2ab04b8a59d843e385faa6a4965f0836f53f"}, verify=False, headers=headers).json()
if loginurl['result'] == 1:
print('Cookies值有效,无需扫码登录!')
return session, True
else:
print('Cookies值已经失效,请重新扫码登录!')
return session, False
def kslogin():
if not os.path.exists('kscookies.txt'):
with open("kscookies.txt", 'w') as f:
f.write("")
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='kscookies.txt')
session, status = islogin(session)
if not status:
loginurl = 'https://id.kuaishou.com/rest/c/infra/ks/qr/start'
urldata = session.post(loginurl, data={"sid": "kuaishou.web.cp.api"}, headers=headers).json()
testpng = base64.b64decode(urldata['imageData'])
token = urldata['qrLoginToken']
Signat = urldata['qrLoginSignature']
t = showpng(testpng)
t.start()
tokenurl = 'https://id.kuaishou.com/rest/c/infra/ks/qr/scanResult'
while 1:
tokendate = session.post(tokenurl, data={"qrLoginToken": token, "qrLoginSignature": Signat}, headers=headers).json()
if tokendate['result'] == 707:
print('登录二维码已过期,请重新运行!')
if tokendate['result'] == 1:
date = session.post('https://id.kuaishou.com/rest/c/infra/ks/qr/acceptResult', data={"qrLoginToken": token, "qrLoginSignature": Signat, "sid": "kuaishou.web.cp.api"}, headers=headers)
date1 = session.post('https://id.kuaishou.com/pass/kuaishou/login/qr/callback', data={"qrToken": date.json()['qrToken'], "sid": "kuaishou.web.cp.api"}, headers=headers)
session.post('https://www.kuaishou.com/account/login/api/verifyToken', json={"authToken": date1.json()['kuaishou.web.cp.api.at'], "sid": "kuaishou.web.cp.api"}, headers=headers)
print('已确认,登录成功!')
break
time.sleep(3)
session.cookies.save()
return session
if __name__ == '__main__':
kslogin()
四、更多文章
- 后期小编将开设登录后批量采集各平台数据(点赞、播放量、评论、图片、视频、音乐等)专栏文章!记得关注哟!😜
- 如果文章能帮到您,愿意给小编点个 赞 👍 吗,么么哒~😘 (●’◡’●)