繁体   English   中英

尝试使用Tumblr API的带有请求的Python 3,出现错误401?

[英]Python 3 with Requests trying to use Tumblr API, I get error 401?

我有Python 3,我正尝试通过指向API文档的 API 链接发布到Tumblr。 尽管我感觉自己做的一切正确,但我仍然收到错误401。 Python 2中有一个官方的API客户端,但是很难理解,所有其他提及似乎都在PHP或Java中。 我也不确定401错误后要发布的格式,因为文档没有提供/ post以外的任何明确示例。 我的代码:

import requests
from requests_oauthlib import OAuth1
#variables for later
client_key=""
client_secret=""
oauth_token=""
oauth_token_secret=""

#gets the values for the variables
with open("API.txt", 'r') as readAPI:
    readAPI.readline()
    client_key=readAPI.readline()[23:]
    client_secret=readAPI.readline()[23:]
    oauth_token=readAPI.readline()[23:]
    oauth_token_secret=readAPI.readline()[23:]
readAPI.close()

#prints them to double check they are being read correctly
print(client_key)
print(client_secret)
print(oauth_token)
print(oauth_token_secret)

#sets oauth for the connection
oauth = OAuth1(client_key,
               client_secret,
               oauth_token,
               oauth_token_secret)

#check post that should return various blog stats
r = requests.get("http://api.tumblr.com/v2/user/info" ,auth=oauth)

print(r)

我100%确保我正确获得了客户端密钥,客户端密钥,oauth令牌和oauth令牌密钥。 我已经仔细检查过,oauth令牌都放在手动读取的文件中,并且在尝试连接之前将它们打印出来。 我100%确信它是正确的。 我想知道Tumblr的API是否损坏?

编辑:这是与print(repr())

'client_key'
'client_secret'
'oauth_token'
'oauth_token_secret'
{"meta":{"status":401,"msg":"Not Authorized"},"response":[]}

这是尝试新代码并使用Steven的JSON方法后发生的情况。

b'{"meta":{"status":401,"msg":"Not Authorized"},"response":[]}'

而不是这样做:

print(client_key)

这是什么输出?

print(repr(client_key))

您正在使用readline ,在每行的末尾包含一个换行符:

$ cat foo.txt
key
secret
blabla

$ python3.4
>>> f = open("foo.txt")
>>> print(repr(f.readline()))
'key\n'
>>> print(repr(f.readline()))
'secret\n'
>>> print(repr(f.readline()))
'blabla\n'

您是否尝试过从每行剥离换行符?


编辑 :根据@ user2853325的评论更新我的帖子。 您的代码在Python 3.4,requests == 2.5.2和requests-oauthlib == 0.4.2下为我工作。

API.json(已删除密钥/秘密):

{
    "client_key": "XXXXXXXXXXXXXXXXXXXXdG7zXIMcDidwQ5pMHuQTbxyhNINrCE",
    "client_secret": "XXXXXXXXXXXXXXXXXXXX72A5HQO1axydP5nlOWCTQx4ECfXfyX",
    "oauth_token": "XXXXXXXXXXXXXXXXXXXX8WAnqMBWaAdnGhnc4gWhJ4j6cufK1W",
    "oauth_token_secret": "XXXXXXXXXXXXXXXXXXXX8Kf82k65JzIcMU7QUp54ssPEzJd7my"
}

tumblr.py:

import json

import requests
from requests_oauthlib import OAuth1

#gets the values for the variables
with open("API.json") as f:
    credentials = json.load(f)

#prints them to double check they are being read correctly
print(credentials)

#sets oauth for the connection
oauth = OAuth1(
    credentials['client_key'],
    credentials['client_secret'],
    credentials['oauth_token'],
    credentials['oauth_token_secret']
)

#check post that should return various blog stats
r = requests.get("http://api.tumblr.com/v2/user/info", auth=oauth)
print(r)
print(r.content)

输出(已删除oauth内容):

$ bin/python tumblr.py
{'oauth_token_secret': 'XXXXXXXXXXXXXXXXXXXX8Kf82k65JzIcMU7QUp54ssPEzJd7my', 'client_secret': 'XXXXXXXXXXXXXXXXXXXX72A5HQO1axydP5nlOWCTQx4ECfXfyX', 'client_key': 'XXXXXXXXXXXXXXXXXXXXdG7zXIMcDidwQ5pMHuQTbxyhNINrCE', 'oauth_token': 'XXXXXXXXXXXXXXXXXXXX8WAnqMBWaAdnGhnc4gWhJ4j6cufK1W'}
<Response [200]>
b'{"meta":{"status":200,"msg":"OK"},"response":{"user":{"name":"lost-theory","likes":0,"following":2,"default_post_format":"html","blogs":[{"title":"Untitled","name":"lost-theory","posts":0,"url":"http:\\/\\/lost-theory.tumblr.com\\/","updated":0,"description":"","is_nsfw":false,"ask":false,"ask_page_title":"Ask me anything","ask_anon":false,"followed":false,"can_send_fan_mail":true,"share_likes":true,"likes":0,"twitter_enabled":false,"twitter_send":false,"facebook_opengraph_enabled":"N","tweet":"N","facebook":"N","followers":0,"primary":true,"admin":true,"messages":0,"queue":0,"drafts":0,"type":"public"}]}}}'

现在,我已经为您自己测试了代码:

  • 您如何获得oauth_tokenoauth_token_secret 我是通过在“ 应用程序开发人员”页面上单击“浏览API”而获得的。
  • 您不需要调用readAPI.close() ,因为with块会自动为您关闭文件(请参阅官方文档 )。
  • 我使用JSON来存储和读取凭据,因此我100%地确定我得到了正确的字符串。 代码也更干净。 我仍然对您从文件中读取行并将它们切片的方式表示怀疑。
  • 尝试像我一样在代码中打印r.content 它是否比“ 401未经授权”给您更多描述性的错误消息?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM