From c7a90f1e80d0f1e0cffa72d9c0909eca09375108 Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Sat, 16 Feb 2019 01:17:41 -0600 Subject: [PATCH] Tweet echoer implemented. --- __pycache__/tweet_converter.cpython-37.pyc | Bin 0 -> 804 bytes tweet_converter.py | 41 +++++++++ tweet_downloader.py | 96 --------------------- tweet_echoer.py | 73 ++++++++++++++++ 4 files changed, 114 insertions(+), 96 deletions(-) create mode 100644 __pycache__/tweet_converter.cpython-37.pyc create mode 100644 tweet_converter.py delete mode 100644 tweet_downloader.py create mode 100644 tweet_echoer.py diff --git a/__pycache__/tweet_converter.cpython-37.pyc b/__pycache__/tweet_converter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc119a8cd78d2eec4ab3aacf5068b01b44e06954 GIT binary patch literal 804 zcmb7C&2H2%5FR^;H@oUq6_g4t2yx4Sh69HRp{fF|R0tMz8-bz_ySr(36KXs3N7+;1 z-Ur~Yd*sd=@D{#u>ML+!>qEP|A@J|KM%OKAXxP|e5Q8*@7TPl{Qq!-^8I+IULK zgcUr+XnMI6h~{agWyg+UqRcBUOlXn15XyKXB<&v5lSyis&00GMK}u)3R*|1DH(Hs# z6gdLZHtklmZjXVBUqRl)DL)^^Z%~Vh)i~qT$(DW;j|v^Xs3*F3S-+26Z<<%-M-(jN z=7%%0+GZ`a{g3J~I-ox8RZ0mXq1zjzM>af0{;n)LD7lRt_dR(F(Yq0G(aHM5t>c{u PpG+%WPsFyHW{3R(N0i76 literal 0 HcmV?d00001 diff --git a/tweet_converter.py b/tweet_converter.py new file mode 100644 index 0000000..be6a3f3 --- /dev/null +++ b/tweet_converter.py @@ -0,0 +1,41 @@ +# TODO: Clean this up and write comments. +def convert_tweets(tweets): + + recent_tweets = tweets + + outtweets = [] + + for tweet in recent_tweets: + + try: + outtweets.insert(0, { + 'id':str(tweet.id_str), + 'date':str(tweet.created_at), + 'retweet':('RT @' in tweet.text), + 'text':str(tweet.text.encode('utf-8'))[1:], + 'hashtags':tweet.entities.get('hashtags'), + 'mentions':tweet.entities.get('user_metions') + }) + + except: + try: + outtweets.insert(0, { + 'id':str(tweet.id_str), + 'date':str(tweet.created_at), + 'retweet':('RT @' in tweet.full_text), + 'text':str(tweet.full_text.encode('utf-8'))[1:], + 'hashtags':tweet.entities.get('hashtags'), + 'mentions':tweet.entities.get('user_metions') + }) + + except: + outtweets.insert(0, { + 'id':str(tweet.id_str), + 'date':str(tweet.created_at), + 'retweet':True, + 'text':str(tweet.retweeted_status.text.encode("utf-8"))[1:], + 'hashtags':tweet.entities.get('hashtags'), + 'mentions':tweet.entities.get('user_metions') + }) + + return outtweets \ No newline at end of file diff --git a/tweet_downloader.py b/tweet_downloader.py deleted file mode 100644 index 533a824..0000000 --- a/tweet_downloader.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - -# Some legacy code I wrote for a project in college. It's ugly and messy. I'll clean it up and repurpose it later. - -import tweepy #https://github.com/tweepy/tweepy -import json -from time import sleep - - -def get_all_tweets(screen_name): - #Twitter only allows access to a users most recent 3240 tweets with this method - with open('keys.txt', 'r') as f: - #Twitter API credential - consumer_key = f.readline().rstrip() - consumer_secret = f.readline().rstrip() - access_key = f.readline().rstrip() - access_secret = f.readline().rstrip() - - #authorize twitter, initialize tweepy - auth = tweepy.OAuthHandler(consumer_key, consumer_secret) - auth.set_access_token(access_key, access_secret) - api = tweepy.API(auth) - - #initialize a list to hold all the tweepy Tweets - recent_tweets = [] - - #make initial request for most recent tweets (200 is the maximum allowed count) - new_tweets = api.user_timeline(screen_name = screen_name,count=10,tweet_mode = 'extended') - - #save most recent tweets - recent_tweets.extend(new_tweets) - ''' - - #save the id of the oldest tweet less one - oldest = alltweets[-1].id - 1 - - #keep grabbing tweets until there are no tweets left to grab - while len(new_tweets) > 0 and len(alltweets) < 3000: - print("getting tweets before %s" % (oldest)) - - #all subsiquent requests use the max_id param to prevent duplicates - new_tweets = api.user_timeline(screen_name = screen_name,count=200,max_id=oldest) - - #save most recent tweets - alltweets.extend(new_tweets) - - #update the id of the oldest tweet less one - oldest = alltweets[-1].id - 1 - - print("...%s tweets downloaded so far" % (len(alltweets))) - - ''' - #transform the tweepy tweets into a 2D array that will populate the csv - outtweets = [] - for tweet in recent_tweets: - try: - if tweet.retweeted or ('RT @' in tweet.text): - outtweets.append([tweet.id_str, tweet.created_at, "True", tweet.retweeted_status.text.encode("utf-8"), tweet.entities.get('hashtags'), tweet.entities.get('user_mentions')]) - except: - try: - outtweets.append([tweet.id_str, tweet.created_at, ('RT @' in tweet.full_text), tweet.full_text.encode("utf-8"), tweet.entities.get('hashtags'), tweet.entities.get('user_mentions')]) - except: - outtweets.append([tweet.id_str, tweet.created_at, ('RT @' in tweet.text), tweet.text.encode("utf-8"), tweet.entities.get('hashtags'), tweet.entities.get('user_mentions')]) - - for t in outtweets: - print(t[3]) - - ''' - #write the csv - with open('%s_tweets.csv' % screen_name, 'w') as f: - writer = csv.writer(f) - writer.writerow(["id","created_at","retweet","text","hashtags","user_mentions"]) - writer.writerows(outtweets) - - pass - ''' - -if __name__ == '__main__': - with open('users.txt', 'r') as f: - for l in f: - get_all_tweets(l.rstrip()) - -''' - -if __name__ == '__main__': - #pass in the username of the account you want to download - counter = 0 - with open("users.txt", "r") as f: - for line in f: - get_all_tweets(line.rstrip()) - counter = counter + 1 - if (counter % 5) == 0: - sleep(15*60) - -''' diff --git a/tweet_echoer.py b/tweet_echoer.py new file mode 100644 index 0000000..fa48b4c --- /dev/null +++ b/tweet_echoer.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# encoding: utf-8 + +# Tweet echoing works. I just need this to be refactored into something more useful... +from tweet_converter import convert_tweets +from time import sleep +import tweepy + +# Tentative... Might just settle with line-by-line with encryption +# TODO: Import and utilize encryption methods. +import json + +# TODO: Major clean up. +def echo_recent_tweets(screen_name): + + # TODO: Encrypt this file for extra security? + # TODO: Probably move all of this to its own function. + with open('keys.txt', 'r') as f: + #Twitter API credential + consumer_key = f.readline().rstrip() + consumer_secret = f.readline().rstrip() + access_key = f.readline().rstrip() + access_secret = f.readline().rstrip() + + # Authorize twitter, initialize tweepy + auth = tweepy.OAuthHandler(consumer_key, consumer_secret) + auth.set_access_token(access_key, access_secret) + api = tweepy.API(auth) + + last_tweet = 0 + + # TODO: Don't do while(True). Use another safer method. + while(True): + + # Request the last 10 tweets, since I'm assuming I won't have made 10 tweets in 30 seconds... + new_tweets = api.user_timeline(screen_name = screen_name,count=10,tweet_mode = 'extended') + + recent_tweets = [] + + # Only bother processing new tweets. + for tweet in new_tweets: + if(tweet.id > last_tweet): + recent_tweets.append(tweet) + + # Only do this if there are new tweets. + if recent_tweets: + outtweets = convert_tweets(recent_tweets) + last_tweet = int(outtweets[len(outtweets) - 1]['id']) + + # Debugging purposes... + # TODO: Clean this up probably. + for t in outtweets: + print(t['date'] + '\t' + t['text']) + + sleep(30) + +# TODO: Stop reading users from a file, unnecessary. +if __name__ == '__main__': + with open('users.txt', 'r') as f: + for l in f: + echo_recent_tweets(l.rstrip()) + +# Clean these up lmao + +''' +#write the csv +with open('%s_tweets.csv' % screen_name, 'w') as f: + writer = csv.writer(f) + writer.writerow(["id","created_at","retweet","text","hashtags","user_mentions"]) + writer.writerows(outtweets) + +pass +'''