【问题标题】:How to use oauth2 to access StackExchange API?如何使用 oauth2 访问 StackExchange API?
【发布时间】:2016-07-20 12:09:03
【问题描述】:

我正在按照此处提到的说明进行操作: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))

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)

我不知道如何从这里继续前进?我需要使用返回的访问令牌并使用它来查询 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)

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

【问题讨论】:

  • 你曾经设法通过 Python 进行身份验证吗?如果是这样,您介意发布示例代码吗?

标签: python oauth-2.0 stackexchange-api


【解决方案1】:

在您使用的两种方法中,第一种是推荐用于桌面应用程序的方法。应该是对的。

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_expiry 添加到 scope 以使其永远持续下去。不要与其他任何人共享令牌,因为它使他们可以访问您的帐户详细信息!脚本的每个用户都必须生成自己的令牌。

通过将您的应用程序的key 和您刚刚获得的access_token 插入到网址中来测试access_tokenhttps://api.stackexchange.com/2.2/me?key=key&site=stackoverflow&order=desc&sort=reputation&access_token=&filter=default

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

【讨论】:

  • 非常感谢您!你能检查我在 OP 中的编辑吗?如何自动化获取令牌的过程?
  • 正如我所提到的,我会使用 selenium webdriver 来自动化它。我建议您参考PhantomJS through selenium 上的一个 SO 问题,该问题描述了类似的情况。如果您需要更多信息,我相信它应该在一个新问题中。请务必提及您的要求:它必须完全无头还是允许 GUI?是否可以安装其他软件,还是需要纯 Python?
【解决方案2】:

对 Marc 的回答进行了一次小的更正。如果您希望访问令牌永久有效,则应添加 no_expiry 而不是 no_expire

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 2013-03-22
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2018-05-26
    相关资源
    最近更新 更多