在作为POST响应提供的重定向URL中检索OAuth代码

时间:2015-07-09 04:19:11

标签: python python-2.7 post request

Python新手在这里,所以我确信这是一个微不足道的挑战......

使用“请求”模块向Instagram API发出POST请求,以获取稍后在OAuth流程中使用的代码,以获取访问令牌。代码通常在客户端访问,因为它在重定向URL的末尾提供。

我尝试使用Request's response history method,就像这样(此帖子更改了客户端ID):

code

但是这些返回的网址并没有显示代码编号字符串,相反,重定向只是这样:

{{1}}

如果您在客户端使用浏览器执行此操作,{{1}}将替换为实际的数字字符串。

我是否可以添加到POST请求中的方法或方法,以便我可以访问Web浏览器中显示的实际重定向URL字符串?

1 个答案:

答案 0 :(得分:2)

如果您已经登录Instagram,它应该可以在浏览器中使用。如果您尚未登录,则会被重定向到登录页面:

https://instagram.com/accounts/login/?force_classic_login=&next=/oauth/authorize/%3Fclient_id%3Dcb0096f08a3848e67355f%26redirect_uri%3Dhttps%3A//www.smashboarddashboard.com/whathappened%26response_type%3Dcode

您的Python客户端未登录,因此它也会重定向到Instagram的登录页面,如OAuth_AccessRequest.url的值所示:

>>> import requests
>>> OAuthURL = "https://api.instagram.com/oauth/authorize/?client_id=cb0096f08a3848e67355f&redirect_uri=https://www.smashboarddashboard.com/whathappened&response_type=code"
>>> OAuth_AccessRequest = requests.get(OAuthURL)
>>> OAuth_AccessRequest
<Response [200]>
>>> OAuth_AccessRequest.url
u'https://instagram.com/accounts/login/?force_classic_login=&next=/oauth/authorize/%3Fclient_id%3Dcb0096f08a3848e67355f%26redirect_uri%3Dhttps%3A//www.smashboarddashboard.com/whathappened%26response_type%3Dcode'

因此,要进入下一步,您的Python客户端需要登录。这要求客户端提取并设置要回发到同一URL的字段。它还需要cookie并且Referer标头可以正确设置。必须从页面中提取隐藏的CSRF令牌(例如,您可以使用BeautifulSoup),并且必须设置表单字段usernamepassword。所以你会做这样的事情:

import requests
from bs4 import BeautifulSoup

OAuthURL = "https://api.instagram.com/oauth/authorize/?client_id=cb0096f08a3848e67355f&redirect_uri=https://www.smashboarddashboard.com/whathappened&response_type=code"
session = requests.session()    # use session to handle cookies
OAuth_AccessRequest = session.get(OAuthURL)

soup = BeautifulSoup(OAuth_AccessRequest.content)
form = soup.form
login_data = {form.input.attrs['name'] : form.input['value']}
login_data.update({'username': 'your username', 'password': 'your password'})
headers = {'Referer': OAuth_AccessRequest.url}
login_url = 'https://instagram.com{}'.format(form.attrs['action'])
r = session.post(login_url, data=login_data, headers=headers)

>>> r
<Response [400]>
>>> r.json()
{u'error_type': u'OAuthException', u'code': 400, u'error_message': u'Invalid Client ID'}

如果提供有效的客户端ID,它看起来会起作用。

作为替代方案,您可以查看将为您处理表单提交的mechanize,包括隐藏的CSRF字段:

import mechanize

OAuthURL = "https://api.instagram.com/oauth/authorize/?client_id=cb0096f08a3848e67355f&redirect_uri=https://www.smashboarddashboard.com/whathappened&response_type=code"
br = mechanize.Browser()
br.open(OAuthURL)
br.select_form(nr=0)
br.form['username'] = 'your username'
br.form['password'] = 'your password'
r = br.submit()
response = r.read()

但是这不起作用,因为没有设置referer标头,但是,如果你能找到解决方案,你可以使用这种方法。