如何使用Python的requests库登录dikidi.ru网站?
如何用Python的requests库完成dikidi.ru网站登录?
问题描述
我需要登录dikidi.ru的商家后台,授权请求接口是https://auth.dikidi.ru/ajax/check/auth/。
我写的初始requests代码如下:
import requests with requests.Session() as session: url = 'https://auth.dikidi.ru/ajax/check/auth/' data = { 'number': '手机号', 'password': '密码' } response = session.post(url, data=data) print(response.text)
不同请求场景的响应情况:
- 提交错误手机号时,返回符合预期的JSON错误:
{"error":{"code":"NUMBER_NOT_TRUE","message":"Probably you entered incorrect number"},"data":{}} - 提交未注册手机号时,返回HTML页面代码;
- 提交本人已注册手机号时,返回包含“忘记密码?”的HTML片段,响应内容如下:
{"container":".modal.auth .pocket","html":"<div class=\"login\" data-perform=\"sw.auth.login(this)\">\n\t<input type=\"hidden\" name=\"csrf\" value=\"303c7a1cd02e773cfc7122e111215802:1747001155.2483\" />\n\t<div class=\"form-group\">\n\t <label>Password</label>\n\t <input type=\"password\" name=\"password\" class=\"form-control no-cleaning\" tabindex=\"2\" />\n\t <a class=\"forgot\"><strong>Forgot your password?</strong></a>\n\t</div>\n </div> \n"}
我理解网站的逻辑是先验证手机号是否存在,存在则要求输入密码。但Selenium无法正常输入手机号,所以想请教如何用requests库完成登录。
尝试过的Selenium代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome() driver.get("https://dikidi.ru/en/business") driver.find_element(By.PARTIAL_LINK_TEXT, "Login / Registration").click() time.sleep(1) driver.find_element(By.PARTIAL_LINK_TEXT, "Phone number").click() time.sleep(1) number = driver.find_element(By.ID, 'number') number.send_keys('不带国家码的手机号') time.sleep(10)
解决方案
登录流程拆解
网站采用两步验证的登录逻辑:
- 第一步:验证手机号:提交手机号到授权接口,若手机号已注册,接口返回包含CSRF令牌的HTML片段;
- 第二步:提交完整登录凭证:使用手机号、密码+第一步获取的CSRF令牌,再次提交请求完成登录。
具体实现代码
import requests import re # 初始化会话,保持Cookie连贯性 session = requests.Session() # 先访问主站获取初始Cookie,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "Referer": "https://dikidi.ru/en/business" } session.get("https://dikidi.ru/en/business", headers=headers) # 第一步:提交手机号,获取CSRF令牌 auth_url = "https://auth.dikidi.ru/ajax/check/auth/" phone_data = { "number": "你的手机号(需符合网站格式,比如俄罗斯地区带+7)", "password": "" # 首次提交密码可留空,仅验证手机号 } response = session.post(auth_url, data=phone_data, headers=headers) # 解析响应中的CSRF令牌 if response.status_code == 200 and "csrf" in response.text: csrf_match = re.search(r'name="csrf" value="([^"]+)"', response.json()['html']) if csrf_match: csrf_token = csrf_match.group(1) print(f"获取到CSRF令牌: {csrf_token}") # 第二步:提交完整登录信息 login_data = { "number": "你的手机号", "password": "你的密码", "csrf": csrf_token } login_response = session.post(auth_url, data=login_data, headers=headers) # 验证登录结果:访问商家后台首页,检查是否出现登录态标识 test_response = session.get("https://dikidi.ru/en/business", headers=headers) if "Logout" in test_response.text: print("登录成功") else: print("登录失败,响应内容:", login_response.text) else: print("未从响应中提取到CSRF令牌") else: print("手机号验证失败,响应内容:", response.text)
关键注意事项
- 手机号格式:务必确认网站要求的格式,比如是否需要带国家码,格式错误会返回
NUMBER_NOT_TRUE错误; - 请求头模拟:添加
User-Agent和Referer可以降低被反爬拦截的概率; - CSRF提取优化:如果正则匹配不稳定,可以改用
BeautifulSoup解析HTML片段,代码示例:from bs4 import BeautifulSoup soup = BeautifulSoup(response.json()['html'], 'html.parser') csrf_token = soup.find('input', {'name': 'csrf'})['value']
内容的提问来源于stack exchange,提问作者SY DIE
相关产品推荐
相关产品推荐

