小红书扫码登录协议分析实现
JS/爬虫逆向玩转小红书web保姆级教学—二维码登录篇
因为请求头中的x_s参数的原因,小红书二维码登录较为特别,与其他网页较为不同,但是流程还是很简单的
一、抓包
1.1 二维码获取包
POST请求 https://edith.xiaohongshu.com/api/sns/web/v1/login/qrcode/create
表单数据{"qr_type":1}
{
"code": 0,
"success": true,
"msg": "成功",
"data": {
"url": "https://www.xiaohongshu.com/mobile/login?qrId=632031729213436637&ruleId=4&xhs_code=384516×tamp=1729213436662&channel_type=web&component_id=346e2dcf0720e16a82388e1951a2b3c1",
"multi_flag": 0,
"qr_id": "632031729213436637",
"code": "384516"
}
}
msg——获取是否成功
url——二维码链接
qr_id——本次二维码登录的id
code——响应码
这个包需要保存的参数是url以及code
1.2、状态获取包
利用二维码包的qr_id、code 即可请求成功获取二维码的状态
code_status的意义如下
0——未扫码
1——已扫码,未点击确认登录
2——扫码成功
3——二维码已失效
扫码成功时,会响应登录的Cookie,注意保存
扫码成功时的响应
{
"code": 0,
"success": true,
"msg": "成功",
"data": {
"code_status": 2,
"login_info": {
"session": "040069b3ca26863c3a3104ff24354b1934e0d2",
"secure_session": "Xad03csession.040069b3ca26863c3a3104ff24354b1934e0d2",
"user_id": "62be65ce000000001b026a67"
}
}
}
二、获取二维码Python代码实现
import requests
import qrcode
def post_request_for_qr(x_s, x_s_common):
url = "https://edith.xiaohongshu.com/api/sns/web/v1/login/qrcode/create"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Content-Type": "application/json;charset=utf-8",
"X-t": "1729214251341",//时间戳
"X-s": x_s,
"X-S-Common": x_s_common,
"Origin": "https://www.xiaohongshu.com",
"Referer": "https://www.xiaohongshu.com/",
"Connection": "keep-alive",
}
data = {"qr_type": 1}
# 发送POST请求
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
result = response.json()
if result.get("code") == 0 and result.get("success"):
qr_url = result['data']['url']
return qr_url
else:
return None
else:
return None
# 生成二维码
def generate_qr_code(qr_url):
if qr_url:
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(qr_url)
qr.make(fit=True)
# 生成二维码图像
img = qr.make_image(fill='black', back_color='white')
img.show()
else:
print("无效的二维码URL")
qr_url = post_request_for_qr("your_x_s_value", "your_x_s_common_value")
generate_qr_code(qr_url)
三、注意事项
在本次扫码登录用到的每一个包都需要以下消息头,我们只需要获取X_s和X_S_Commond即可,并且,每次发送POST、GET请求时都需要更新X_s这个参数,X_S_Commond保持不变,这两个参数获取较为复杂,我将会放在本专栏的其他文章,需要的可以看看本专栏的专门获取这两个参数的文章。