【问题标题】:POST request fails to interact with sitePOST 请求无法与站点交互
【发布时间】:2019-06-13 05:59:15
【问题描述】:

我正在尝试登录名为 grailed.com 的网站并关注某个产品。下面的代码是我试过的。

下面的代码使用我的凭据成功登录。但是,每当我尝试关注产品(有效负载中的 id 是产品的 id)时,代码运行时没有任何错误,但无法关注产品。我对这种行为感到困惑。是否与 Instagram 类似(Instagram 阻止任何以编程方式与他们的网站进行交互的尝试并强制您使用他们的 API(grailed.com 没有供公众使用 AFAIK 的 API)

我尝试了以下代码(看起来与您在网站上关注时发送的 POST 请求完全一样)。

headers/data defined here
r = requests.Session()
v = r.post("https://www.grailed.com/api/sign_in", json=data,headers = headers)

headers = {
    'authority': 'www.grailed.com',
    'method': 'POST',
    "path": "/api/follows",
    'scheme': 'https',
    'accept': 'application/json',
    'accept-encoding': 'gzip, deflate, br',
    "content-type": "application/json",
    "x-amplitude-id": "1547853919085",
    "x-api-version": "application/grailed.api.v1",
    "x-csrf-token": "9ph4VotTqyOBQzcUt8c3C5tJrFV7VlT9U5XrXdbt9/8G8I14mGllOMNGqGNYlkES/Z8OLfffIEJeRv9qydISIw==",
    "origin": "https://www.grailed.com",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
payload = {
    "id": "7917017"
}
b = r.post("https://www.grailed.com/api/follows",json = payload,headers = headers)

【问题讨论】:

  • 请提供登录和产品后续的请求详情。
  • 事实上,CSRF 令牌是为防止此类使用而明确构建的。

标签: python python-3.x beautifulsoup python-requests


【解决方案1】:

如果 API 未设计为公开的,您很可能在关注标头中缺少 csrf 令牌。 您必须找到一个 CSRF 令牌,并将其添加到 /api/follows POST。 快速查看代码,这可能很难,因为一切都在 javascript 中。

【讨论】:

  • 标头中有一个 CSRF 令牌。但杂乱无章可能仍然是错误的。它必须从网站上检索,不能从某处复制。
  • 请求中有CSRF Token。但是,它们都不匹配后续 POST 请求中使用的那个。可以使用cookie中传递的任何CSRF令牌吗?
  • 正如我之前检查过的 - 这个页面上的令牌是在 JS 中注入的,你必须在那里挖掘。
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-06
相关资源
最近更新 更多