使用Twython发送推文,twitter api错误

时间:2013-09-30 13:16:13

标签: python python-2.7 twitter twython

我正在尝试让python使用Twython为我发送推文但由于某种原因,我正在尝试的一切都无效。

我已经跟随Twython README,但仍然无法实现我想要的效果。

以下是我最近尝试过的代码:

from twython import Twython, TwythonError

APP_KEY = "KEYHERE"
APP_SECRET = "SECRETHERE"

twitter = Twython(APP_KEY, APP_SECRET)
auth = twitter.get_authentication_tokens()

OAUTH_TOKEN = auth['oauth_token']
OAUTH_TOKEN_SECRET = auth['oauth_token_secret']

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

try:
    twitter.update_status(status='See how easy this was?')
except TwythonError as e:
    print e

运行上面的代码时,我收到以下回溯错误:

Twitter API returned a 401 (Unauthorized), Invalid or expired token

有谁知道我做错了什么,更重要的是如何解决这个问题?

我没有足够的积分来获得赏金,但我真的很感激帮助!

提前致谢

修改

Traceback (most recent call last):
  File "C:\testtweet.py", line 20, in <module>
    final_step = twitter.get_authorized_tokens(oauth_verifier)
  File "C:\Python27\lib\site-packages\twython\api.py", line 313, in get_authorized_tokens
    raise TwythonError('Unable to decode authorized tokens.')
TwythonError: Unable to decode authorized tokens.

以上是从@justhalf提供的代码中收到的回溯

感谢SMNALLY

5 个答案:

答案 0 :(得分:33)

有一种更简单的方式来更新您的帖子,而不是Twython 实际向您展示的方式。但是,在API控制台空间上需要做更多的工作,所以让我开始吧。

  1. 首先,您需要转到apps page。在您选择了正在使用的应用程序后,请查看您提供的页面。默认情况下,您应该位于详细信息标签中。                enter image description here

  2. 现在您已经到了应有的位置,点击详细信息标签旁边的设置标签,如上所示。

  3. 之后,向下滚动,直到看到: enter image description here

  4. 单击上面显示的选项。现在,在您选择该选项后向下滚动,直到您看到一个蓝色按钮,说明更新此推特的应用程序设置

  5. 现在,返回详细信息标签。转到底部并生成所需的令牌,请注意您可能需要多次单击按钮才能使其生效(同时,请确保您的访问级别为读取,写入和直接消息< / em>生成令牌时): enter image description here

  6. 现在您拥有连接和发布到您的Twitter帐户所需的一切。您拥有Consumer keyConsumer SecretAccess tokenAccess token secret。你有你需要的一切。
  7. 好的,现在转到你的代码编辑器,并编写下面的样板代码(这些键不起作用,我只是摆脱了应用程序,所以没有黑客在这里:P我只是作为一个指示给他们您应该期望的键的长度):

    from twython import Twython
    
    APP_KEY = ''  # Customer Key here
    APP_SECRET = ''  # Customer secret here
    OAUTH_TOKEN = '1936951807-z5bBNING8P1TU2onWvJh5dh8hoYlYAmNOaAx2OX'  # Access Token here
    OAUTH_TOKEN_SECRET = 'QWJEZ7ridSeZGdxJELSBk7mupCpMA9q9sLCou5ywg'  # Access Token Secret here
    
    twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
    
    twitter.update_status(status="Hello from Python! :D")
    

    在此之后,检查你的推特,你应该看到一条新的推文说“你好,来自Python!:D”。

答案 1 :(得分:3)

让我们一起找出问题所在。

我在documentation中注意到了这一点:

  

现在您已将oauth_verifier存储到变量中,您将需要创建一个新的Twython实例并获取最终用户标记

下面的代码:

