Python传递request变量实现站点登录遇NO_REQUEST_VARIABLE错误求解
问题分析与解决方案
你遇到的核心问题是请求体的编码方式不符合服务器要求。虽然抓包看到的请求体是JSON结构,但因为Content-Type是application/x-www-form-urlencoded,服务器期望的是键值对形式的urlencoded数据,而非纯JSON字符串。你之前的代码可能直接发送了JSON字符串,导致服务器无法解析出request变量,从而返回"NO_REQUEST_VARIABLE"错误。
解决步骤
1. 确认原始请求体格式
先在Firefox抓包工具中切换到「原始」标签,查看实际发送的请求体内容,通常会是以下两种形式之一:
- 拆分的键值对:
request=login&data=%7B%22login%22%3A%22asd%22%2C%22password%22%3A%22asdasd%22%7D - 整个JSON作为单个参数值:
payload=%7B%22request%22%3A%22login%22%2C%22data%22%3A%7B%22login%22%3A%22asd%22%2C%22password%22%3A%22asdasd%22%7D%7D
2. 调整Requests代码
根据原始请求体格式选择对应的代码:
情况1:拆分键值对格式
import requests url = "http://IP:PORT/" # 构造URL参数:键为{"request":"postRequest"},值为空 url_params = { '{"request":"postRequest"}': '' } # 构造请求体的键值对,data值为JSON字符串 post_data = { "request": "login", "data": '{"login":"asd","password":"asdasd"}' } headers = { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } response = requests.post(url, params=url_params, data=post_data, headers=headers) print(response.text)
情况2:整个JSON作为单个参数
import requests url = "http://IP:PORT/" url_params = { '{"request":"postRequest"}': '' } # 将完整JSON字符串作为某个参数的值 post_data = { "payload": '{"request":"login","data":{"login":"asd","password":"asdasd"}}' } headers = { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } response = requests.post(url, params=url_params, data=post_data, headers=headers) print(response.text)
3. 额外注意事项
- 确保URL参数
{"request":"postRequest"}=被正确传递,使用params字典可以避免手动编码错误。 - 如果服务器有验证机制,可能需要添加其他必要请求头(如
User-Agent、Cookie等),可以从Firefox抓包结果中复制对应头信息补充到代码里。
内容的提问来源于stack exchange,提问作者roll
相关产品推荐
相关产品推荐

