使用Python的请求库而不是cURL

时间:2013-06-03 22:45:08

标签: python api curl instagram python-requests

我正在发出POST请求以尝试获取API访问令牌。我正在使用Python,我从文档中给出的示例使用cURL库,如下所示......

curl \-F 'client_id=CLIENT-ID' \
    -F 'client_secret=CLIENT-SECRET' \
    -F 'grant_type=authorization_code' \
    -F 'redirect_uri=YOUR-REDIRECT-URI' \
    -F 'code=CODE' \https://api.instagram.com/oauth/access_token

我正在使用Python请求库,并编写了以下内容......

data =

{'client_id':'xxxxxxxxxxxxxxxxxx',
'client_secret':'xxxxxxxxxxxxxxxxxx',
'grant_type':'authorization_code', 
'redirect_uri':'http://localhost:14080/newpage', 
'code':code}        

token_url = 'https://api.instagram.com/oauth/access_token'
p = requests.post(token_url, params = data)

URL不能让我访问,我想知道的是我写的文档示例与我的不同之处。我是Python(和编程)的新手,所以非常感谢帮助。

1 个答案:

答案 0 :(得分:3)

您发送的是params,而不是data

p = requests.post(token_url, params = data)

当您将字典作为params参数传递时,requests会尝试将其作为URL上查询字符串的一部分发送。

当您将字典作为data参数传递时,requests将对其进行格式编码并将其作为POST数据发送,这相当于curl的-F所做的。 / p>

您可以通过查看请求网址来验证这一点。如果print(p.url)显示http://api.instagram.com/oauth/access_token?client_id=xxxxxx&client_secret=xxxxx&…之类的内容,则表示您的参数最终在网址上而不是在帖子数据中。

Putting Parameters in URLs和 快速入门文档中的More complicated POST requests了解详细信息。


对于更复杂的调试,您可能需要考虑将curlrequests指向记录所有内容的本地服务器,并比较和对比每个客户端发送的内容。使用netcat

这是一种非常简单快速和简单的方法
  • 在终端/ DOS窗口中,运行nc -kl 8123。 (实际参数根据您的平台附带的netcat略有不同 - 或者,如果您的平台没有任何内容,例如Windows,您选择安装哪一个。)
  • 运行curl命令,但http://localhost:8123/oauth/access_token为网址。
  • 再次使用requests作为网址运行http://localhost:8123/oauth/access_token脚本。