# Python 克隆会话请求中的 CSRF 问题

**URL:** <https://meta.discourse.org/t/bad-csrf-on-request-from-cloned-session-with-python/198348>\
**Category:** Development\
**Tags:** rest-api\
**Created:** [2021年七月27日 19:17 UTC](https://meta.discourse.org/t/bad-csrf-on-request-from-cloned-session-with-python/198348 "2021-07-27T19:17:42Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Hans](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hans/32/97608_2.png) [@Hans](https://meta.discourse.org/u/Hans)\
**Post date:** [2021年七月27日 19:17 UTC](https://meta.discourse.org/t/bad-csrf-on-request-from-cloned-session-with-python/198348/1 "2021-07-27T19:17:43Z")

</div>

我是 Discourse 论坛的版主，我想编写一个 Python 程序，从浏览器中克隆会话 Cookie，并执行简单的用户操作（例如点赞帖子）。我成功克隆了会话，并且能够使用 GET 请求获取任何页面，包括私有分类（这表明会话已成功克隆）。但是，当我尝试通过 POST 请求点赞帖子时，收到了“Bad CSRF”错误。经过调查，我注意到请求中未生成 CSRF 令牌。我想知道为什么 CSRF 令牌会在浏览器中生成，而在克隆的会话中却没有。是否有办法为请求获取 CSRF 令牌？我的简单代码如下。

```python
import requests
import browsercookie

cj = browsercookie.firefox()

r = requests.post("https://somediscoursesite.com/post_actions", data={'id':'theid','post_action_type_id':'2','flag_topic':'false'}, cookies=cj)

print(r.status_code)
print(r.request.headers)

```

---

<div class="post-metadata">

**Author:** ![blake](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/blake/32/157322_2.png) [@blake](https://meta.discourse.org/u/blake)\
**Post date:** [2021年七月28日 14:36 UTC](https://meta.discourse.org/t/bad-csrf-on-request-from-cloned-session-with-python/198348/2 "2021-07-28T14:36:03Z")

</div>

这将由所有用户、仅工作人员还是仅您自己使用？我的意思是，如果这只是为了帮助您进行内容审核，最好使用一个 API 密钥，或者为特定的工作人员生成一些 API 密钥。

---

<div class="post-metadata">

**Author:** ![Hans](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hans/32/97608_2.png) [@Hans](https://meta.discourse.org/u/Hans)\
**Post date:** [2021年七月29日 22:32 UTC](https://meta.discourse.org/t/bad-csrf-on-request-from-cloned-session-with-python/198348/3 "2021-07-29T22:32:11Z")

</div>

我的意思是希望任何已登录用户都能使用它。基本上，我想获取用户会话，并允许用户使用 Python 以编程方式执行操作，例如点赞帖子。我知道使用管理员密钥会容易得多，但我希望任何用户都能使用它。既然用户可以在浏览器中点赞帖子，为什么不能在他们自己的设备上，通过在命令提示符中克隆会话来以编程方式执行这一操作呢？
