【问题标题】:Using Twython to send a tweet, twitter api error使用 Twython 发送推文,twitter api 错误
【发布时间】:2013-10-06 09:03:39
【问题描述】:

我正在尝试让 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提供的代码中得到的回溯

非常感谢

【问题讨论】:

  • 回答了这个问题。解决方案完全有效:)
  • 代码返回Twitter API returned a 401 (Unauthorized), Invalid or expired token的原因是在get_authentication_tokens()之后还需要'oauth_verifier'更多here还有this might be helpful
  • check this answer 获取oauth_verifier
  • 谢谢西蒙,我会去看看。
  • @SMNALLY 我能解决你的问题吗?

标签: python python-2.7 twitter twython


【解决方案1】:

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

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

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

  3. 之后,向下滚动直到看到:

  4. 单击如上所示的选项。现在,在您选择该选项后向下滚动,直到您看到一个蓝色按钮,上面写着 Update this twitter's application settings

  5. 现在,返回您的详细信息标签。转到底部并生成所需的令牌,请注意,您可能需要多次单击按钮才能使其工作(另外,请确保您的访问级别是阅读、写入和直接消息 生成令牌时):

  6. 现在您拥有连接和发布到您的 Twitter 帐户所需的一切。您有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")

之后,检查你的推特,你应该会看到一条新推文说“Hello from Python!:D”。

【讨论】:

  • 如果答案对您有用,请说点什么。因为我正在帮助一个朋友解决这个问题。我给了他同样的解决方案。
  • 是的,这很好用,赞成在 Twitter 的应用程序页面上提及设置部分,我还想添加确保框 Allow this application to be used to Sign in with Twitter未选中跨度>
  • @SimonKB 你真的不需要打开它。它对我来说是关闭的,我可以在 Twitter 上发布我的消息。我认为这在客户端并不重要。
  • 嗯,很抱歉,它似乎在检查后也能正常工作,我的错。
  • 完美答案 :) 完美运行 :)
【解决方案2】:

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

我在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 包。

【讨论】:

  • 嗨@justhalf 感谢您的回复,在您定义twitter 的第一行中,您不能拥有OAUTH_TOKENOAUTH_TOKEN_SECRET,因为您无法获得令牌,应该获得令牌的部分是auth = twitter.get_authentication_tokens() 如果我print auth 我得到了令牌号和所需的一切,但它似乎马上过期,我在哪里定义登录/发布的帐户?有什么想法吗?非常感谢SMALLY
  • 我的示例中的第一个代码不是第一行,我是从文档中复制的。它应该放在您的第一个 twitter 定义之后。查看我的答案的更新。
  • 抱歉,不是您的第一个 twitter 定义,而是第二个。
  • 我尝试以同样的方式执行此操作,但 API 发生了一些变化。
【解决方案3】:

代码返回Twitter API returned a 401 (Unauthorized), Invalid or expired token 的原因是调用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

浏览此 URL 以授权您的应用

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

callback_url 将附加oauth_verifier

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-02
        • 2016-06-26
        • 2015-05-16
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 2014-09-12
        相关资源
        最近更新 更多