【问题标题】:OAuth authentication for magiccardmarket with Python requests使用 Python 请求对 magiccardmarket 进行 OAuth 身份验证
【发布时间】:2019-09-03 16:51:45
【问题描述】:

我想以编程方式获取 http://www.cardmarket.com/ 上特定用户的库存,但似乎无法让 OAuth 身份验证在以下 Python sn-p 中工作。

仅使用 requests_oauthlib 库中的可用方法并没有给出任何积极的结果,我还尝试自己构建 OAuth 标头并在请求调用中传递它,但都无济于事。我有点不知所措,因为我已经尝试了几个小时没有结果,以至于我对本应是一个简单的爱好项目失去了最大的乐趣。尽管如此,我相信这是一个可以很快解决的简单问题。

以下是应该有效但无效的简单代码:

import requests
from requests_oauthlib import OAuth1

user = ..

app_token  = ..
app_secret = ..
access_token = ..
access_token_secret = ..

request_url = "https://api.cardmarket.com/ws/v2.0/users/" + user + "/articles?start=0&maxResults=100"

auth = OAuth1(app_token, app_secret, resource_owner_key=access_token, resource_owner_secret=access_token_secret)
response = requests.get(request_url, auth=auth)    

print(response.request.headers)
print(response)
print(response.content)

我也尝试了多种变体,如前所述,我也尝试自己构建标题,但没有结果。

我没有看到提供的代码原样有任何问题,但在执行给定查询时仍然收到错误消息。

response.request.headers 打印语句返回以下内容:

{'Authorization': b'OAuth oauth_nonce="..", oauth_timestamp="..", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="..", oauth_token="..", oauth_signature=".."', 'Accept-Encoding': b'gzip, deflate', 'User-Agent': b'python-requests/2.18.4', 'Accept': b'*/*', 'Connection': b'keep-alive'}

这似乎包含了所有相关数据(虽然可能太多了?诸如 Accept-Encoding、User-Agent 和 Connection 之类的东西是自动添加的,但可能不是预期的,但我不确定。)

【问题讨论】:

  • “为什么上面给出的简单代码不起作用。”:与给定的cardmarket 文档相比,您使用的参数要少得多。相关 [使用 libcurl 库的 PHP 工作示例](mkmapi.eu/ws/documentation/API:Auth_libcurl)
  • OAuth 对象在由 requests.get 调用时生成其余参数。 nonce、timestamp、version、signature_method 和 signature 都是由它生成的。编辑:我在原始帖子中包含了 OAuth 调用生成的标头。
  • 与你的response.request.headers比较发现缺少realm="https://api.cardmarket.com/ws/v1.1/account"
  • 添加它并对标题中的键进行排序没有帮助。

标签: python api oauth python-requests


【解决方案1】:

问题:获取特定用户的股票

Cardmarket RESTful API 文档(2.0 版)

cardmarket.com API 的 Python 包装器(2.0 版,使用 OAuth1)

Requests-OAuthlib:面向人类的 OAuth


使用OAuth1Session

from requests_oauthlib import OAuth1Session

# base_url = 'https://api.cardmarket.com/ws/v2.0/output.json'
base_url = 'https://api.cardmarket.com/ws/v2.0'

# product_id = 266361 # Mandatory
# url = '{}/articles/{}'.format(base_url, product_id)

user_id = 266361 # Mandatory  Type: integer (ID) or string (name)
url = '{}/users/:{}/articles'.format(base_url, user_id)

oauth = OAuth1Session('app_token',
                       client_secret='app_secret',
                       resource_owner_key='access_token',
                       resource_owner_secret='access_token_secret',
                       realm=url
                      )

params = {'start':0, 'maxResults':100}
r = oauth.get(url, params=params)

【讨论】:

  • 非常感谢!确实,OAuth1Session 似乎有效,尽管我仍然想知道为什么我的原始代码不起作用.. 但至少感谢您向我展示这一点,我能够通过您的提示让它工作!
  • 很公平,在这种情况下,您能否澄清 OAuth1 和 OAuth1Session 的区别?你的建议确实有效,所以我接受了(但遗憾的是没有投票权)。
  • @Knaapje:“区别”:看看oauth1_workflow.html,你会看到OAuth1OAuth1Session在一起。我假设,如果您使用realm=params=,如我的回答所示,实际上auth=OAuth1 也可以使用。
猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2019-08-07
  • 2020-08-16
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多