Python 构建发送到discord的twitter监视器

Python 构建发送到discord的twitter监视器,python,twitter,discord,Python,Twitter,Discord,我正在尝试制作一个twitter机器人,将消息发布到我的Discord服务器上的特定频道。我已经跟进了很多教程,最后我自己创造了一些东西,但不幸的是它不能工作。当我通过我的twitter帐户运行模块并进行测试时,它可以成功监视,但不会发送到我的discord,并显示: 数据错误:“Status”对象没有属性“extended\u entities” 请告诉我怎么修 from tweepy.streaming import StreamListener from tweepy import OAu

我正在尝试制作一个twitter机器人,将消息发布到我的Discord服务器上的特定频道。我已经跟进了很多教程,最后我自己创造了一些东西,但不幸的是它不能工作。当我通过我的twitter帐户运行模块并进行测试时,它可以成功监视,但不会发送到我的discord,并显示:

数据错误:“Status”对象没有属性“extended\u entities”

请告诉我怎么修

from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
from tweepy import API
from tweepy import Cursor
import numpy as np
import pandas as pd
from discord_webhook import DiscordWebhook, DiscordEmbed
import time
import discord
import tweepy







class TwitterClient():
    def __init__(self, twitter_user=None):
        self.auth = TwitterAuthenticator().authenticate_twitter_app()  
        self.twitter_client = API(self.auth)
        self.twitter_user = twitter_user

    def get_twitter_client_api(self):
        return self.twitter_client

    def get_user_timeline_tweets(self, num_tweets):
        tweets = []
        for tweet in Cursor(self.twitter_client.user_timeline, id=self.twitter_user,tweet_mode="extended").items(num_tweets):
            tweets.append(tweet)
        return tweets



class TwitterAuthenticator():
    def authenticate_twitter_app(self):
        auth = OAuthHandler(CONSUMER_KEY, CONSUMER_KEY_SECRET)
        auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
        return auth



class TwitterStreamer():
    def __init__(self):
        self.twitter_authenticator = TwitterAuthenticator()

    def stream_tweets(self, fetched_tweets_filename, id_list):
        listener = TwitterListener(fetched_tweets_filename)
        auth = self.twitter_authenticator.authenticate_twitter_app()
        stream = Stream(auth, listener, filter_level=['low'])

        stream.filter(follow=id_list)

        
class EpicListener(tweepy.StreamListener):
    def __init__(self, discord, loop, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.discord = discord 
        self.loop = loop 

    def on_status(self, status):
        self.send_message(status._json)

    def send_message(self, msg):
        
        future = asyncio.run_coroutine_threadsafe(self.discord(msg), self.loop)
        
        future.result()
        

        
class MyClient(discord.Client):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    async def on_ready(self):
        myStream = tweepy.Stream(
                    auth=api.auth, listener=EpicListener(discord=self.sendtwitter, loop=asyncio.get_event_loop())
                )
        myStream.filter(follow=['mohitwr'], is_async=True)
        print(myStream)        



class TwitterListener(StreamListener):
    def __init__(self, fetched_tweets_filename):
        self.fetched_tweets_filename = fetched_tweets_filename

    def on_data(self, data):  # REACTS TO INCOMING DATA FROM TWITTER
        try:
            main_function(1)
            # print(data)
            with open(self.fetched_tweets_filename, 'a') as tf:
                tf.write(data)
            return True
        except BaseException as e:
            print('Error on_data: %s' % str(e))
        return True

    def on_error(self, status):  
        print(status)
        if status == 420:  # RATE LIMIT ERROR AVOIDANCE
            time.sleep(15 * 60)  # 15 MINUTE WAIT TO RESET LIMIT OR UNCOMMENT FALSE TO EXIT
            pass
            # return False



class TweetInfo():
    def tweets_to_data_frame(self, tweets):
        df = pd.DataFrame(data=[tweet.text for tweet in tweets], columns=['Tweets'])
        return df



def main_function(count_num):
    twitter_client = TwitterClient()
    api = twitter_client.get_twitter_client_api()
    tweet_info = TweetInfo()

    
    webhook = DiscordWebhook(url=discord_wh_url, username='cheng')
    embed = DiscordEmbed(title='NEW TWEET', description='by cheng', color=242424)
    tweets = api.user_timeline(id='2277195553', count=count_num)
    df = tweet_info.tweets_to_data_frame(tweets)

    print(df.head(count_num))

    if hasattr(tweets[0], 'retweeted_status'):
        pass
        
    else:
        if 'media' in tweets[0].extended_entities:
            for image in tweets[0].extended_entities['media']:
                embed.set_image(url=image['media_url'])
        else:
            embed.set_image(url='https://twitter.com/oscarcheng0978/photo')

        embed.set_thumbnail(url='https://twitter.com/oscarcheng0978')
        embed.add_embed_field(name='Tweet: ', value=tweets[0].text)
        embed.set_timestamp()
        hook.add_embed(embed)
        hook.execute()

    id_list = ['2277195553']
    

    twitter_streamer = TwitterStreamer()
    twitter_streamer.stream_tweets('tweets.json', id_list)


if __name__ == "__main__":
    main_function(3)