python post 请求头_python请求带有头和参数的POST

您混淆了头和负载,负载是而不是JSON编码的。

这些都是标题:Host: xyz.website.com

Accept: application/json, text/javascript, */*; q=0.01

Accept-Language: en-GB,en;q=0.5

User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0

Referer: http://xyz.website.com/help-me/ZYc5Yn

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

X-Requested-With: XMLHttpRequest

Content-Length: 56

Cookie: csrf_cookie_name=a3f8adecbf11e29c006d9817be96e8d4; ci_session=ba92hlh6o0ns7f20t4bsgjt0uqfdmdtl; _ga=GA1.2.1535910352.1530452604; _gid=GA1.2.1416631165.1530452604; _gat_gtag_UA_21820217_30=1

Connection: close

大多数都是自动化的,不需要手动设置。requests将根据URL为您设置Host,Accept设置为可接受的默认值,Accept-Language在这些情况下很少需要,Referer除非使用HTTPS,否则通常出于隐私原因甚至都不会设置或筛选,因此站点不再依赖它的设置,Content-Type必须实际反映POST的内容(而不是JSON!),因此requests根据调用方式为您设置此值,Content-Length必须反映实际内容长度,因此由requests设置,因为它处于计算此值的最佳位置,并且Connection绝对应由库处理,因为如果可以,您不希望阻止它有效地使用连接。

最多可以设置X-Requested-With和User-Agent,但前提是服务器不接受请求。Cookies头反映浏览器保存的cookie的值。通过使用requests Session object向Referer头中指定的url(或同一站点上其他合适的url)发出初始GET请求,脚本可以从服务器获取自己的cookie集,此时服务器应在响应上设置cookie,这些cookie将存储在会话中,以便在post请求中重用。使用该机制获取自己的CSRF cookie值。

注意Content-Type标题:Content-Type: application/x-www-form-urlencoded; charset=UTF-8

当您将字典传递给requests.post()函数的data关键字时,库将为您将数据编码为该内容类型。

实际有效载荷是csrf_test_name=a3f8adecbf11e29c006d9817be96e8d4&vID=9999

这是两个字段,csrf_test_name和vID,它们需要成为payload字典的一部分。

注意,csrf_test_name值与cookies中的csrf_cookie_name值匹配。这就是网站保护自己不受Cross-site forgery attacks攻击的方式,在这里,第三方可能会试图代表您发布到同一个URL。这样的第三方将无法访问相同的cookie,因此将被阻止。您的代码需要获得一个新的cookie;正确的CSRF实现将限制任何CSRF cookie可重用的时间。

因此,要使其正常工作,至少需要的是:# *optional*, the site may not care about these. If they *do* care, then

# they care about keeping out automated scripts and could in future

# raise the stakes and require more 'browser-like' markers. Ask yourself

# if you want to anger the site owners and get into an arms race.

headers = {

'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',

'X-Requested-With': 'XMLHttpRequest',

}

payload = {

'vID': 9999,

}

url = 'http://xyz.website.com/ajax-load-system'

# the URL from the Referer header, but others at the site would probably

# also work

initial_url = 'http://xyz.website.com/help-me/ZYc5Yn'

with requests.Session() as session:

# obtain CSRF cookie

initial_response = session.get(initial_url)

payload['csrf_test_name'] = session.cookies['csrf_cookie_name']

# Now actually post with the correct CSRF cookie

response = session.post(url, headers=headers, data=payload)

如果这仍然导致问题,您需要尝试另外两个头,Accept和Accept-Language。考虑到这一点,这将意味着该网站已经花了很长时间和精力来考虑如何保持自动站点清理器在之外。考虑联系他们,询问他们是否提供了API选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值