从Python登录codeforces

从Python登录codeforces,python,python-requests,Python,Python Requests,我试图从命令行登录www.codeforces.com/enter,但每次尝试都失败,并出现[403]响应错误。代码的原型如下所示: import requests import getpass base = "http://codeforces.com" cf_enter = "{base}/{login}".format(base=base, login="enter") cliente = requests.session() r = cliente.get(cf_enter) us

我试图从命令行登录www.codeforces.com/enter,但每次尝试都失败,并出现[403]响应错误。代码的原型如下所示:

import requests
import getpass

base = "http://codeforces.com"
cf_enter = "{base}/{login}".format(base=base, login="enter")

cliente = requests.session()
r = cliente.get(cf_enter)

user = raw_input('User:')
password = getpass.getpass('Password:')

login_data = {
    'action': 'enter',
    'handle': user,
    'password': password,
}
r = cliente.post(cf_enter, data=login_data, headers=dict(Referer=cf_enter))
print r
顺便说一句,当我登录网站时,通过分析软件包,我在帖子前后阅读了以下cookie:“csrf_令牌”、“JSESSIONID”、“39ce7”,有效负载有“handle”(用户名)和“password”

更新1

在第一条评论之后,我更改了代码。它用于登录,并接收[200]个响应,但我想提交一个代码,例如,到“”


有没有建议让它工作(?)

如果您使用Chrome开发者工具、Firebug或任何其他相关工具检查post请求,您将看到post数据中发送了其他参数-
csrf\u令牌、ftaa、bfaa、\u tta
。您可以使用库解析
csrf\u令牌和_tta
,但
ftaa、bfaa
需要使用字符串切片进行解析。希望如此这很有帮助。除此之外,您还希望在标题中发送用户代理字符串。谢谢,我忘了搜索html的内容。它正在工作。我将在稍后输入代码的功能。ftaa的功能如何?bfaa需要使用字符串切片来解析。我不认为这两个字段不会显示为html标记,而是在源代码中的javascript中设置的。如果您检查源代码,您将能够找到它。
import requests
import getpass
from bs4 import BeautifulSoup as bs

base = "http://codeforces.com"
cf_enter = "{base}/{login}".format(base=base, login="enter")

cliente = requests.session()
r = cliente.get(cf_enter)
html = r.content
soup = bs(html)
head = soup.head
meta = head.findChildren('meta')
csrf_token = [
    m for m in meta if 'name' in m.attrs and m['name'] == 'X-Csrf-Token']
csrf_token = csrf_token[0]["content"]

print csrf_token # it's working, :)

user = raw_input('User:')
password = getpass.getpass('Password:')

login_data = {
    'csrf_token': csrf_token,
    'action': 'enter',
    'handle': user,
    'password': password,
}

headers = {
    'Referer': cf_enter,
    'User-agent': 'Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'
}

r = cliente.post(cf_enter, data=login_data, headers=headers)
if r.status_code != 200:
    print 'fail to connect'

type_contest = "contest"
contest_id = '4'
url_submit = "{base}/{type}/{id}/submit".format(
    base=base, type=type_contest, id=contest_id)
print url_submit

# url_submit = url_submit +'?csrf_token={0}'.format(csrf_token)
r = cliente.get(url_submit, headers=headers)
if r.status_code != 200:
    print 'fail to connect', url_submit
else:
    print '[200] ', url_submit


parts = {
    "csrf_token":            csrf_token,
    "action":                "submitSolutionFormSubmitted",
    "contestId": '4',
    "submittedProblemIndex": 'A',
    "source":                open('A.py', "rb"),
    "programTypeId":         '7',
    "sourceFile":            "",
    "_tta":                  "834",
    'handle': user,
    'password': password
}

r = cliente.post(url_submit, files=parts, headers=headers)
print r  # response: [403]
print r.cookies # here, there's nothing , hug?