如何使用oauth2访问StackExchange API?

90a*_*yss 5 python oauth-2.0 stackexchange-api

我正在按照这里提到的说明进行操作:https : //api.stackexchange.com/docs/authentication

但是由于没有提供任何代码,因此我无法正确理解流程。

我一直在尝试使用下面的两种方法来完成身份验证部分,但是我遇到了麻烦。

1)

import requests
from pprint import pprint

resp = requests.get('https://stackexchange.com/oauth/dialog?client_id=6667&scope=private_info&redirect_uri=https://stackexchange.com/oauth/login_success/')
pprint(vars(resp))
Run Code Online (Sandbox Code Playgroud)

2)

import oauth2 as oauth
from pprint import pprint

url = 'https://www.stackexchange.com'
request_token_url = '%s/oauth/' % url
access_token_url = '%s/' % url

consumer = oauth.Consumer(key='mykey',
                          secret='mysecret')

client = oauth.Client(consumer)


response, content = client.request(request_token_url, 'GET')

print(response, content)
Run Code Online (Sandbox Code Playgroud)

我不确定如何从这里前进?我需要使用返回的访问令牌,并使用它来查询API。样例代码确实非常有帮助!谢谢。

编辑:这是我当前使用的代码:

from requests_oauthlib import OAuth2Session
from pprint import pprint

client_id = 'x'
client_secret = 'x'
redirect_uri = 'https://stackexchange.com/oauth/login_success'
scope = 'no_expiry'

oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=scope)

pprint(vars(oauth))

authorization_url, state = oauth.authorization_url('https://stackexchange.com/oauth/dialog')

print(authorization_url)
Run Code Online (Sandbox Code Playgroud)

不必单击authorization_url并获取令牌,有没有一种方法可以直接在脚本本身中获取令牌?

Mar*_*c J 9

在您使用的两种方法中,第一种是桌面应用程序的推荐方法。这可能是正确的。

OAuth 旨在强制用户转到特定网页并确认他们正在授予应用程序访问其数据的权限(通常通过单击按钮)。您打印的 HTTP 响应只是用户需要单击接受的网页。

感受一下流程,在地址栏中输入第一个地址(https://stackexchange.com/oauth/dialog?client_id=6667&scope=&redirect_uri=https://stackexchange.com/oauth/login_success/)并点击在加载的页面上接受。之后access_token将在 URL 中。

如果您仅为自己制作应用程序,则access_token可以将其复制到您的 Python 脚本中。令牌在一天后到期;如果太短添加no_expiryscope让它永远持续下去。不要与任何其他人共享令牌,因为它可以让他们访问您帐户的详细信息!脚本的每个用户都必须生成自己的令牌。

测试access_token通过在应用程序的插入keyaccess_token您刚刚获得进入网址:https://api.stackexchange.com/2.2/me?key=key&site=stackoverflow&order=desc&sort=reputation&access_token=&filter=default

如果您需要一个更加自动化、集成、用户友好的解决方案,我会查看selenium webdriver来打开浏览器窗口并获取生成的凭据。