You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)

解决方案

登录流程拆解

网站采用两步验证的登录逻辑:

  1. 第一步:验证手机号:提交手机号到授权接口,若手机号已注册,接口返回包含CSRF令牌的HTML片段;
  2. 第二步:提交完整登录凭证:使用手机号、密码+第一步获取的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)

关键注意事项

  1. 手机号格式:务必确认网站要求的格式,比如是否需要带国家码,格式错误会返回NUMBER_NOT_TRUE错误;
  2. 请求头模拟:添加User-Agent和Referer可以降低被反爬拦截的概率;
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:23:18