首页 > 编程问答 >为什么我的 HTTP 请求代码需要在 PowerShell 上运行一次才能在 Python 上正常工作?

为什么我的 HTTP 请求代码需要在 PowerShell 上运行一次才能在 Python 上正常工作?

时间:2024-07-29 03:48:40浏览次数:10  
标签:python powershell http python-requests get

下面的代码只是一个演示,我有一个http函数来获取新的'log-uid'和'ASP.NET_SessionId',然后将它们放入cookie中,但是如果我直接运行python代码,响应是'{data:不登录}'

cookies = {  
    'log-uid': '**new log-uid example**',  
    'ASP.NET_SessionId': '**new sessionid example**'  
}
response = requests.get('https://www.example.com/loadUserInfo', cookies=cookies)  

但是如果我先在 PowerShell 上运行这个(从 chrome devTools 复制),那么 python 代码就可以工作

$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
$session.Cookies.Add((New-Object System.Net.Cookie("log-uid", "**new log-uid example**", "/", "mmbimg.manmanbuy.com")))
$session.Cookies.Add((New-Object System.Net.Cookie("ASP.NET_SessionId", "**new sessionid example**", "/", "mmbimg.manmanbuy.com")))
Invoke-WebRequest -UseBasicParsing -Uri "https://www.example.com/loadUserInfo" `
-WebSession $session `
-Headers @{
  "Accept-Encoding"="gzip, deflate, br, zstd"
}

标头不会影响,除非运行 powershell 代码或加载 url,否则 python 代码不会响应正确的数据首先在浏览器上。我想知道原因是否是 powershell 和 python 处理 http 请求的方式不同?


这个问题很有意思!的确,PowerShell 和 Python 处理 HTTP 请求的方式有一些区别,但这可能不是主要原因。更可能的原因是服务器端的状态管理和一些未在代码中体现的细节。

让我们分析一下可能的原因:

  1. Cookie 域和路径: 你注意到 PowerShell 代码中设置 Cookie 的域是 "mmbimg.manmanbuy.com",而 Python 代码中没有指定域,这意味着它会使用默认的请求 URL 的域,也就是 "www.example.com"。如果服务器依赖子域名来区分 Cookie,那么 Python 代码发送的 Cookie 就不会被识别。

  2. 隐藏依赖: PowerShell 代码可能触发了服务器端的一些逻辑,例如设置了其他必要的 Cookie 或 Session 信息,而这些信息没有在你的 Python 代码中体现。换句话说,"loadUserInfo" 接口可能依赖于先前请求设置的一些状态。

  3. 浏览器行为: 你提到 "除非运行 powershell 代码或加载 url 首先在浏览器上",这暗示着浏览器可能发送了一些额外的请求或者设置了一些特殊的 Cookie,而这些信息在你的代码中没有被捕捉到。

为了找到真正的原因,建议你进行以下调试:

  1. 使用开发者工具 (DevTools) 比较: 分别使用 PowerShell 和 Python 代码发送请求,并使用浏览器的开发者工具 (DevTools) 观察网络请求,比较两者的请求头、Cookie、响应头以及响应内容。找出任何差异,特别是 Cookie 的差异。
  2. 检查服务器端日志: 如果可能的话,查看服务器端的日志,了解服务器如何处理来自 PowerShell 和 Python 的请求,以及它们之间是否存在任何区别。
  3. 逐步添加信息: 尝试将 PowerShell 代码中设置的 Cookie 和其他请求信息逐步添加到 Python 代码中,看看哪一步能够解决问题。

一些额外的建议:

  • 使用 Python 的 requests.Session 对象来保持会话状态,以便在多个请求之间共享 Cookie:
import requests

with requests.Session() as session:
    session.cookies.set('log-uid', '**new log-uid example**', domain='mmbimg.manmanbuy.com')
    session.cookies.set('ASP.NET_SessionId', '**new sessionid example**', domain='mmbimg.manmanbuy.com')
    response = session.get('https://www.example.com/loadUserInfo')

    print(response.text)
  • 使用 Python 的网络调试工具,例如 http.client urllib3 ,可以查看更详细的请求和响应信息,帮助你找到问题所在。

希望这些分析和建议能帮助你找到问题根源!

标签:python,powershell,http,python-requests,get
From: 78802262

相关文章