【问题标题】:Python 3 with Requests trying to use Tumblr API, I get error 401?Python 3 请求尝试使用 Tumblr API,我收到错误 401?
【发布时间】:2015-04-25 11:16:00
【问题描述】:

我有 Python 3,我正在尝试通过 API link to API documentation 发布到 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":[]}'

【问题讨论】:

    标签: python oauth tumblr


    【解决方案1】:

    不要这样做:

    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 的cmets 更新我的帖子。您的代码适用于我在 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 的?我通过点击Applications developer page 上的“探索 API”获得了我的。
    • 您无需调用readAPI.close(),因为with 块会自动为您关闭文件(请参阅official docs)。
    • 我使用 JSON 来存储和读取凭据,这样我就可以 100% 确定我得到了正确的字符串。代码也更干净。我仍然怀疑您从文件中读取行并对其进行切片的方式。
    • 尝试像我一样在您的代码中打印r.content。与“401 Unauthorized”相比,它是否为您提供了更具描述性的错误消息?

    【讨论】:

    • 我将 .replace('\n','') 添加到每个值中,并用它显示的内容更新了问题。基本上 repr 刚刚在我的价值观周围添加了 ''。
    • 我看到你对 \n 的看法是正确的,因为我只是尝试过没有。很好的呼吁!出于某种原因,它仍然显示 401。 :(
    • 如果不注册 API 并亲自尝试,我很难说。您可以尝试在python2中使用官方API客户端而不是使用请求吗?还是用另一种语言?还是使用 curl (如果可能)?如果可行,那么它一定是您的代码中的某些内容。我不会指望他们的 API 被破坏,很可能你错过了身份验证的一步。 OAuth 可能有点棘手。
    • 另外,这可能不是您的问题,但以这种方式切片:readAPI.readline()[23:] 可能有点容易出错。当你以这种方式切片时,很容易出现一个错误(即为什么是 23?应该是 22 还是 24?)。也许尝试将凭据直接放入 python 代码中作为测试,以确保您传递正确的内容。以 JSON 或 configparser 格式存储凭据会更简洁一些。
    • 它是 23,因为这是我在代码之前的字符数。在尝试确保它被正确读取之前,我打印了代码,尽管我没有考虑过 \n。我不能尝试使用 curl,而且我不喜欢仅仅为此下载 python2,因为我已经读过它给了一些人安装错误。
    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 2021-03-27
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2023-03-14
    相关资源
    最近更新 更多