使用Twython发送推文时,Twitter API出现错误。

15
我正在尝试使用Twython让Python代我发送推文,但不知何故,我尝试的一切都不起作用。
我已经按照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


回答了问题。解决方案完全有效 :) - Games Brainiac
代码返回Twitter API返回401(未授权),无效或已过期的令牌的原因是在get_authentication_tokens()之后需要'oauth_verifier'。更多信息请参考此处还有这个链接可能会有帮助。 - Simon K Bhatta4ya
获取oauth_verifier的答案请查看此回答:https://dev59.com/ynDYa4cB1Zd3GeqPB5V8#15857542 - Simon K Bhatta4ya
谢谢Simon,我会去看看的。 - SMNALLY
@SMNALLY 我能解决您的问题吗? - Games Brainiac
5个回答

42

相比于 Twython 实际展示的方式,有一种更简单的方法可以更新您的帖子。但是需要在 API 控制台上进行更多的工作,所以让我开始吧。

  1. 首先,您需要前往应用程序页面。在选择您正在使用的应用程序之后,查看您所获得的页面。您应该默认处于详细信息选项卡中。 enter image description here

  2. 现在,您已经到达了正确的位置,请点击如上所示的设置选项卡,位于详细信息选项卡旁边。

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

  4. 按照上面所示的选项进行单击。现在,在您选择选项之后,请向下滚动,直到看到一个蓝色按钮,上面写着更新此 Twitter 应用程序设置

  5. 现在,返回到您的详细信息选项卡。转到底部并生成您所需的令牌,请注意,您可能需要多次点击按钮才能使其正常工作(还要确保在生成令牌时访问级别为读取、写入和直接消息): enter image description here

  6. 现在,您拥有连接和发布推文所需的所有必要信息。您拥有Consumer keyConsumer SecretAccess tokenAccess token secret。一切就绪。

好了,现在转到您的代码编辑器,并编写以下样板代码(这些密钥不起作用,因为我已经删除了该应用程序,所以不会有黑客攻击: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")

完成后,请检查你的 Twitter,你应该可以看到一条新推文,上面写着“Hello from Python! :D”。


如果这个答案对您有用,请说一些感谢的话。因为我正在帮助一个朋友解决这个问题,我给了他同样的解决方案。 - Games Brainiac
是的,这个很有效,点赞提到了Twitter应用页面中的设置部分,我还想补充一点,请确保“允许该应用程序用于使用Twitter登录”的方框未被勾选。 - Simon K Bhatta4ya
抱歉,看起来选中它也能正常工作,这是我的失误。 - Simon K Bhatta4ya
完美答案 :) 运作完美 :) - SMNALLY
+1 我碰巧尝试按照 Twitter 文档使我的 CLI 工作。所有事情都失败了,但需要根据您的建议启用“读取、写入和直接消息”,以便最终可以通过 REST API 更新推文。可怕的文档:( 再次感谢! - haxpor
显示剩余2条评论

3
让我们一起找出问题出在哪里。
我在文档中注意到以下内容:

现在,您已经将 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包。

嗨@justhalf,感谢您的回复,在您定义“twitter”的第一行中,您不能有“OAUTH_TOKEN”和“OAUTH_TOKEN_SECRET”,因为您还没有能够获取令牌,应该获取令牌的部分是“auth = twitter.get_authentication_tokens()”。如果我打印出auth,我会得到令牌号码和所需的所有内容,但它似乎立即过期了,另外我在哪里定义要登录/发布的帐户?有什么想法吗?非常感谢SMNALLY - SMNALLY
我的示例中的第一段代码不是第一行,我是从文档中复制的。 它应该放在您第一个“twitter”定义之后。 请参见我的答案更新。 - justhalf
抱歉,这不是您的第一个“twitter”定义,而是第二个。 - justhalf
我尝试以同样的方式做这件事,但API已经有所改变。 - Games Brainiac

0

代码返回 Twitter API 返回 401 (未授权),令牌无效或已过期 的原因是在调用 get_authentication_tokens() 后需要 oauth_verifier。 尝试以下步骤以成功调用 Twitter 并获取 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

根据您使用的Web框架,您需要GET 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 应用程序设置


0
我想在下面的讨论中补充一点,连接到另一个服务器可能也会阻止流API的连接。例如,我打开了一个Rserve()并不断收到401错误,但当我在命令提示符中使用killall Rserve时,授权被授予...

0

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

不幸的是,对于任何创建Twitter应用程序的人来说,这需要大量的额外代码(而应用程序身份验证仅需要3或4行代码)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接