在 Python 中使用 URL 查询字符串构造请求
Posted
技术标签:
【中文标题】在 Python 中使用 URL 查询字符串构造请求【英文标题】:Constructing requests with URL Query String in Python 【发布时间】:2013-07-21 05:44:37 【问题描述】:我不太确定自己在做什么。我应该为此使用图书馆吗?还是手动做?
所以我正在尝试在 Python 中使用 WiThings (http://www.withings.com/api) API 做一些工作。
为了执行某些请求,需要 OAuth 身份验证。我已经使用 requests 库并获得了一个 oauth 令牌和秘密令牌,以及我的消费者和消费者秘密令牌。
现在我不得不提出请求,但遇到了一些问题。我需要发出的请求格式如下(来自他们的 API 的示例):
http://wbsapi.withings.net/notify?action=subscribe
&callbackurl=http%3a%2f%2fwww.yourdomain.net%2fyourCustomApplication.php
&comment=Your%20Own%20Application%20Description
&oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b
&oauth_nonce=accbac1b7ee2b86b828e6dc4a5a539b2
&oauth_signature=XfobZMboIg2cRyNKAvyzONHHnKM%3D
&oauth_signature_method=HMAC-SHA1
&oauth_timestamp=1311842514
&oauth_token=887557411788d5120537c6550fbf2df68921f8dd6f8c7e7f9b441941eb10
&oauth_version=1.0
&userid=831
据我所知,这几乎是 OAuth 的典型格式,除了最后的用户 ID。
那么,我可以使用 requests 库发出这样的请求吗?还是其他图书馆?如何使用 comment 和 userid 和 callbackurl 字段获得正确的 URL?还是我需要手动生成此 URL?如果是这样,最好的方法是什么?
非常感谢任何帮助,因为我已经被困了一段时间了。
编辑
所以,为了澄清一点,我理解我所引用的代码的大约 98%。最后我只是遇到了一点问题。
所以我来了,代码如下:
from __future__ import unicode_literals
from urlparse import parse_qs
import requests
from requests_oauthlib import OAuth1Session
consumer_key = '**Valid consumer key**'
consumer_secret = '**Valid consumer secret**'
oauth_key = '**Valid oauth key obtained through requests library and OAuth workflow**'
oauth_secret ='**Valid oauth secret obtained through requests library and OAuth workflow**'
verifier = '**Valid consumer key obtained through requests library and OAuth workflow**'
base_url = 'http://wbsapi.withings.net/notify'
params =
'action': 'subscribe',
'callbackurl': '**callback URL**',
'comment': '**comment**',
'oauth_consumer_key': '**consumer_key**',
'oauth_nonce': 'etc etc',
'oauth_signature' : '' # <-------------- Where do I get this
# etc etc... I have everything else
r = requests.get("http://wbsapi.withings.net/notify", params=params)
这就是我所需要的。我有我需要的一切,除了签名。有没有办法从 oauth 库中获取签名?这就是一直困扰我的一切。
【问题讨论】:
你见过requests-oauthlib.readthedocs.org/en/latest吗? 是的,但是我无法从文档中确切地弄清楚当需要在 URL 末尾放置一些东西时,我将如何构造请求,在本例中为 userid。 我在文档中看到了support for extra information。 URL 末尾的东西叫做查询字符串 :) “OAuth 2”是指 OAuth 版本吗?如果是这样,WiThings 就是版本 1。 【参考方案1】:使用 URL 查询字符串执行 GET
请求:
import requests
params =
'action': 'subscribe',
'callbackurl': '',
'comment': '',
'oauth_consumer_key': '',
'oauth_nonce': '',
# more key=value pairs as appeared in your query string
r = requests.get("http://wbsapi.withings.net/notify", params=params)
清除后,现在您只需按照http://www.withings.com/en/api/oauthguide 上记录的工作流程并实施它们
收到您的 OAuth 密钥和 OAuth 密钥后,使用以下端点和 查询字符串 执行 GET
请求,这将返回 token
:
https://oauth.withings.com/account/request_token? oauth_callback=http%3A%2F%2Fexample.com%2Fget_access_token &oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b &oauth_nonce=f71972b1fa93b8935ccaf34ee02d7657 &oauth_signature=J8xzgFtHTsSRw8Ejc8UDV2jls34%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1311778988 &oauth_version=1.0
然后您需要通过以下请求授权您收到的令牌,这将为您提供 user_id:
https://oauth.withings.com/account/authorize? oauth_callback=http%3A%2F%2Fexample.com%2Fget_access_token &oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b &oauth_nonce=369f9ceb2f285ac637c9a7e9e98019bd &oauth_signature=OR9J9iEl%2F2yGOXP2wk5c2%2BWtYvU%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1311778988 &oauth_token=5bb105d2292ff43ec9c0f633fee9033045ed4643e9871b80ce586dc1bf945 &oauth_version=1.0
然后您需要通过使用更多查询字符串访问此端点来请求access_token
:
https://oauth.withings.com/account/access_token? oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b &oauth_nonce=7acd22371fc56fd8a0aaf8416f79f84f &oauth_signature=jmj1g%2FB3rYR2DCpWp86jB5YVHIM%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1311778988 &oauth_token=5bb105d2292ff43ec9c0f633fee9033045ed4643e9871b80ce586dc1bf945 &oauth_version=1.0 &userid=831
现在您已经拥有了在您的问题中执行上述请求所需的一切,以及直接来自文档的示例:
http://wbsapi.withings.com/measure? 行动=getmeas &oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b &oauth_nonce=accbac1b7ee2b86b828e6dc4a5a539b2 &oauth_signature=XfobZMboIg2cRyNKAvyzONHHnKM%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1311842514 &oauth_token=887557411788d5120537c6550fbf2df68921f8dd6f8c7e7f9b441941eb10 &oauth_version=1.0 &userid=831
再一次,一切都可以在没有明确的 oauth
库的情况下完成,因为您可以使用 requests.get
和 查询字符串 来完成工作流程,这些字符串由 dict
提要构建到 params
的参数中方法。
我真的希望这可以帮助您实现目标。
【讨论】:
我想到了这个,问题是我必须手动生成OAuth签名,这有点痛苦,我不确定我是否能做对。 @elykl33t 然后使用requests-oauthlib
执行签名过程并获取上述参数,然后使用我的回答中提到的查询字符串构造一个GET
请求。跨度>
这是我想过的,但我不知道该怎么做。我如何从请求中获得签名?我遇到这个问题的一个重要原因是因为我缺乏 Python 经验。
@elykl33t 这些都清楚地记录在 WIthings API 文档中:withings.com/en/api/oauthguide,从“如何获得此永久访问权限?”部分开始,然后通读requests-oauthlib.readthedocs.org/en/latest/…,了解如何实现它使用requests-oauthlib
感谢所有帮助,也很抱歉所有问题,但是在 OAuth1 会话中,rsa_key 是签名吗?【参考方案2】:
这是一个使用rauth client library 的工作示例。完全公开,我是原始的rauth作者。希望这会有所帮助:
from rauth import OAuth1Service
withings = OAuth1Service(
name='withings',
consumer_key='fd5fe4002db502983fbd056fdf416941d83e15ecb68ee9eeb4978cb2370c',
consumer_secret='29dbc46056c530814c2debcf24c76ff42f6cc66d0e3e5cfdef1e166725c6f',
base_url='http://wbsapi.withings.net/notify',
request_token_url='https://oauth.withings.com/account/request_token',
authorize_url='http://oauth.withings.com/account/authorize',
access_token_url='https://oauth.withings.com/account/access_token')
request_token, request_token_secret = withings.get_request_token()
callback = 'https://github.com/litl/rauth'
authorize_url = withings.get_authorize_url(request_token,
oauth_callback=callback)
print('Visit this URL in your browser: url'.format(url=authorize_url))
userid = raw_input('Enter userid from browser URL: ')
sess = withings.get_auth_session(request_token,
request_token_secret,
params='userid': userid)
print sess.get('measure', params='action': 'getmeas',
'userid': userid).json()
【讨论】:
以上是关于在 Python 中使用 URL 查询字符串构造请求的主要内容,如果未能解决你的问题,请参考以下文章