twitter = Twython(APP_KEY, APP_SECRET,
              OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

final_step = twitter.get_authorized_tokens(oauth_verifier)

所以你似乎错过了final_step

之后(来自文档):

  

获得最终用户令牌后,将它们存储在数据库中供以后使用!:

OAUTH_TOKEN = final_step['oauth_token']
OAUTH_TOKEN_SECERT = final_step['oauth_token_secret']

之后我猜你需要用最终的OAUTH_TOKENOAUTH_TOKEN_SECRET创建另一个新的Twython实例。所以完整的代码将是这样的,我推测:

from twython import Twython, TwythonError
import requests

APP_KEY = "KEYHERE"
APP_SECRET = "SECRETHERE"

twitter = Twython(APP_KEY, APP_SECRET)
auth = twitter.get_authentication_tokens()

OAUTH_TOKEN = auth['oauth_token']
OAUTH_TOKEN_SECRET = auth['oauth_token_secret']

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

### This is the part you're missing ###
oauth_verifier_url = auth['auth_url']
oauth_verifier = requests.get(oauth_verifier_url)

# Getting the FINAL authentication tokens
final_step = twitter.get_authorized_tokens(oauth_verifier)

OAUTH_TOKEN = final_step['oauth_token']
OAUTH_TOKEN_SECRET = auth['oauth_token_secret']

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
### Up until this line ###

try:
    twitter.update_status(status='See how easy this was?')
except TwythonError as e:
    print e

我没有Twitter应用程序密钥,所以我无法尝试。

但我想这应该足以解决你的问题了。我希望这有帮助。 =)

请注意,我使用了Python的requests包。

答案 2 :(得分:0)

代码返回Twitter API returned a 401 (Unauthorized), Invalid or expired token的原因是,在调用get_authentication_tokens()后需要 oauth_verifier 尝试成功拨打twitter&amp; amp;得到oauth_verifier

from twython import Twython, TwythonError

twitter = Twython(APP_KEY, APP_SECRET)

auth = twitter.get_authorization_tokens(callback_url='http://google.com')
oauth_token = auth['oauth_token']
oauth_token_secret = auth['oauth_token_secret']
print auth
print auth['auth_url']

auth ['auth_url'] 会打印一个类似的回复:

https://api.twitter.com/oauth/authenticate?oauth_token=xxxxxxxxx

浏览此网址以授权您的应用

enter image description here

在应用获得授权后,它会将客户端发送到您的callback_url

callback_url将附加oauth_verifier

类似于http://google.com/?oauth_verifier=xxxxxx&oauth_token=xxxxxx

根据您使用的网络框架,您需要获取 oauth_verifier的响应 现在创建一个新的Twython实例

twitter = Twython(APP_KEY, APP_SECRET, oauth_token, oauth_token_secret)
final_tokens = twitter.get_authorized_tokens(oauth_verifier)

print final_tokens

# these are the keys you will use to make calls on the users behalf from here on forward
f_oauth_token = final_tokens['oauth_token']
f_oauth_token_secret = final_tokens['oauth_token_secret']

更新Twitter状态:

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN=f_oauth_token, OAUTH_TOKEN_SECRET=f_oauth_token_secret)

try:
    twitter.update_status(status='See how easy this was?')
except TwythonError as e:
    print e

按照@Games Brainiac的说法更新Twitter的应用程序设置

答案 3 :(得分:0)

我在以下讨论中添加了与另一台服务器的连接也可能会阻止流api上的连接。例如,我打开了一个Rserve()并且不断收到401错误,但是当我在命令提示符下使用Rilla时,授权被授予了......

答案 4 :(得分:0)

通常,如果您想使用应用程序更新状态,则必须使用OAuth1.1身份验证进行身份验证(这被称为用户身份验证 - 而不是仅应用程序身份验证)。

不幸的是,对于任何创建Twitter应用的人来说,这需要大量额外的代码(其中app auth只需要3或4行代码)。

前段时间我实际上发布了使用Flask和Twython处理OAuth1.1的完整代码(没有错误处理,你可以按照你想要的任何方式处理这个问题)here。此解决方案使用会话文件来处理令牌,然后在注销时清除会话。 (代码可能不完美,可能会得到改进 - 我是一个相当新手的程序员)