使用Python发送POST请求调用Mullvad接口返回403错误求助
解决Mullvad登录接口POST请求403错误的方案
核心问题分析
- 请求格式不匹配:你提到表单采用
multipart/form-data格式,但代码中使用data=data参数,requests默认会将其编码为application/x-www-form-urlencoded,与目标格式不符。 - 缺失CSRF令牌:多数网站会要求CSRF token防止跨站请求伪造,你的请求未携带该参数,直接被服务器拒绝。
- 请求头与Cookie不完整:除User-Agent和Referer外,还需携带登录页面返回的Cookie,且Referer应指向登录页面而非谷歌搜索结果。
修正后的代码示例
import requests as r from bs4 import BeautifulSoup # 初始化会话,自动维持Cookie session = r.Session() login_page_url = "https://mullvad.net/fr/account/login" # 第一步:访问登录页面,获取CSRF token和会话Cookie response = session.get(login_page_url) soup = BeautifulSoup(response.text, 'html.parser') # 从页面隐藏字段中提取CSRF令牌 csrf_token = soup.find('input', {'name': 'csrfmiddlewaretoken'})['value'] # 准备表单数据,包含所有必填字段 form_data = { 'account_number': '0000000000000000', 'csrfmiddlewaretoken': csrf_token, # 若页面有提交按钮字段,需补充,比如'submit': 'Login',具体看页面源码 } # 设置正确的请求头 headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0', 'Referer': login_page_url } # 发送POST请求,会话自动携带Cookie response = session.post(login_page_url, data=form_data, headers=headers) # 若需严格遵循multipart/form-data格式,可改用files参数 # files = { # 'account_number': (None, '0000000000000000'), # 'csrfmiddlewaretoken': (None, csrf_token) # } # response = session.post(login_page_url, files=files, headers=headers) print(response.status_code) print(response.text[:500]) # 查看部分响应内容验证结果
关键注意事项
- 必须先获取CSRF令牌:直接发送POST请求会被服务器拦截,需先GET登录页面,从HTML源码中提取隐藏的CSRF字段值。
- 使用Session维持会话:Session会自动保存并携带Cookie,多数网站依赖Cookie跟踪会话状态。
- 确保表单字段完整:查看登录页面的HTML源码,确认所有必填表单字段都已包含在请求数据中。
- 控制请求频率:频繁自动化请求可能触发反爬机制,导致IP被封禁,测试时注意请求间隔。
内容的提问来源于stack exchange,提问作者Blackax
相关产品推荐
相关产品推荐

