如何从请求模块使用POST登录到Github?

时间:2016-07-23 03:50:48

标签: python python-3.x post github python-requests

我尝试使用以下代码登录GitHub:

url = 'https://github.com/login'

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
          'login':'username',
          'password':'password',
          'authenticity_token':'Token that keeps changing',
          'commit':'Sign in',
          'utf8':'%E2%9C%93'
}

res = requests.post(url)
print(res.text)

现在,res.text打印登录页面的代码。我明白这可能是因为令牌不断变化。我也尝试将网址设置为https://github.com/session,但这也不起作用。

任何人都可以告诉我一种生成令牌的方法。我正在寻找一种不使用API​​登录的方法。我问another question我提到我无法登录的地方。一条评论说我做得不对,可以在没有Github API帮助的情况下使用请求模块登录。

我:

  

那么,我可以使用POST方法登录Facebook或Github吗?我试过了,但没有用。

用户:

  

好吧,大概是你做错了什么

有谁能告诉我我做错了什么?

在关于使用会话的建议之后,我更新了我的代码:

s = requests.Session()
headers = {Same as above}

s.put('https://github.com/session', headers=headers)    
r = s.get('https://github.com/')

print(r.text)

我仍然无法通过登录页面。

4 个答案:

答案 0 :(得分:2)

我认为您回到登录页面是因为您被重定向,并且由于您的代码没有发回您的Cookie,因此您无法进行会话。

您正在寻找会话持久性,"SELECT col1 AS ("SELECT difin FROM languge WHERE word = 'col1' "), col2 AS ("SELECT difin FROM languge WHERE word = 'col2' ") FROM my_table " 提供它:

  

会话对象Session对象允许您持久化   跨请求的参数。它还可以在所有内容中保留cookie   从Session实例发出的请求,并将使用urllib3' s   连接池。因此,如果您要向同一个人提出多个请求   主机,将重用底层TCP连接,这可能导致   显着的性能提升(请参阅HTTP持久性   连接)。

requests

http://docs.python-requests.org/en/master/user/advanced/

答案 1 :(得分:0)

您还可以尝试使用PyGitHub API执行常见的git任务。 检查以下链接: https://github.com/PyGithub/PyGithub

答案 2 :(得分:0)

此代码可完美运行

headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}

login_data = {
    'commit': 'Sign in',
    'utf8': '%E2%9C%93',
    'login': 'your-username',
    'password': 'your-password'
}

with requests.Session() as s:
 url = "https://github.com/session"
 r = s.get(url, headers=headers)
 soup = BeautifulSoup(r.content, 'html5lib')
 login_data['authenticity_token'] = soup.find('input', attrs={'name': 'authenticity_token'})['value']

 r = s.post(url, data=login_data, headers=headers)

答案 3 :(得分:0)

实际上,在post方法中,请求参数应该在请求正文中,而不是在标头中。因此,登录数据应该在data参数中。

对于github,真实性令牌存在于使用BeautifulSoup库提取的输入标签的value属性中。

此代码可以正常工作

Policy