简体   繁体   English

如何使用 Tweepy API 从推文中获取 media_url

[英]How to get media_url from tweets using the Tweepy API

I am using this code:我正在使用此代码:

import tweepy
from tweepy.api import API
import urllib
import os

i = 1
consumer_key="xx"
consumer_secret="xx"
access_token="xx"
access_token_secret="xx"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.secure = True
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

class MyStreamListener(tweepy.StreamListener):
    def __init__(self, api=None):
        self.api = api or API()
        self.n = 0
        self.m = 10

    def on_status(self, status):
        if 'media' in status.entities:
            for image in  status.entities['media']:
                global i
                #picName = status.user.screen_name
                picName = "pic%s.jpg" % i
                i += 1
                link = image['media_url']
                filename = os.path.join("C:/Users/Charbo/Documents/Python/",picName)
                urllib.urlretrieve(link,filename)
                #use to test
                print(status.user.screen_name)

        else: 
            print("no media_url")

        self.n = self.n+1

        if self.n < self.m: 
            return True
        else:
            print ('tweets = '+str(self.n))
            return False

    def on_error(self, status):
        print (status)

myStreamListener = MyStreamListener()
myStream = tweepy.Stream(auth, MyStreamListener(),timeout=30)
myStream.filter(track=['#feelthebern'])

I am trying the access the media_url under 'photo' in my dictionary.我正在尝试访问字典中“照片”下的 media_url。 But I am getting the following error: 'dict' object has no attribute 'media'.但我收到以下错误:'dict' 对象没有属性 'media'。 I would appreciate help navigating the JSON.我将不胜感激导航 JSON 的帮助。

Thanks in advance!提前致谢!

You should try two things :你应该尝试两件事:

  • Add entities to your request将实体添加到您的请求中

> >

tweepy.Cursor(api.search, q="#hashtag", count=5, include_entities=True)
  • Check if media is not nul :检查媒体是否为空:

> >

if 'media' in tweet.entities:
    for image in  tweet.entities['media']:
        (do smthing with image['media_url'])

Hope this will help希望这会有所帮助

This reply might be a little late, but I'm sure other people will find it useful someday.这个回复可能有点晚,但我相信有一天其他人会发现它很有用。 I actually didn't want to retweet any tweet with a video in it.我实际上不想转发任何带有视频的推文。 So I built this function.... and it works perfectly.所以我建立了这个功能......它完美地工作。

def on_status(self, status):
    #Ignores the tweet so long as I am the Author, or it's a reply to a tweet
    if status.in_reply_to_status_id is not None or \
        status.user.id == self.me.id:
        return

    #I only retweet tweets that I haven't yet retweeted. I also don't want to retweet any tweets that are quotes.
    if not status.retweeted and not status.is_quote_status:
        #Checking whether the tweet has no "media" in it.
        if 'media' not in status.entities:
            try:
                print(status.text)
                status.retweet()
                time.sleep(40) #Sleep for 40 seconds to avoid limits
            except Exception as e:
                print("Error on_data %s" % str(e))
                print("Error from retweeting")
        #If tweet has media, I only retweet a tweet with a photo
        elif 'media' in status.entities:
            media_details = status.entities['media']
            media_details_kind = media_details[0]
            #print(vide['type'])
            
            if media_details_kind['type'] == 'photo':
                try:
                    print("It is a photo")
                    status.retweet()
                    time.sleep(40)
                except Exception as e:
                    print("Error on_data %s" % str(e))
                    print("Error from retweeting")
        else: #Anything else is a video or GIF. I do nothing. 
            print("Sorry, this might be a video. Cound't retweet because it is neither a photo nor a text")
            print(status.text)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM