【问题标题】:Loading and reading Twitter status with json使用 json 加载和读取 Twitter 状态
【发布时间】:2019-03-29 05:49:46
【问题描述】:

您好,我正在修改 Python (2.7) 中的一些代码,我为使用 Twitter 更新的 API 编写代码,想知道是否有人可以帮助解决这个相当简单的问题...

我正在阅读帐户的最新提及作为变量“提及”和字符串本身(请参阅下面的代码了解我如何从 api 获取它):

Status(contributors=None, truncated=False, text=u'Here we have a tweet', is_quote_status=False, retweeted=True, u'created_at': u'Sun Dec 25 22:26:12 +0000 2011')

(显然,每次提及的内容都更多,很多行,但我已将其精简为所有必要的内容)

我想把它带入一个函数并用 json.loads 加载它以便使用它(这就是问题所在)......我的代码如下:

import ConfigParser
import json
import re
import csv
from tweepy import OAuthHandler
from tweepy import API
from datetime import datetime, time, timedelta
import traceback


consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
account_screen_name = ''
account_user_id = ''

auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = API(auth)

mentions = api.mentions_timeline(count=1)
now = datetime.now()

def myfunction(mention):
        tweet = json.loads(mention.strip())    
        retweeted = tweet.get('retweeted')
        from_self = tweet.get('user',{}).get('id_str','') == account_user_id

        if retweeted is not None and not retweeted and not from_self:
            try:
                DO SOME THINGS

        else:
            DON'T DO THINGS

for mention in mentions:
    print mention.text
    if now < (mention.created_at + timedelta(hours=1) + timedelta(seconds=10)):
        print "Mention was in the last ten seconds"
        myfunction(mention)
    else:
        print "Wasn't in last ten seconds, so do nothing."

但是,如果我这样做,我会收到错误:

Traceback (most recent call last):
  File "stuff.py", line 100, in <module>
    myfunction(mention)
  File "stuff.py", line 40, in replier
    tweet = json.loads(mention.strip())
AttributeError: 'Status' object has no attribute 'strip'

在 json 方面我不是最好的,所以这可能是一个明显的问题,但任何人都可以解决它吗?

我现在不想更改任何其他代码,因为代码太多而且需要很长时间。我知道这不是很好的做法,但这是一个家庭项目,我只想让线路正常工作,即所有更改都发生在:

tweet = json.loads(mention.strip())

我怀疑这是因为我试图将许多提及中的第一个加载到提及字符串中...而这对于 json.loads() 来说不正确?

【问题讨论】:

  • 我猜这是一条自动消息,因为代码中显然没有那么多行,而且代码显然是最小的、完整的和可验证的,我只是在粘贴时把数字扔进去明确这是一个假人。
  • 最小、完整和可验证意味着我们应该能够复制/粘贴代码(如果需要,还可以复制资源)并重现问题。导入语句,创建mention 对象,然后调用json.loads。真的很有帮助。
  • 你能举个例子来说明一下mention的样子吗?
  • 谢谢sal 和Sujil,我已经添加了上下文......希望够了!我相当确定这个问题只是因为我试图加载来自 Twitter API 的许多内容的第一次提及,而这不适用于 json.loads() ...所以希望这是一个非常简单的修复?
  • mention 属于 Status 类。不幸的是,我在tweety 上找不到关于Status 类的文档,这显然是这里的主要问题。我会做一个dir(mention),看看暴露了哪些方法和属性来获得一个想法。

标签: python json python-2.7 tweepy


【解决方案1】:

您传递给myfunction() 的变量mention 不是字符串。您正在传递一个状态对象,该对象基本上包含推文的所有元素,看起来像 https://gist.github.com/dev-techmoe/ef676cdd03ac47ac503e856282077bf2 这就是 strip() 方法失败的原因,因为它仅适用于字符串。

但是,Tweepy 中的 Status 对象确实有一个属性,可以为您提供一个 JSON 可序列化项,然后您可以使用它。

#This is going by the code I see, and on the assumption 'mention' is one tweet
tweet_str = json.dumps(mention._json)

#tweet_str is now a JSON string, so you can try replacing your problematic line with:
tweet = json.loads(tweet_str)

我认为值得注意的是,您不一定必须转换为 JSON。您可以直接访问 Status 对象中的参数,因为它已经有点类似于 JSON,但这取决于用例。而且我相信您说过您已经在其他地方编写了很多代码,您以后可能会依赖 JSON。

这个来自状态对象的 JSON 线程非常有用,所以如果你仍然卡住,请检查一下Convert Tweepy Status object into JSON

希望这会有所帮助!

【讨论】:

  • 没问题:)
猜你喜欢
  • 2012-12-10
  • 2011-04-23
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2018-06-27
  • 2016-12-15
  • 2012-09-02
相关资源
最近更新 更多