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