Python新手在这里,所以我确信这是一个微不足道的挑战......
使用“请求”模块向Instagram API发出POST请求,以获取稍后在OAuth流程中使用的代码,以获取访问令牌。代码通常在客户端访问,因为它在重定向URL的末尾提供。
我尝试使用Request's response history method,就像这样(此帖子更改了客户端ID):
code
但是这些返回的网址并没有显示代码编号字符串,相反,重定向只是这样:
{{1}}
如果您在客户端使用浏览器执行此操作,{{1}}将替换为实际的数字字符串。
我是否可以添加到POST请求中的方法或方法,以便我可以访问Web浏览器中显示的实际重定向URL字符串?
答案 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),并且必须设置表单字段username
和password
。所以你会做这样的事情:
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标头,但是,如果你能找到解决方案,你可以使用这种方法。