def main(): twitter = Twython(APP_KEY, APP_SECRET, oauth_version=2) ACCESS_TOKEN = twitter.obtain_access_token() print (ACCESS_TOKEN) ACCESS_TOKEN = ACCESS_TOKEN twitter = Twython(APP_KEY, access_token=ACCESS_TOKEN) twitter.get_application_rate_limit_status()['resources']['search'] #RETRIEVING REAL TIME STREAMING TWEETS ABOUT BLOCKCHAIN search = twitter.search(q="blockchain", count=2000) tweets = search['statuses'] #for tweet in tweets: #print (tweet['id_str'], '\n', tweet['text'], tweet['favorite_count'], tweet['retweet_count'] ), '\n\n\n' ids = [] #for tweet in tweets: #ids.append(tweet['id_str']) ids = [tweet['id_str'] for tweet in tweets] texts = [tweet['text'] for tweet in tweets] times = [tweet['retweet_count'] for tweet in tweets] favtimes = [tweet['favorite_count'] for tweet in tweets] follower_count = [tweet['user']['followers_count'] for tweet in tweets] location = [tweet['user']['location'] for tweet in tweets] lang = [tweet['lang'] for tweet in tweets] #print (tweets[0]) df = pd.DataFrame(tweets) # only get part of data here, for testing dump to sqlite step df_ = df[['contributors','created_at','text','retweet_count']] print (df_.head(5)) return df_
def make_new_data_table(consumer_key, consumer_secret, access_token, access_secret, df): #used a different twitter package here because it gets more accurate retweet/favorite counts twitter = Twython(consumer_key, consumer_secret, access_token, access_secret) #tracking the things that change over time (and saving them with their time downloaded): df['retweet_count'] = np.nan df['favorite_count'] = np.nan df['deleted'] = False df['time_downloaded'] = np.nan #check for rate limiting tweets_remaining = json.dumps(twitter.get_application_rate_limit_status()['resources']['statuses']['/statuses/show/:id']['remaining']) print("tweets remaining before program: "+ tweets_remaining) tweets_remaining = int(tweets_remaining) for index, row in df.iterrows(): if tweets_remaining <= 0: string_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") print("had to pause for rate limiting. time: " + string_time) while(tweets_remaining == 0): time.sleep(15) tweets_remaining = int(json.dumps(twitter.get_application_rate_limit_status()['resources']['statuses']['/statuses/show/:id']['remaining'])) try: tweets_remaining -= 1 tweet = twitter.show_status(id=row['id']) df.loc[index, 'retweet_count'] = tweet['retweet_count'] df.loc[index, 'favorite_count'] = tweet['favorite_count'] now = datetime.datetime.now() formatted_time = now.strftime("%Y-%m-%d %H:%M") df.loc[index, 'time_downloaded'] = formatted_time except: #if we can't find the tweet that means its been deleted df.loc[index, 'deleted'] = True now = datetime.datetime.now() formatted_time = now.strftime("%Y-%m-%d %H:%M") df.loc[index, 'time_downloaded'] = formatted_time return df
def wrapper(*args, **kwargs): """ A decorator function to provide Twitter API rate limiting. A request is made to the API to get the number of remaining requests. If no requests remain then the current thread must wait until the specified reset time. See: https://dev.twitter.com/rest/public/rate-limits E.g. @limiter("users/lookup") def lookup_user(): something() """ cr = [app_key, app_secret, auth_token, auth_secret] twitter = Twython(*cr) resource = request.split("/")[0] # rate_limit_status has rate limit a = twitter.get_application_rate_limit_status() b = a["resources"] b = b["application"] b = b["/application/rate_limit_status"] c = a["resources"] c = c[resource] c = c["/%s" % request] now = time() # respect rate_limit_status limits if b["remaining"] == 0: # wait for reset reset = b["reset"] notify(reset) sleep(reset - now) # respect requested limits if c["remaining"] == 0: # wait for reset reset = c["reset"] notify(reset) sleep(reset - now) return f(*args, **kwargs)
def main(APP_KEY, APP_SECRET): twitter = Twython(APP_KEY, APP_SECRET, oauth_version=2) ACCESS_TOKEN = twitter.obtain_access_token() print(ACCESS_TOKEN) ACCESS_TOKEN = ACCESS_TOKEN twitter = Twython(APP_KEY, access_token=ACCESS_TOKEN) twitter.get_application_rate_limit_status()['resources']['search'] #RETRIEVING REAL TIME STREAMING TWEETS ABOUT BLOCKCHAIN search = twitter.search(q="blockchain", count=2000) tweets = search['statuses'] #for tweet in tweets: #print (tweet['id_str'], '\n', tweet['text'], tweet['favorite_count'], tweet['retweet_count'] ), '\n\n\n' ids = [] #for tweet in tweets: #ids.append(tweet['id_str']) ids = [tweet['id_str'] for tweet in tweets] texts = [tweet['text'] for tweet in tweets] times = [tweet['retweet_count'] for tweet in tweets] favtimes = [tweet['favorite_count'] for tweet in tweets] follower_count = [tweet['user']['followers_count'] for tweet in tweets] location = [tweet['user']['location'] for tweet in tweets] lang = [tweet['lang'] for tweet in tweets] print(tweets[0]) return tweets
def auth_twitter(app_keys, query_type='terms'): if query_type == 'terms': resource = ['search', '/search/tweets'] elif query_type in ('users', 'userids'): resource = ['statuses', '/statuses/user_timeline'] elif query_type == 'ids': resource = ['statuses', '/statuses/lookup'] elif query_type == 'id': resource = ['statuses', '/statuses/show/:id'] elif query_type == 'trends': resource = ['trends', '/trends/place'] remaining = 0 len_app_keys = len(app_keys) while True: tts = 900 rate_limit_exceeded = False for key in app_keys: try: # authenticate twitter = Twython(key[0], key[1], oauth_version=2) access_token = twitter.obtain_access_token() twitter = Twython(key[0], access_token=access_token) rate_limit_status = twitter.get_application_rate_limit_status(resources=resource[0]) rate_limit_status = rate_limit_status['resources'][resource[0]][resource[1]] remaining = rate_limit_status['remaining'] limit = rate_limit_status['limit'] reset = rate_limit_status['reset'] - time() + 1 if remaining > 0: print('Requests left:', str(remaining) + '/' + str(limit), '(' + str(app_keys.index(key)+1) + '/' + str(len_app_keys) + ')') return twitter elif tts > reset: tts = reset except TwythonRateLimitError: rate_limit_exceeded = True except Exception as e: print('Warning:', e) if remaining == 0: print('Warning: 0 requests left.')\ if rate_limit_exceeded else None sleep_seconds(tts)
status['lang'], status['source'], status['user']['profile_image_url'], 'Point' if status['coordinates'] else '', status['coordinates']['coordinates'][1] if status['coordinates'] else '', status['coordinates']['coordinates'][0] if status['coordinates'] else '', status['created_at'], int(datetime.strptime(status['created_at'], "%a %b %d %H:%M:%S +0000 %Y").replace(tzinfo=timezone.utc).timestamp()), status_type, status['retweet_count'], status['favorite_count'], status['retweeted_status']['id_str'] if status_type == 'Retweet' else '', status['in_reply_to_status_id_str'] if status_type == 'Reply' else '', status['user']['followers_count']] file_writer.writerow(tweet) previous_results = search_results except TwythonRateLimitError: rate_limit_status = twitter.get_application_rate_limit_status(resources='search') rate_limit_status = rate_limit_status['resources']['search']['/search/tweets'] reset = int(rate_limit_status['reset'] - time() + 1) if reset > 0: print('Sleeping', reset, 'seconds.') sleep(reset) except KeyboardInterrupt: print('Finishing...') break print('Got', count, 'tweets.')
# print len(twitter_accounts) # twitter_accounts[:5] ###### PARTE 6: Bucle principal sobre el cual las cuentas de Twitter se añaden a la colección de cuentas en MongoDB ###### start_time = timeit.default_timer() starting_count = tweets.count_documents({}) # for s in twitter_accounts[:len(twitter_accounts)]: for s in twitter_accounts[:len(twitter_accounts)]: # Fija el contador de duplicados para esta cuenta de twitter a cero duplicates = 0 # Comprueba el ratio límite de llamadas por minuto en el API de twitter (900 peticiones/15-minutos) rate_limit = twitter.get_application_rate_limit_status()['resources']['statuses']['/statuses/user_timeline'][ 'remaining'] print('\n', rate_limit, '# llamadas a la API restantes') # tweet_id = str(mentions.find_one( { "query_screen_name": s}, sort=[("id_str", 1)])["id_str"]) print('\nLeyendo tweets enviados por: ', s, '-- index: ', twitter_accounts.index(s)) page = 1 # Se pueden descargar 200 tweets por llamada y hasta 3.200 tweets totales, es decir, 16 páginas por cuenta while page < 17: print("--- STARTING PAGE", page, '...llamadas a la API restantes estimadas: ', rate_limit) d = get_data_user_timeline_all_pages(s, page) if not d: print("No hubo tweets devueltos........Desplazandose al siguiente ID") break
class TwitterHelper(object): def __init__(self, identity): self.identity = identity if not self.identity.tokens: self.identity.tokens = authorisationhelper.get_tokens(identity.screen_name) self.twitter = Twython( self.identity.tokens[0], self.identity.tokens[1], self.identity.tokens[2], self.identity.tokens[3] ) # self.identity.twid = self.twitter.lookup_user(screen_name=identity.screen_name)[0]["id_str"] self.mutation = [" ,", " .", " *", " `", " -", " _"] self.twitter_configuration = self.twitter.get_twitter_configuration() logger.debug(self.twitter_configuration) giphyhelper.set_photo_size_limit(self.twitter_configuration["photo_size_limit"]) me = self.twitter.lookup_user(screen_name=self.identity.screen_name)[0] logger.debug(me) self.identity.update(me) self.rates = None self.update_rate_limits() @retry(**retry_args) def send(self, outbox_item): if type(outbox_item) is OutgoingTweet: outbox_item.display() if outbox_item.filePaths and any(outbox_item.filePaths): for filePath in outbox_item.filePaths: # ext = os.path.splitext(filePath) # if ext == "mp4": # media_id = self._upload_video(filePath) # else: media_id = self._upload_media(filePath) if media_id: outbox_item.media_ids.append(media_id) split_tweets = tweet_splitter.split_tweet(outbox_item, self.twitter_configuration) in_reply_to_id_str = outbox_item.in_reply_to_id_str for split_tweet in split_tweets: split_tweet.in_reply_to_id_str = in_reply_to_id_str response = self.twitter.update_status(**split_tweet.get_tweet_params()) split_tweet.id_str = response["id_str"] self.identity.conversations.outgoing(split_tweet) self.identity.statistics.record_outgoing_tweet() in_reply_to_id_str = split_tweet.id_str return in_reply_to_id_str if type(outbox_item) is OutgoingDirectMessage: if not outbox_item.screen_name and not outbox_item.user_id: outbox_item.screen_name = self.identity.admin_screen_name outbox_item.display() self.twitter.send_direct_message( text=outbox_item.text, screen_name=outbox_item.screen_name, user_id=outbox_item.user_id) self.identity.statistics.record_outgoing_direct_message() return None def quote_tweet(self, inbox_item, text=None, file_paths=None): reply_as_quote_tweet = inbox_item.is_tweet reply_as_dm = inbox_item.is_direct_message if reply_as_quote_tweet: logger.info("quoting to %s as quote tweet", inbox_item.text) tweet = OutgoingTweet( quote=inbox_item, text=text, file_paths=file_paths, ) return self.send(tweet) if reply_as_dm: logger.info("replying to %s as DM", inbox_item.text) dm = OutgoingDirectMessage( reply_to=inbox_item, text=text) return self.send(dm) return None def reply_with(self, inbox_item, text=None, as_tweet=False, as_direct_message=False, file_paths=None, in_reply_to_id_str=None): reply_as_tweet = as_tweet or not as_direct_message and inbox_item.is_tweet reply_as_dm = as_direct_message or not as_tweet and inbox_item.is_direct_message if reply_as_tweet: logger.info("replying to %s as tweet", inbox_item.text) tweet = OutgoingTweet( reply_to=inbox_item, text=text, file_paths=file_paths, in_reply_to_id_str=in_reply_to_id_str) return self.send(tweet) if reply_as_dm: logger.info("replying to %s as DM", inbox_item.text) dm = OutgoingDirectMessage( reply_to=inbox_item, text=text) return self.send(dm) return None def _upload_media(self, file_path): file = None try: file = open(file_path, 'rb') media = self.twitter.upload_media(media=file) self.identity.statistics.increment("Media Uploads") return media["media_id_string"] finally: if file: file.close() def get_streamer(self, topic=None, topic_name=None, responses=None, filter_level=None): return Streamer(self.identity, topic, topic_name, responses, filter_level) def _upload_video(self, file_path): logger.info('[MyTwitter] uploading ' + file_path) url = 'https://upload.twitter.com/1.1/media/upload.json' file_size = os.path.getsize(file_path) logger.info('[MyTwitter] Init') init_params = { "command": "INIT", "media_type": "video/mp4", "total_bytes": file_size } init_response = self.twitter.post(url, init_params) logger.info(init_response) media_id = init_response["media_id_string"] logger.info('[MyTwitter] media_id ' + media_id) segment = 0 chunk_size = 4 * 1024 * 1024 for chunk in fsh.bytes_from_file(file_path, chunk_size): logger.info('[MyTwitter] Append ' + str(segment)) append_params = { 'command': 'APPEND', 'media_id': media_id, 'segment_index': segment } append_response = self.twitter.post(url, append_params, {'media': chunk}) logger.info(append_response) segment += 1 logger.info('[MyTwitter] Finalize') finalize_params = { "command": "FINALIZE", "media_id": media_id, } self.twitter.post(url, finalize_params) return media_id def get_trending_topics_for(self, woeids): trending_topics = [] for woeid in woeids: trends = self.twitter.get_place_trends(id=woeid)[0].get('trends', []) for trend in trends: trending_topics.append(trend['name']) return trending_topics def get_saved_searches(self): saved_searches = [] searches = self.twitter.get_saved_searches() for srch in searches: saved_searches.append(srch['name']) return saved_searches def delete_saved_searches(self): searches = self.twitter.get_saved_searches() for srch in searches: self.twitter.destroy_saved_search(id=srch["id_str"]) def search(self, text, result_type="popular"): query = quote_plus(text) return self.twitter.search(q=query, result_type=result_type)["statuses"] @retry(**retry_args) def favourite(self, id_str): try: self.twitter.create_favorite(id=id_str) self.identity.statistics.record_favourite() except TwythonError as ex: if "You have already favourited this tweet" in str(ex): logger.warning(ex) else: raise @retry(**retry_args) def retweet(self, id_str): try: self.twitter.retweet(id=id_str) self.identity.statistics.record_retweet() except TwythonError as ex: if "You have already retweeted this tweet" in str(ex): logger.warning(ex) else: raise @retry(**retry_args) def add_user_to_list(self, list_id, user_id, screen_name): self.twitter.create_list_members(list_id=list_id, user_id=user_id, screen_name=screen_name) @retry(**retry_args) def block_user(self, user_id, user_screen_name=None): self.twitter.create_block(user_id=user_id, screen_name=user_screen_name) @retry(**retry_args) def get_user_timeline(self, **kwargs): return self._rate_limit("/statuses/user_timeline", self.twitter.get_user_timeline, **kwargs) def unblock_user(self, user): self.twitter.destroy_block(user_id=user.id, screen_name=user.screen_name) @retry(**retry_args) def unblock_users(self): user_ids = self.twitter.list_block_ids(stringify_ids=True) for user_id in user_ids["ids"]: self.twitter.destroy_block(user_id=user_id) @retry(**retry_args) def show_owned_lists(self): return self.twitter.show_owned_lists()["lists"] @retry(**retry_args) def get_list_members(self, list_id): return self.twitter.get_list_members(list_id=list_id, count=5000, include_entities=False) @blocked @retry(**retry_args) def create_list(self, **kwargs): return self.twitter.create_list(**kwargs) @retry(**retry_args) def follow(self, user_id, screen_name): logger.info("following user id {} @{}".format(user_id, screen_name)) self.twitter.create_friendship(user_id=user_id, screen_name=screen_name) self.identity.statistics.increment("Follows") @retry(**retry_args) def unfollow(self, user_id, screen_name): logger.info("unfollowing user id {} @{}".format(user_id, screen_name)) self.twitter.destroy_friendship(user_id=user_id, screen_name=screen_name) self.identity.statistics.increment("Unfollows") @retry(**retry_args) def block(self, user_id, screen_name): logger.info("blocking user id {} @{}".format(user_id, screen_name)) self.twitter.create_block(user_id=user_id, screen_name=screen_name) self.identity.statistics.increment("Blocks") @retry(**retry_args) def report(self, user_id, screen_name): logger.info("reporting user id {} @{}".format(user_id, screen_name)) self.twitter.report_spam(user_id=user_id, screen_name=screen_name) self.identity.statistics.increment("Reports") @retry(**retry_args) def lookup_user(self, user_id): return self._rate_limit("/users/lookup", self.twitter.lookup_user, user_id=user_id) def sing_song(self, song, target=None, inbox_item=None, text=None, hashtag=None): if not text: text = random.choice(["All together now!", "Sing along!"]) text += ' ' + song["video"] if hashtag: text += ' ' + hashtag in_reply_to_id_str = self._send_to( inbox_item=inbox_item, text=text, target=target, in_reply_to_id_str=None) time.sleep(5) lastlyrics = set([]) for lyric in song["lyrics"]: lyric = lyric.strip() if lyric: if "<<screen_name>>" in lyric: lyric = lyric.replace("<<screen_name>>", "@" + target) if hashtag: lyric += " " + hashtag while lyric in lastlyrics: lyric += random.choice(self.mutation) lastlyrics.add(lyric) self.identity.statistics.record_outgoing_song_lyric() in_reply_to_id_str = self._send_to( inbox_item, lyric, target, in_reply_to_id_str) time.sleep(5) def _send_to(self, inbox_item, text, target, in_reply_to_id_str): if inbox_item: return self.reply_with( inbox_item=inbox_item, text=text, in_reply_to_id_str=in_reply_to_id_str) else: status = "" if target: # noinspection PyUnresolvedReferences if isinstance(target, basestring): status = ".@" + target elif isinstance(target, User.User): status = ".@" + target.screen_name status += " " + text tweet = OutgoingTweet( text=status, in_reply_to_id_str=in_reply_to_id_str) return self.send(tweet) @retry(**retry_args) def get_list_subscriptions(self): return self.twitter.get_list_subscriptions() @retry(**retry_args) def subscribe_to_list(self, list_id): return self.twitter.subscribe_to_list(list_id=list_id) @retry(**retry_args) def geocode(self, location): result = self.twitter.search_geo( query=location.full_name, max_results=5, lat=location.latitude, long=location.longitude) logger.info(result) if result["result"]["places"]: # for place in result["result"]["places"]: # logger.info(place["full_name"]) place = result["result"]["places"][0] location.place_id_twitter = place["id"] return location else: return None @retry(**retry_args) def reverse_geocode(self, location): result = self.twitter.reverse_geocode( max_results=5, lat=location.latitude, long=location.longitude) logger.info(result) if result["result"]["places"]: # for place in result["result"]["places"]: # logger.info(place["full_name"]) place = result["result"]["places"][0] location.place_id_twitter = place["id"] return location else: return None @retry(**retry_args) def update_profile_image(self, file_path): if file_path: logger.info("updating profile image %s" % file_path) with open(file_path, 'rb') as file: self.twitter.update_profile_image(image=file) @retry(**retry_args) def update_profile_banner_image(self, file_path): if file_path: logger.info("updating banner image %s" % file_path) with open(file_path, 'rb') as file: try: self.twitter.update_profile_banner_image(banner=file) except TwythonError as ex: if "Response was not valid JSON" in str(ex): # twython issue i think logger.warning(ex) else: raise @retry(**retry_args) def update_profile(self, **kwargs): return self.twitter.update_profile(**kwargs) @retry(**retry_args) def get_list_statuses(self, **kwargs): return self.twitter.get_list_statuses(**kwargs) @retry(**retry_args) def get_user_suggestions_by_slug(self, **kwargs): return self.twitter.get_user_suggestions_by_slug(**kwargs) @retry(**retry_args) def get_user_suggestions(self, **kwargs): return self.twitter.get_user_suggestions(**kwargs) @retry(**retry_args) def lookup_status(self, **kwargs): return self.twitter.lookup_status(**kwargs) @retry(**retry_args) def get_followers(self, **kwargs): kwargs["stringify_ids"] = True followers = set() cursor = -1 while cursor != "0": kwargs["cursor"] = cursor logger.info("getting followers") response = self.twitter.get_followers_ids(**kwargs) cursor = response["next_cursor_str"] followers = followers.union(set(response["ids"])) return followers @retry(**retry_args) def get_following(self, **kwargs): kwargs["stringify_ids"] = True following = set() cursor = -1 while cursor != "0": kwargs["cursor"] = cursor logger.info("getting following") response = self.twitter.get_friends_ids(**kwargs) cursor = response["next_cursor_str"] following = following.union(set(response["ids"])) return following @retry(**retry_args) def update_rate_limits(self): data = self.twitter.get_application_rate_limit_status() self.rates = RateLimits(data) logger.info("Updated rate limits for {}: {}".format(self.identity.screen_name, self.rates.display())) def _rate_limit(self, limit_name, func, *args, **kwargs): if self.rates.can(limit_name): try: return func(*args, **kwargs) except Exception as ex: logger.warning(ex) return None else: logger.warning("{} limit exceeded".format(limit_name)) return None @retry(**retry_args) def get_statuses(self, id_strs): id_strs_csv = ",".join(id_strs) return self.twitter.lookup_status(id=id_strs_csv) @retry(**retry_args) def get_status(self, id_str): return self.twitter.show_status(id=id_str)
class TwythonAPITestCase(unittest.TestCase): def setUp(self): client_args = { 'headers': { 'User-Agent': '__twython__ Test' }, 'allow_redirects': False } oauth2_client_args = { 'headers': {} # This is so we can hit coverage that Twython sets User-Agent for us if none is supplied } self.api = Twython(app_key, app_secret, oauth_token, oauth_token_secret, client_args=client_args) self.oauth2_api = Twython(app_key, access_token=access_token, client_args=oauth2_client_args) def test_construct_api_url(self): """Test constructing a Twitter API url works as we expect""" url = 'https://api.twitter.com/1.1/search/tweets.json' constructed_url = self.api.construct_api_url(url, q='#twitter') self.assertEqual(constructed_url, 'https://api.twitter.com/1.1/search/tweets.json?q=%23twitter') def test_get(self): """Test Twython generic GET request works""" self.api.get('account/verify_credentials') def test_post(self): """Test Twython generic POST request works, with a full url and with just an endpoint""" update_url = 'https://api.twitter.com/1.1/statuses/update.json' status = self.api.post(update_url, params={'status': 'I love Twython!'}) self.api.post('statuses/destroy/%s' % status['id_str']) def test_get_lastfunction_header(self): """Test getting last specific header of the last API call works""" self.api.get('statuses/home_timeline') self.api.get_lastfunction_header('x-rate-limit-remaining') def test_get_lastfunction_header_not_present(self): """Test getting specific header that does not exist from the last call returns None""" self.api.get('statuses/home_timeline') header = self.api.get_lastfunction_header('does-not-exist') self.assertEqual(header, None) def test_get_lastfunction_header_no_last_api_call(self): """Test attempting to get a header when no API call was made raises a TwythonError""" self.assertRaises(TwythonError, self.api.get_lastfunction_header, 'no-api-call-was-made') def test_search_gen(self): """Test looping through the generator results works, at least once that is""" search = self.api.search_gen('twitter', count=1) counter = 0 while counter < 2: counter += 1 result = next(search) new_id_str = int(result['id_str']) if counter == 1: prev_id_str = new_id_str time.sleep(1) # Give time for another tweet to come into search if counter == 2: self.assertTrue(new_id_str > prev_id_str) def test_encode(self): """Test encoding UTF-8 works""" self.api.encode('Twython is awesome!') def test_html_for_tweet(self): """Test HTML for Tweet returns what we want""" tweet_text = self.api.html_for_tweet(test_tweet_object) self.assertEqual(test_tweet_html, tweet_text) def test_html_for_tweet_expanded_url(self): """Test using expanded url in HTML for Tweet displays full urls""" tweet_text = self.api.html_for_tweet(test_tweet_object, use_expanded_url=True) # Make sure full url is in HTML self.assertTrue('http://google.com' in tweet_text) def test_html_for_tweet_short_url(self): """Test using expanded url in HTML for Tweet displays full urls""" tweet_text = self.api.html_for_tweet(test_tweet_object, False) # Make sure HTML doesn't contain the display OR exapanded url self.assertTrue(not 'http://google.com' in tweet_text) self.assertTrue(not 'google.com' in tweet_text) def test_raise_error_on_bad_ssl_cert(self): """Test TwythonError is raised by a RequestException when an actual HTTP happens""" self.assertRaises(TwythonError, self.api.get, 'https://example.com') # Timelines def test_get_mentions_timeline(self): """Test returning mentions timeline for authenticated user succeeds""" self.api.get_mentions_timeline() def test_get_user_timeline(self): """Test returning timeline for authenticated user and random user succeeds""" self.api.get_user_timeline() # Authenticated User Timeline self.api.get_user_timeline(screen_name='twitter') # Random User Timeline def test_get_protected_user_timeline_following(self): """Test returning a protected user timeline who you are following succeeds""" self.api.get_user_timeline(screen_name=protected_twitter_1) def test_get_protected_user_timeline_not_following(self): """Test returning a protected user timeline who you are not following fails and raise a TwythonAuthError""" self.assertRaises(TwythonAuthError, self.api.get_user_timeline, screen_name=protected_twitter_2) def test_retweeted_of_me(self): """Test that getting recent tweets by authenticated user that have been retweeted by others succeeds""" self.api.retweeted_of_me() def test_get_home_timeline(self): """Test returning home timeline for authenticated user succeeds""" self.api.get_home_timeline() # Tweets def test_get_retweets(self): """Test getting retweets of a specific tweet succeeds""" self.api.get_retweets(id=test_tweet_id) def test_show_status(self): """Test returning a single status details succeeds""" self.api.show_status(id=test_tweet_id) def test_update_and_destroy_status(self): """Test updating and deleting a status succeeds""" status = self.api.update_status(status='Test post just to get deleted :(') self.api.destroy_status(id=status['id_str']) def test_get_oembed_tweet(self): """Test getting info to embed tweet on Third Party site succeeds""" self.api.get_oembed_tweet(id='99530515043983360') def test_get_retweeters_ids(self): """Test getting ids for people who retweeted a tweet succeeds""" self.api.get_retweeters_ids(id='99530515043983360') # Search def test_search(self): """Test searching tweets succeeds""" self.api.search(q='twitter') # Direct Messages def test_get_direct_messages(self): """Test getting the authenticated users direct messages succeeds""" self.api.get_direct_messages() def test_get_sent_messages(self): """Test getting the authenticated users direct messages they've sent succeeds""" self.api.get_sent_messages() def test_send_get_and_destroy_direct_message(self): """Test sending, getting, then destory a direct message succeeds""" message = self.api.send_direct_message(screen_name=protected_twitter_1, text='Hey d00d! %s' % int(time.time())) self.api.get_direct_message(id=message['id_str']) self.api.destroy_direct_message(id=message['id_str']) def test_send_direct_message_to_non_follower(self): """Test sending a direct message to someone who doesn't follow you fails""" self.assertRaises(TwythonError, self.api.send_direct_message, screen_name=protected_twitter_2, text='Yo, man!') # Friends & Followers def test_get_user_ids_of_blocked_retweets(self): """Test that collection of user_ids that the authenticated user does not want to receive retweets from succeeds""" self.api.get_user_ids_of_blocked_retweets(stringify_ids=True) def test_get_friends_ids(self): """Test returning ids of users the authenticated user and then a random user is following succeeds""" self.api.get_friends_ids() self.api.get_friends_ids(screen_name='twitter') def test_get_followers_ids(self): """Test returning ids of users the authenticated user and then a random user are followed by succeeds""" self.api.get_followers_ids() self.api.get_followers_ids(screen_name='twitter') def test_lookup_friendships(self): """Test returning relationships of the authenticating user to the comma-separated list of up to 100 screen_names or user_ids provided succeeds""" self.api.lookup_friendships(screen_name='twitter,ryanmcgrath') def test_get_incoming_friendship_ids(self): """Test returning incoming friendship ids succeeds""" self.api.get_incoming_friendship_ids() def test_get_outgoing_friendship_ids(self): """Test returning outgoing friendship ids succeeds""" self.api.get_outgoing_friendship_ids() def test_create_friendship(self): """Test creating a friendship succeeds""" self.api.create_friendship(screen_name='justinbieber') def test_destroy_friendship(self): """Test destroying a friendship succeeds""" self.api.destroy_friendship(screen_name='justinbieber') def test_update_friendship(self): """Test updating friendships succeeds""" self.api.update_friendship(screen_name=protected_twitter_1, retweets='true') self.api.update_friendship(screen_name=protected_twitter_1, retweets=False) def test_show_friendships(self): """Test showing specific friendship succeeds""" self.api.show_friendship(target_screen_name=protected_twitter_1) def test_get_friends_list(self): """Test getting list of users authenticated user then random user is following succeeds""" self.api.get_friends_list() self.api.get_friends_list(screen_name='twitter') def test_get_followers_list(self): """Test getting list of users authenticated user then random user are followed by succeeds""" self.api.get_followers_list() self.api.get_followers_list(screen_name='twitter') # Users def test_get_account_settings(self): """Test getting the authenticated user account settings succeeds""" self.api.get_account_settings() def test_verify_credentials(self): """Test representation of the authenticated user call succeeds""" self.api.verify_credentials() def test_update_account_settings(self): """Test updating a user account settings succeeds""" self.api.update_account_settings(lang='en') def test_update_delivery_service(self): """Test updating delivery settings fails because we don't have a mobile number on the account""" self.assertRaises(TwythonError, self.api.update_delivery_service, device='none') def test_update_profile(self): """Test updating profile succeeds""" self.api.update_profile(include_entities='true') def test_update_profile_colors(self): """Test updating profile colors succeeds""" self.api.update_profile_colors(profile_background_color='3D3D3D') def test_list_blocks(self): """Test listing users who are blocked by the authenticated user succeeds""" self.api.list_blocks() def test_list_block_ids(self): """Test listing user ids who are blocked by the authenticated user succeeds""" self.api.list_block_ids() def test_create_block(self): """Test blocking a user succeeds""" self.api.create_block(screen_name='justinbieber') def test_destroy_block(self): """Test unblocking a user succeeds""" self.api.destroy_block(screen_name='justinbieber') def test_lookup_user(self): """Test listing a number of user objects succeeds""" self.api.lookup_user(screen_name='twitter,justinbieber') def test_show_user(self): """Test showing one user works""" self.api.show_user(screen_name='twitter') def test_search_users(self): """Test that searching for users succeeds""" self.api.search_users(q='Twitter API') def test_get_contributees(self): """Test returning list of accounts the specified user can contribute to succeeds""" self.api.get_contributees(screen_name='TechCrunch') def test_get_contributors(self): """Test returning list of accounts that contribute to the authenticated user fails because we are not a Contributor account""" self.assertRaises(TwythonError, self.api.get_contributors, screen_name=screen_name) def test_remove_profile_banner(self): """Test removing profile banner succeeds""" self.api.remove_profile_banner() def test_get_profile_banner_sizes(self): """Test getting list of profile banner sizes fails because we have not uploaded a profile banner""" self.assertRaises(TwythonError, self.api.get_profile_banner_sizes) # Suggested Users def test_get_user_suggestions_by_slug(self): """Test getting user suggestions by slug succeeds""" self.api.get_user_suggestions_by_slug(slug='twitter') def test_get_user_suggestions(self): """Test getting user suggestions succeeds""" self.api.get_user_suggestions() def test_get_user_suggestions_statuses_by_slug(self): """Test getting status of suggested users succeeds""" self.api.get_user_suggestions_statuses_by_slug(slug='funny') # Favorites def test_get_favorites(self): """Test getting list of favorites for the authenticated user succeeds""" self.api.get_favorites() def test_create_and_destroy_favorite(self): """Test creating and destroying a favorite on a tweet succeeds""" self.api.create_favorite(id=test_tweet_id) self.api.destroy_favorite(id=test_tweet_id) # Lists def test_show_lists(self): """Test show lists for specified user""" self.api.show_lists(screen_name='twitter') def test_get_list_statuses(self): """Test timeline of tweets authored by members of the specified list succeeds""" self.api.get_list_statuses(list_id=test_list_id) def test_create_update_destroy_list_add_remove_list_members(self): """Test create a list, adding and removing members then deleting the list succeeds""" the_list = self.api.create_list(name='Stuff') list_id = the_list['id_str'] self.api.update_list(list_id=list_id, name='Stuff Renamed') screen_names = ['johncena', 'xbox'] # Multi add/delete members self.api.create_list_members(list_id=list_id, screen_name=screen_names) self.api.delete_list_members(list_id=list_id, screen_name=screen_names) # Single add/delete member self.api.add_list_member(list_id=list_id, screen_name='justinbieber') self.api.delete_list_member(list_id=list_id, screen_name='justinbieber') self.api.delete_list(list_id=list_id) def test_get_list_subscribers(self): """Test list of subscribers of a specific list succeeds""" self.api.get_list_subscribers(list_id=test_list_id) def test_subscribe_is_subbed_and_unsubscribe_to_list(self): """Test subscribing, is a list sub and unsubbing to list succeeds""" self.api.subscribe_to_list(list_id=test_list_id) # Returns 404 if user is not a subscriber self.api.is_list_subscriber(list_id=test_list_id, screen_name=screen_name) self.api.unsubscribe_from_list(list_id=test_list_id) def test_is_list_member(self): """Test returning if specified user is member of a list succeeds""" # Returns 404 if not list member self.api.is_list_member(list_id=test_list_id, screen_name='jack') def test_get_list_members(self): """Test listing members of the specified list succeeds""" self.api.get_list_members(list_id=test_list_id) def test_get_specific_list(self): """Test getting specific list succeeds""" self.api.get_specific_list(list_id=test_list_id) def test_get_list_subscriptions(self): """Test collection of the lists the specified user is subscribed to succeeds""" self.api.get_list_subscriptions(screen_name='twitter') def test_show_owned_lists(self): """Test collection of lists the specified user owns succeeds""" self.api.show_owned_lists(screen_name='twitter') # Saved Searches def test_get_saved_searches(self): """Test getting list of saved searches for authenticated user succeeds""" self.api.get_saved_searches() def test_create_get_destroy_saved_search(self): """Test getting list of saved searches for authenticated user succeeds""" saved_search = self.api.create_saved_search(query='#Twitter') saved_search_id = saved_search['id_str'] self.api.show_saved_search(id=saved_search_id) self.api.destroy_saved_search(id=saved_search_id) # Places & Geo def test_get_geo_info(self): """Test getting info about a geo location succeeds""" self.api.get_geo_info(place_id='df51dec6f4ee2b2c') def test_reverse_geo_code(self): """Test reversing geocode succeeds""" self.api.reverse_geocode(lat='37.76893497', long='-122.42284884') def test_search_geo(self): """Test search for places that can be attached to a statuses/update succeeds""" self.api.search_geo(query='Toronto') def test_get_similar_places(self): """Test locates places near the given coordinates which are similar in name succeeds""" self.api.get_similar_places(lat='37', long='-122', name='Twitter HQ') # Trends def test_get_place_trends(self): """Test getting the top 10 trending topics for a specific WOEID succeeds""" self.api.get_place_trends(id=1) def test_get_available_trends(self): """Test returning locations that Twitter has trending topic information for succeeds""" self.api.get_available_trends() def test_get_closest_trends(self): """Test getting the locations that Twitter has trending topic information for, closest to a specified location succeeds""" self.api.get_closest_trends(lat='37', long='-122') # Help def test_get_application_rate_limit_status(self): """Test getting application rate limit status succeeds""" self.oauth2_api.get_application_rate_limit_status()
"!dice": bot.dice, "!flip": bot.flip, "!countdown": bot.countdown, "!quit": bot.quit } moduleCalls[command](x) except Exception as ex: pass # trigger = file.read() twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET) since = "1050347525364830208" while True: while True: limits = twitter.get_application_rate_limit_status() howmany = limits["resources"]["statuses"]["/statuses/home_timeline"][ "remaining"] if int(howmany) <= 0: break timewhen = limits["resources"]["statuses"]["/statuses/home_timeline"][ "reset"] wait = (int(timewhen) - int(datetime.now().strftime('%s'))) / howmany timeline = twitter.get_home_timeline(since_id=since) print("get_home_timeline calls remaining {} reset in {}".format( howmany, wait * howmany)) for tweet in reversed(timeline): since = tweet['id'] check(tweet) time.sleep(wait) timeleft = int(timewhen) - int(datetime.now().strftime('%s'))
def twython_auth(app_keys, query_type='tweets'): ''' Authenticate to Twitter using multiple credentials. ''' resource = { 'tweets': ['search', '/search/tweets'], 'timeline': ['statuses', '/statuses/user_timeline'], 'ids': ['statuses', '/statuses/lookup'], 'id': ['statuses', '/statuses/show/:id'], 'retweets': ['statuses', '/statuses/retweets/:id'], 'retweeters': ['statuses', '/statuses/retweeters/ids'], 'users': ['users', '/users/lookup'], 'user': ['users', '/users/show/:id'], 'friends': ['friends', '/friends/ids'], 'followers': ['followers', '/followers/ids'], 'trends': ['trends', '/trends/place'] } rtype = resource[query_type][0] rpoint = resource[query_type][1] remaining = 0 len_app_keys = len(app_keys) while True: tts = 900 rate_limit_exceeded = False for key in app_keys: try: # authenticate twitter = Twython(key[0], key[1], oauth_version=2) access_token = twitter.obtain_access_token() twitter = Twython(key[0], access_token=access_token) rate_limit_status = twitter.get_application_rate_limit_status( resources=rtype) rate_limit_status = rate_limit_status['resources'][rtype][ rpoint] reset = rate_limit_status['reset'] - time() + 1 remaining = rate_limit_status['remaining'] limit = rate_limit_status['limit'] if remaining > 0: print( 'Requests left:', str(remaining) + '/' + str(limit), '(' + str(app_keys.index(key) + 1) + '/' + str(len_app_keys) + ')') return twitter elif tts > reset: tts = reset except TwythonRateLimitError: rate_limit_exceeded = True except Exception as e: #raise # <-- uncomment line if bug-hunting print('Warning:', e) if remaining == 0: print('Warning: 0 requests left.')\ if rate_limit_exceeded else None sleep_seconds(tts)
class TwythonAPITestCase(unittest.TestCase): def setUp(self): client_args = { 'headers': { 'User-Agent': '__twython__ Test' }, 'allow_redirects': False } oauth2_client_args = { 'headers': { } # This is so we can hit coverage that Twython sets User-Agent for us if none is supplied } self.api = Twython(app_key, app_secret, oauth_token, oauth_token_secret, client_args=client_args) self.oauth2_api = Twython(app_key, access_token=access_token, client_args=oauth2_client_args) def test_construct_api_url(self): """Test constructing a Twitter API url works as we expect""" url = 'https://api.twitter.com/1.1/search/tweets.json' constructed_url = self.api.construct_api_url(url, q='#twitter') self.assertEqual( constructed_url, 'https://api.twitter.com/1.1/search/tweets.json?q=%23twitter') def test_get(self): """Test Twython generic GET request works""" self.api.get('account/verify_credentials') def test_post(self): """Test Twython generic POST request works, with a full url and with just an endpoint""" update_url = 'https://api.twitter.com/1.1/statuses/update.json' status = self.api.post( update_url, params={'status': 'I love Twython! %s' % int(time.time())}) self.api.post('statuses/destroy/%s' % status['id_str']) def test_get_lastfunction_header(self): """Test getting last specific header of the last API call works""" self.api.get('statuses/home_timeline') self.api.get_lastfunction_header('x-rate-limit-remaining') def test_get_lastfunction_header_not_present(self): """Test getting specific header that does not exist from the last call returns None""" self.api.get('statuses/home_timeline') header = self.api.get_lastfunction_header('does-not-exist') self.assertEqual(header, None) def test_get_lastfunction_header_no_last_api_call(self): """Test attempting to get a header when no API call was made raises a TwythonError""" self.assertRaises(TwythonError, self.api.get_lastfunction_header, 'no-api-call-was-made') def test_cursor(self): """Test looping through the generator results works, at least once that is""" search = self.api.cursor(self.api.search, q='twitter', count=1) counter = 0 while counter < 2: counter += 1 result = next(search) new_id_str = int(result['id_str']) if counter == 1: prev_id_str = new_id_str time.sleep( 1) # Give time for another tweet to come into search if counter == 2: self.assertTrue(new_id_str > prev_id_str) def test_encode(self): """Test encoding UTF-8 works""" self.api.encode('Twython is awesome!') def test_html_for_tweet(self): """Test HTML for Tweet returns what we want""" tweet_text = self.api.html_for_tweet(test_tweet_object) self.assertEqual(test_tweet_html, tweet_text) def test_html_for_tweet_expanded_url(self): """Test using expanded url in HTML for Tweet displays full urls""" tweet_text = self.api.html_for_tweet(test_tweet_object, use_expanded_url=True) # Make sure full url is in HTML self.assertTrue('http://google.com' in tweet_text) def test_html_for_tweet_short_url(self): """Test using expanded url in HTML for Tweet displays full urls""" tweet_text = self.api.html_for_tweet(test_tweet_object, False) # Make sure HTML doesn't contain the display OR exapanded url self.assertTrue(not 'http://google.com' in tweet_text) self.assertTrue(not 'google.com' in tweet_text) def test_raise_error_on_bad_ssl_cert(self): """Test TwythonError is raised by a RequestException when an actual HTTP happens""" self.assertRaises(TwythonError, self.api.get, 'https://example.com') # Timelines def test_get_mentions_timeline(self): """Test returning mentions timeline for authenticated user succeeds""" self.api.get_mentions_timeline() def test_get_user_timeline(self): """Test returning timeline for authenticated user and random user succeeds""" self.api.get_user_timeline() # Authenticated User Timeline self.api.get_user_timeline( screen_name='twitter') # Random User Timeline def test_get_protected_user_timeline_following(self): """Test returning a protected user timeline who you are following succeeds""" self.api.get_user_timeline(screen_name=protected_twitter_1) def test_get_protected_user_timeline_not_following(self): """Test returning a protected user timeline who you are not following fails and raise a TwythonAuthError""" self.assertRaises(TwythonAuthError, self.api.get_user_timeline, screen_name=protected_twitter_2) def test_retweeted_of_me(self): """Test that getting recent tweets by authenticated user that have been retweeted by others succeeds""" self.api.retweeted_of_me() def test_get_home_timeline(self): """Test returning home timeline for authenticated user succeeds""" self.api.get_home_timeline() # Tweets def test_get_retweets(self): """Test getting retweets of a specific tweet succeeds""" self.api.get_retweets(id=test_tweet_id) def test_show_status(self): """Test returning a single status details succeeds""" self.api.show_status(id=test_tweet_id) def test_update_and_destroy_status(self): """Test updating and deleting a status succeeds""" status = self.api.update_status( status='Test post just to get deleted :( %s' % int(time.time())) self.api.destroy_status(id=status['id_str']) def test_get_oembed_tweet(self): """Test getting info to embed tweet on Third Party site succeeds""" self.api.get_oembed_tweet(id='99530515043983360') def test_get_retweeters_ids(self): """Test getting ids for people who retweeted a tweet succeeds""" self.api.get_retweeters_ids(id='99530515043983360') # Search def test_search(self): """Test searching tweets succeeds""" self.api.search(q='twitter') # Direct Messages def test_get_direct_messages(self): """Test getting the authenticated users direct messages succeeds""" self.api.get_direct_messages() def test_get_sent_messages(self): """Test getting the authenticated users direct messages they've sent succeeds""" self.api.get_sent_messages() def test_send_get_and_destroy_direct_message(self): """Test sending, getting, then destory a direct message succeeds""" message = self.api.send_direct_message(screen_name=protected_twitter_1, text='Hey d00d! %s' % int(time.time())) self.api.get_direct_message(id=message['id_str']) self.api.destroy_direct_message(id=message['id_str']) def test_send_direct_message_to_non_follower(self): """Test sending a direct message to someone who doesn't follow you fails""" self.assertRaises(TwythonError, self.api.send_direct_message, screen_name=protected_twitter_2, text='Yo, man! %s' % int(time.time())) # Friends & Followers def test_get_user_ids_of_blocked_retweets(self): """Test that collection of user_ids that the authenticated user does not want to receive retweets from succeeds""" self.api.get_user_ids_of_blocked_retweets(stringify_ids=True) def test_get_friends_ids(self): """Test returning ids of users the authenticated user and then a random user is following succeeds""" self.api.get_friends_ids() self.api.get_friends_ids(screen_name='twitter') def test_get_followers_ids(self): """Test returning ids of users the authenticated user and then a random user are followed by succeeds""" self.api.get_followers_ids() self.api.get_followers_ids(screen_name='twitter') def test_lookup_friendships(self): """Test returning relationships of the authenticating user to the comma-separated list of up to 100 screen_names or user_ids provided succeeds""" self.api.lookup_friendships(screen_name='twitter,ryanmcgrath') def test_get_incoming_friendship_ids(self): """Test returning incoming friendship ids succeeds""" self.api.get_incoming_friendship_ids() def test_get_outgoing_friendship_ids(self): """Test returning outgoing friendship ids succeeds""" self.api.get_outgoing_friendship_ids() def test_create_friendship(self): """Test creating a friendship succeeds""" self.api.create_friendship(screen_name='justinbieber') def test_destroy_friendship(self): """Test destroying a friendship succeeds""" self.api.destroy_friendship(screen_name='justinbieber') def test_update_friendship(self): """Test updating friendships succeeds""" self.api.update_friendship(screen_name=protected_twitter_1, retweets='true') self.api.update_friendship(screen_name=protected_twitter_1, retweets=False) def test_show_friendships(self): """Test showing specific friendship succeeds""" self.api.show_friendship(target_screen_name=protected_twitter_1) def test_get_friends_list(self): """Test getting list of users authenticated user then random user is following succeeds""" self.api.get_friends_list() self.api.get_friends_list(screen_name='twitter') def test_get_followers_list(self): """Test getting list of users authenticated user then random user are followed by succeeds""" self.api.get_followers_list() self.api.get_followers_list(screen_name='twitter') # Users def test_get_account_settings(self): """Test getting the authenticated user account settings succeeds""" self.api.get_account_settings() def test_verify_credentials(self): """Test representation of the authenticated user call succeeds""" self.api.verify_credentials() def test_update_account_settings(self): """Test updating a user account settings succeeds""" self.api.update_account_settings(lang='en') def test_update_delivery_service(self): """Test updating delivery settings fails because we don't have a mobile number on the account""" self.assertRaises(TwythonError, self.api.update_delivery_service, device='none') def test_update_profile(self): """Test updating profile succeeds""" self.api.update_profile(include_entities='true') def test_update_profile_colors(self): """Test updating profile colors succeeds""" self.api.update_profile_colors(profile_background_color='3D3D3D') def test_list_blocks(self): """Test listing users who are blocked by the authenticated user succeeds""" self.api.list_blocks() def test_list_block_ids(self): """Test listing user ids who are blocked by the authenticated user succeeds""" self.api.list_block_ids() def test_create_block(self): """Test blocking a user succeeds""" self.api.create_block(screen_name='justinbieber') def test_destroy_block(self): """Test unblocking a user succeeds""" self.api.destroy_block(screen_name='justinbieber') def test_lookup_user(self): """Test listing a number of user objects succeeds""" self.api.lookup_user(screen_name='twitter,justinbieber') def test_show_user(self): """Test showing one user works""" self.api.show_user(screen_name='twitter') def test_search_users(self): """Test that searching for users succeeds""" self.api.search_users(q='Twitter API') def test_get_contributees(self): """Test returning list of accounts the specified user can contribute to succeeds""" self.api.get_contributees(screen_name='TechCrunch') def test_get_contributors(self): """Test returning list of accounts that contribute to the authenticated user fails because we are not a Contributor account""" self.assertRaises(TwythonError, self.api.get_contributors, screen_name=screen_name) def test_remove_profile_banner(self): """Test removing profile banner succeeds""" self.api.remove_profile_banner() def test_get_profile_banner_sizes(self): """Test getting list of profile banner sizes fails because we have not uploaded a profile banner""" self.assertRaises(TwythonError, self.api.get_profile_banner_sizes) # Suggested Users def test_get_user_suggestions_by_slug(self): """Test getting user suggestions by slug succeeds""" self.api.get_user_suggestions_by_slug(slug='twitter') def test_get_user_suggestions(self): """Test getting user suggestions succeeds""" self.api.get_user_suggestions() def test_get_user_suggestions_statuses_by_slug(self): """Test getting status of suggested users succeeds""" self.api.get_user_suggestions_statuses_by_slug(slug='funny') # Favorites def test_get_favorites(self): """Test getting list of favorites for the authenticated user succeeds""" self.api.get_favorites() def test_create_and_destroy_favorite(self): """Test creating and destroying a favorite on a tweet succeeds""" self.api.create_favorite(id=test_tweet_id) self.api.destroy_favorite(id=test_tweet_id) # Lists def test_show_lists(self): """Test show lists for specified user""" self.api.show_lists(screen_name='twitter') def test_get_list_statuses(self): """Test timeline of tweets authored by members of the specified list succeeds""" self.api.get_list_statuses( slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) def test_create_update_destroy_list_add_remove_list_members(self): """Test create a list, adding and removing members then deleting the list succeeds""" the_list = self.api.create_list(name='Stuff %s' % int(time.time())) list_id = the_list['id_str'] self.api.update_list(list_id=list_id, name='Stuff Renamed %s' % int(time.time())) screen_names = ['johncena', 'xbox'] # Multi add/delete members self.api.create_list_members(list_id=list_id, screen_name=screen_names) self.api.delete_list_members(list_id=list_id, screen_name=screen_names) # Single add/delete member self.api.add_list_member(list_id=list_id, screen_name='justinbieber') self.api.delete_list_member(list_id=list_id, screen_name='justinbieber') self.api.delete_list(list_id=list_id) def test_get_list_memberships(self): """Test list of memberhips the authenticated user succeeds""" self.api.get_list_memberships() def test_get_list_subscribers(self): """Test list of subscribers of a specific list succeeds""" self.api.get_list_subscribers( slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) def test_subscribe_is_subbed_and_unsubscribe_to_list(self): """Test subscribing, is a list sub and unsubbing to list succeeds""" self.api.subscribe_to_list( slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) # Returns 404 if user is not a subscriber self.api.is_list_subscriber( slug=test_list_slug, owner_screen_name=test_list_owner_screen_name, screen_name=screen_name) self.api.unsubscribe_from_list( slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) def test_is_list_member(self): """Test returning if specified user is member of a list succeeds""" # Returns 404 if not list member self.api.is_list_member(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name, screen_name='themattharris') def test_get_list_members(self): """Test listing members of the specified list succeeds""" self.api.get_list_members( slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) def test_get_specific_list(self): """Test getting specific list succeeds""" self.api.get_specific_list( slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) def test_get_list_subscriptions(self): """Test collection of the lists the specified user is subscribed to succeeds""" self.api.get_list_subscriptions(screen_name='twitter') def test_show_owned_lists(self): """Test collection of lists the specified user owns succeeds""" self.api.show_owned_lists(screen_name='twitter') # Saved Searches def test_get_saved_searches(self): """Test getting list of saved searches for authenticated user succeeds""" self.api.get_saved_searches() def test_create_get_destroy_saved_search(self): """Test getting list of saved searches for authenticated user succeeds""" saved_search = self.api.create_saved_search(query='#Twitter') saved_search_id = saved_search['id_str'] self.api.show_saved_search(id=saved_search_id) self.api.destroy_saved_search(id=saved_search_id) # Places & Geo def test_get_geo_info(self): """Test getting info about a geo location succeeds""" self.api.get_geo_info(place_id='df51dec6f4ee2b2c') def test_reverse_geo_code(self): """Test reversing geocode succeeds""" self.api.reverse_geocode(lat='37.76893497', long='-122.42284884') def test_search_geo(self): """Test search for places that can be attached to a statuses/update succeeds""" self.api.search_geo(query='Toronto') def test_get_similar_places(self): """Test locates places near the given coordinates which are similar in name succeeds""" self.api.get_similar_places(lat='37', long='-122', name='Twitter HQ') # Trends def test_get_place_trends(self): """Test getting the top 10 trending topics for a specific WOEID succeeds""" self.api.get_place_trends(id=1) def test_get_available_trends(self): """Test returning locations that Twitter has trending topic information for succeeds""" self.api.get_available_trends() def test_get_closest_trends(self): """Test getting the locations that Twitter has trending topic information for, closest to a specified location succeeds""" self.api.get_closest_trends(lat='37', long='-122') # Help def test_get_twitter_configuration(self): """Test getting Twitter's configuration succeeds""" self.api.get_twitter_configuration() def test_get_supported_languages(self): """Test getting languages supported by Twitter succeeds""" self.api.get_supported_languages() def test_privacy_policy(self): """Test getting Twitter's Privacy Policy succeeds""" self.api.get_privacy_policy() def test_get_tos(self): """Test getting the Twitter Terms of Service succeeds""" self.api.get_tos() def test_get_application_rate_limit_status(self): """Test getting application rate limit status succeeds""" self.oauth2_api.get_application_rate_limit_status()
i = 0 tweetCount = 0 calls = 0 successCount = 0 IDs = "" for line in f: line = line.strip() tweetID = line # tweetID = line.split(';')[0] # tweetID = tweetID[1:-1] i += 1 if i == 1 or i == 100: IDs += tweetID if i == 100: callsLimit = twitter.get_application_rate_limit_status( resources="statuses") remainingCalls = callsLimit["resources"]["statuses"][ "/statuses/lookup"]["remaining"] if (remainingCalls == 0 or calls == 170): print("Sleeping 15 mins") time.sleep(60 * 15) print("Awakening") twitter = Twython(APP_KEY, access_token=ACCESS_TOKEN) calls = 0 tweets = twitter.lookup_status( id=IDs ) # only gets the tweets that exists or can be viewed by the given APP_KEY successCount += len(tweets) calls += 1
class twitterbot: __twitter = None __db = None def __init__(self, file_path_bot=None, file_path_db=None): if file_path_bot is None: file_path_bot = 'twitter_aut.json' access = {'apiKey': '', 'apiSecret': '', 'accessToken': '', 'accessTokenSecret': ''} if os.path.isfile(file_path_bot): with open(file_path_bot, 'r') as f: access = json.load(f) else: with open(file_path_bot, 'w') as outfile: json.dump(access, outfile) self.__twitter = Twython(access['apiKey'], access['apiSecret'], access['accessToken'], access['accessTokenSecret']) self.__db = BotDb(file_path_db=file_path_db) def get_limits(self): limits = self.__twitter.get_application_rate_limit_status() return limits def tweet(self, msg): self.__twitter.update_status(status=msg) def __check_tags(self, tweet_tags, tags): for tweet_tag in tweet_tags: if tweet_tag in tags: return True return False def __check_tweets(self): try: tweets = self.__db.get_open_tweets() for tweet in tweets: self.tweet(tweet.message) self.__db.set_tweet_to_sended(tweet.id) except twython.exceptions.TwythonError: self.__db.set_tweet_to_sended(tweet.id) except: info = sys.exc_info() print(info) def loop(self): while True: self.__check_tweets() tags = self.__db.get_tags() followers = self.__twitter.get_friends_list()['users'] for follower in followers: screenName = follower["screen_name"] tweets = self.__twitter.get_user_timeline(screen_name=screenName, tweet_mode='extended') for status in tweets: id = status['id'] tweet_tags = [tag['text'].lower() for tag in status['entities']['hashtags']] if self.__check_tags(tweet_tags, tags): if self.__db.add_try_retweet(int(id)): try: self.__twitter.retweet(id=id) except: pass break time.sleep(120) def run(self): _thread.start_new(self.loop, ())
l = len(sys.argv) if l == 1: limits = input("Enter the resources to check (separated by spaces): ") elif l == 2: limits = sys.argv[1] elif l > 2: limits = sys.argv[1:] else: limits = input("Enter the resources to check (separated by spaces): ") if limits.lower() == "all": limited = "application,favorites,followers,friends,lists,search,statuses,users,help" else: limit = limits.split() limited = ",".join(limit) num = len(limits) now = dd.utcnow() try: ltd = twitter.get_application_rate_limit_status(resources=limited) except TwythonError as e: print(e) pass pp(ltd) print("Valid at: {0} UTC".format(now.isoformat()))
dd = datetime.datetime pp = pprint.pprint l = len(sys.argv) if l == 1: limits = input("Enter the resources to check (separated by spaces): ") elif l == 2: limits = sys.argv[1] elif l > 2: limits = sys.argv[1:] else: limits = input("Enter the resources to check (separated by spaces): ") if limits.lower() == "all": limited = "application,favorites,followers,friends,lists,search,statuses,users,help" else: limit = limits.split() limited = ",".join(limit) num = len(limits) now = dd.utcnow() try: ltd = twitter.get_application_rate_limit_status(resources=limited) except TwythonError as e: print(e) pass pp(ltd) print("Valid at: {0} UTC".format(now.isoformat()))
class ParserREST: def __init__ (self, config): self.config = config self.db_cursor = DBCursor(self.config['database']) self.twitter = Twython(self.config['twitter']['appkeys']['app_key'], self.config['twitter']['appkeys']['app_secret'], self.config['twitter']['appkeys']['oauth_token'], self.config['twitter']['appkeys']['oauth_token_secret']) self.time_start = time.time() try: data = self.twitter.get_application_rate_limit_status(resources = 'statuses') self.timeline_request_counter = (data['resources']['statuses'] ['/statuses/user_timeline']['remaining']) except TwythonError as e: self.timeline_request_counter = int(self.config['twitter'] ['user_timeline']['limit_user']) logging.exception('ParserREST.__init__: {}'.format(e)) def parse(self): self.process = True while self.process: users_list = self.db_cursor.get_parse_user_list( last_time = int(self.config['twitter']['user_in_base']['timeout']), list_size = int(self.config['twitter']['user_in_base']['list_limit'])) if users_list: for i in users_list: self.parse_twitter_user(i[0]) else: self.process = False def parse_twitter_user(self,user_id): logging.info('user_id: {}'.format(user_id)) result = 0 try: statistic = self.db_cursor.select_user_statistic(user_id) if statistic is None: user = self.twitter.show_user(user_id=user_id) self.db_cursor.add_user_data(user) if user['statuses_count'] == 0: self.db_cursor.add_user_data({'last_tweet_id':1, 'last_statuses_count':0, 'user_id':user_id}) return else: result = self.get_user_timeline(user_id, 1) self.db_cursor.update_user_statistic({ 'last_tweet_id':result['last_id'], 'last_statuses_count':result['statuses_count'], 'user_id':user_id}) else: result = self.get_user_timeline(user_id, statistic['last_tweet_id']) self.db_cursor.update_user_statistic({ 'last_tweet_id':result['last_id'], 'last_statuses_count':result['statuses_count'] + statistic['statuses_count'], 'user_id':user_id}) except TwythonError as e: logging.exception('ParserREST.parse_twitter_user: {} Data: {}'.format(e, result)) return def get_user_timeline(self, user_id, since_id): statuses_count = 0 if since_id > 1: since_id_tmp = since_id - 1 else: since_id_tmp = 1 first = True process = True last_id = since_id while process: current_time = time.time() if ((current_time - self.time_start) > float(self.config['twitter']['time_window'])): self.time_start = current_time self.timeline_request_counter = int(self.config['twitter'] ['user_timeline']['limit_user']) if self.timeline_request_counter == 0: logging.info('Have to wait.') time.sleep(float(self.config['twitter']['time_window']) - (current_time - self.time_start)) else: self.timeline_request_counter = self.timeline_request_counter - 1 try: if first: user_timeline = self.twitter.get_user_timeline( user_id = user_id, count = int(self.config['twitter'] ['user_timeline']['page_size']), since_id = since_id_tmp, exclude_replies = True, include_rts = False, trim_user = True) else: user_timeline = self.twitter.get_user_timeline( user_id = user_id, count = int(self.config['twitter'] ['user_timeline']['page_size']), since_id = since_id_tmp, max_id = max_id, exclude_replies = True, include_rts = False, trim_user = True) except TwythonError as e: if e.error_code == 401: process = False logging.exception('ParserREST.get_user_timeline: {}'.format(e)) continue except ConnectionError as e: logging.exception('ParserREST.get_user_timeline: {}'.format(e)) time.sleep(30) self.twitter = Twython(self.config['twitter']['appkeys']['app_key'], self.config['twitter']['appkeys']['app_secret'], self.config['twitter']['appkeys']['oauth_token'], self.config['twitter']['appkeys']['oauth_token_secret']) continue if user_timeline: if first: last_id = user_timeline[0]['id'] first = False if user_timeline[-1]['id'] == since_id: del(user_timeline[-1]) process = False else: max_id = user_timeline[-1]['id'] - 1 for status in user_timeline: if (not (status['coordinates'] is None and status['place'] is None)): if self.db_cursor.add_tweet_data(status): statuses_count = statuses_count + 1 else: process = False else: process = False return {'statuses_count':statuses_count,'last_id':last_id} def get_user_timeline_test(self, user_id, since_id): since_id = 0 statuses_count = 0 if since_id > 1: since_id_tmp = since_id - 1 else: since_id_tmp = 1 first = True process = True last_id = since_id itr = 1 while process: current_time = time.time() #if ((current_time - self.time_start) > if ((current_time) > float(self.config['twitter']['time_window'])): self.time_start = current_time self.timeline_request_counter = int(self.config['twitter'] ['user_timeline']['limit_user']) if self.timeline_request_counter == 0: logging.info('Have to wait.') #time.sleep(float(self.config['twitter']['time_window']) - (current_time - self.time_start)) else: self.timeline_request_counter = self.timeline_request_counter - 1 try: itr = itr + 1 if first: user_timeline = [{'user':{'id':user_id, 'name':'test_user', 'screen_name':'test_user', 'profile_image_url':'testurl'}, 'id':1000*user_id + itr, 'created_at':'Sun Oct 13 15:07:48 +0000 2013', 'text':str(time.time()), 'coordinates':{'coordinates':[1, 1]}, 'place':None}] else: user_timeline = [{'user':{'id':user_id, 'name':'test_user', 'screen_name':'test_user', 'profile_image_url':'testurl'}, 'id':1000*user_id + itr, 'created_at':'Sun Oct 13 15:07:48 +0000 2013', 'text':str(time.time()), 'coordinates':{'coordinates':[1, 1]}, 'place':None}] if itr == 1001: user_timeline = None except TwythonError as e: if e.error_code == 401: process = False logging.exception('ParserREST.get_user_timeline: {}'.format(e)) continue except ConnectionError as e: logging.exception('ParserREST.get_user_timeline: {}'.format(e)) time.sleep(30) self.twitter = Twython(self.config['twitter']['appkeys']['app_key'], self.config['twitter']['appkeys']['app_secret'], self.config['twitter']['appkeys']['oauth_token'], self.config['twitter']['appkeys']['oauth_token_secret']) continue if user_timeline: if first: last_id = user_timeline[0]['id'] first = False if user_timeline[-1]['id'] == since_id: del(user_timeline[-1]) process = False else: max_id = user_timeline[-1]['id'] - 1 for status in user_timeline: if (not (status['coordinates'] is None and status['place'] is None)): if self.db_cursor.add_tweet_data(status): statuses_count = statuses_count + 1 else: process = False else: process = False return {'statuses_count':statuses_count,'last_id':last_id}
# stream.filter(track=['lovetwitter']) # app.run(use_reloader=True) # try 5 APP_KEY = 'zlHSEOcRXszheIurATDbV2oUl' APP_SECRET = '8H7oIwJgfF5S8OMtvMn5VWITTIiYSmBCrv4g8HVWgV5pUGSpkd' twitter = Twython(APP_KEY, APP_SECRET, oauth_version=2) ACCESS_TOKEN = twitter.obtain_access_token() print(ACCESS_TOKEN) APP_KEY = 'zlHSEOcRXszheIurATDbV2oUl' ACCESS_TOKEN = 'AAAAAAAAAAAAAAAAAAAAAL%2Bk3AAAAAAA8i2II4YkkUxCj5PN05Jqo%2B2eY6c%3D0A5BTusdf25Amld5Z459ViApMh2flZv8PLm7FyCVskAvIXEgpC' #COPY AND PASTE FROM OUTPUT FROM ABOVE COMMAND twitter = Twython(APP_KEY, access_token=ACCESS_TOKEN) twitter.get_application_rate_limit_status()['resources']['search'] #RETRIEVING REAL TIME STREAMING TWEETS ABOUT BLOCKCHAIN search = twitter.search(q='a', count=2000, result_type='mixed') tweets = search['statuses'] #for tweet in tweets: #print (tweet['id_str'], '\n', tweet['text'], tweet['favorite_count'], tweet['retweet_count'] ), '\n\n\n' ids = [] #for tweet in tweets: #ids.append(tweet['id_str']) # ids = [tweet['id_str'] for tweet in tweets] texts = [tweet['text'] for tweet in tweets] # times = [tweet['retweet_count'] for tweet in tweets] # favtimes = [tweet['favorite_count'] for tweet in tweets] # follower_count = [tweet['user']['followers_count'] for tweet in tweets] # location = [tweet['user']['location'] for tweet in tweets]
class TwythonEndpointsTestCase(unittest.TestCase): def setUp(self): client_args = { 'headers': { 'User-Agent': '__twython__ Test' }, 'allow_redirects': False } oauth2_client_args = { 'headers': {} # This is so we can hit coverage that Twython sets User-Agent for us if none is supplied } self.api = Twython(app_key, app_secret, oauth_token, oauth_token_secret, client_args=client_args) self.oauth2_api = Twython(app_key, access_token=access_token, client_args=oauth2_client_args) # Timelines @unittest.skip('skipping non-updated test') def test_get_mentions_timeline(self): """Test returning mentions timeline for authenticated user succeeds""" self.api.get_mentions_timeline() @unittest.skip('skipping non-updated test') def test_get_user_timeline(self): """Test returning timeline for authenticated user and random user succeeds""" self.api.get_user_timeline() # Authenticated User Timeline self.api.get_user_timeline(screen_name='twitter') # Random User Timeline @unittest.skip('skipping non-updated test') def test_get_protected_user_timeline_following(self): """Test returning a protected user timeline who you are following succeeds""" self.api.get_user_timeline(screen_name=protected_twitter_1) @unittest.skip('skipping non-updated test') def test_get_protected_user_timeline_not_following(self): """Test returning a protected user timeline who you are not following fails and raise a TwythonAuthError""" self.assertRaises(TwythonAuthError, self.api.get_user_timeline, screen_name=protected_twitter_2) @unittest.skip('skipping non-updated test') def test_retweeted_of_me(self): """Test that getting recent tweets by authenticated user that have been retweeted by others succeeds""" self.api.retweeted_of_me() @unittest.skip('skipping non-updated test') def test_get_home_timeline(self): """Test returning home timeline for authenticated user succeeds""" self.api.get_home_timeline() # Tweets @unittest.skip('skipping non-updated test') def test_get_retweets(self): """Test getting retweets of a specific tweet succeeds""" self.api.get_retweets(id=test_tweet_id) @unittest.skip('skipping non-updated test') def test_show_status(self): """Test returning a single status details succeeds""" self.api.show_status(id=test_tweet_id) @unittest.skip('skipping non-updated test') def test_update_and_destroy_status(self): """Test updating and deleting a status succeeds""" status = self.api.update_status(status='Test post just to get deleted :( %s' % int(time.time())) self.api.destroy_status(id=status['id_str']) @unittest.skip('skipping non-updated test') def test_get_oembed_tweet(self): """Test getting info to embed tweet on Third Party site succeeds""" self.api.get_oembed_tweet(id='99530515043983360') @unittest.skip('skipping non-updated test') def test_get_retweeters_ids(self): """Test getting ids for people who retweeted a tweet succeeds""" self.api.get_retweeters_ids(id='99530515043983360') # Search @unittest.skip('skipping non-updated test') def test_search(self): """Test searching tweets succeeds""" self.api.search(q='twitter') # Direct Messages @unittest.skip('skipping non-updated test') def test_get_direct_messages(self): """Test getting the authenticated users direct messages succeeds""" self.api.get_direct_messages() @unittest.skip('skipping non-updated test') def test_get_sent_messages(self): """Test getting the authenticated users direct messages they've sent succeeds""" self.api.get_sent_messages() @unittest.skip('skipping non-updated test') def test_send_get_and_destroy_direct_message(self): """Test sending, getting, then destory a direct message succeeds""" message = self.api.send_direct_message(screen_name=protected_twitter_1, text='Hey d00d! %s' % int(time.time())) self.api.get_direct_message(id=message['id_str']) self.api.destroy_direct_message(id=message['id_str']) @unittest.skip('skipping non-updated test') def test_send_direct_message_to_non_follower(self): """Test sending a direct message to someone who doesn't follow you fails""" self.assertRaises(TwythonError, self.api.send_direct_message, screen_name=protected_twitter_2, text='Yo, man! %s' % int(time.time())) # Friends & Followers @unittest.skip('skipping non-updated test') def test_get_user_ids_of_blocked_retweets(self): """Test that collection of user_ids that the authenticated user does not want to receive retweets from succeeds""" self.api.get_user_ids_of_blocked_retweets(stringify_ids=True) @unittest.skip('skipping non-updated test') def test_get_friends_ids(self): """Test returning ids of users the authenticated user and then a random user is following succeeds""" self.api.get_friends_ids() self.api.get_friends_ids(screen_name='twitter') @unittest.skip('skipping non-updated test') def test_get_followers_ids(self): """Test returning ids of users the authenticated user and then a random user are followed by succeeds""" self.api.get_followers_ids() self.api.get_followers_ids(screen_name='twitter') @unittest.skip('skipping non-updated test') def test_lookup_friendships(self): """Test returning relationships of the authenticating user to the comma-separated list of up to 100 screen_names or user_ids provided succeeds""" self.api.lookup_friendships(screen_name='twitter,ryanmcgrath') @unittest.skip('skipping non-updated test') def test_get_incoming_friendship_ids(self): """Test returning incoming friendship ids succeeds""" self.api.get_incoming_friendship_ids() @unittest.skip('skipping non-updated test') def test_get_outgoing_friendship_ids(self): """Test returning outgoing friendship ids succeeds""" self.api.get_outgoing_friendship_ids() @unittest.skip('skipping non-updated test') def test_create_friendship(self): """Test creating a friendship succeeds""" self.api.create_friendship(screen_name='justinbieber') @unittest.skip('skipping non-updated test') def test_destroy_friendship(self): """Test destroying a friendship succeeds""" self.api.destroy_friendship(screen_name='justinbieber') @unittest.skip('skipping non-updated test') def test_update_friendship(self): """Test updating friendships succeeds""" self.api.update_friendship(screen_name=protected_twitter_1, retweets='true') self.api.update_friendship(screen_name=protected_twitter_1, retweets=False) @unittest.skip('skipping non-updated test') def test_show_friendships(self): """Test showing specific friendship succeeds""" self.api.show_friendship(target_screen_name=protected_twitter_1) @unittest.skip('skipping non-updated test') def test_get_friends_list(self): """Test getting list of users authenticated user then random user is following succeeds""" self.api.get_friends_list() self.api.get_friends_list(screen_name='twitter') @unittest.skip('skipping non-updated test') def test_get_followers_list(self): """Test getting list of users authenticated user then random user are followed by succeeds""" self.api.get_followers_list() self.api.get_followers_list(screen_name='twitter') # Users @unittest.skip('skipping non-updated test') def test_get_account_settings(self): """Test getting the authenticated user account settings succeeds""" self.api.get_account_settings() @unittest.skip('skipping non-updated test') def test_verify_credentials(self): """Test representation of the authenticated user call succeeds""" self.api.verify_credentials() @unittest.skip('skipping non-updated test') def test_update_account_settings(self): """Test updating a user account settings succeeds""" self.api.update_account_settings(lang='en') @unittest.skip('skipping non-updated test') def test_update_delivery_service(self): """Test updating delivery settings fails because we don't have a mobile number on the account""" self.assertRaises(TwythonError, self.api.update_delivery_service, device='none') @unittest.skip('skipping non-updated test') def test_update_profile(self): """Test updating profile succeeds""" self.api.update_profile(include_entities='true') @unittest.skip('skipping non-updated test') def test_update_profile_colors(self): """Test updating profile colors succeeds""" self.api.update_profile_colors(profile_background_color='3D3D3D') @unittest.skip('skipping non-updated test') def test_list_blocks(self): """Test listing users who are blocked by the authenticated user succeeds""" self.api.list_blocks() @unittest.skip('skipping non-updated test') def test_list_block_ids(self): """Test listing user ids who are blocked by the authenticated user succeeds""" self.api.list_block_ids() @unittest.skip('skipping non-updated test') def test_create_block(self): """Test blocking a user succeeds""" self.api.create_block(screen_name='justinbieber') @unittest.skip('skipping non-updated test') def test_destroy_block(self): """Test unblocking a user succeeds""" self.api.destroy_block(screen_name='justinbieber') @unittest.skip('skipping non-updated test') def test_lookup_user(self): """Test listing a number of user objects succeeds""" self.api.lookup_user(screen_name='twitter,justinbieber') @unittest.skip('skipping non-updated test') def test_show_user(self): """Test showing one user works""" self.api.show_user(screen_name='twitter') @unittest.skip('skipping non-updated test') def test_search_users(self): """Test that searching for users succeeds""" self.api.search_users(q='Twitter API') @unittest.skip('skipping non-updated test') def test_get_contributees(self): """Test returning list of accounts the specified user can contribute to succeeds""" self.api.get_contributees(screen_name='TechCrunch') @unittest.skip('skipping non-updated test') def test_get_contributors(self): """Test returning list of accounts that contribute to the authenticated user fails because we are not a Contributor account""" self.assertRaises(TwythonError, self.api.get_contributors, screen_name=screen_name) @unittest.skip('skipping non-updated test') def test_remove_profile_banner(self): """Test removing profile banner succeeds""" self.api.remove_profile_banner() @unittest.skip('skipping non-updated test') def test_get_profile_banner_sizes(self): """Test getting list of profile banner sizes fails because we have not uploaded a profile banner""" self.assertRaises(TwythonError, self.api.get_profile_banner_sizes) # Suggested Users @unittest.skip('skipping non-updated test') def test_get_user_suggestions_by_slug(self): """Test getting user suggestions by slug succeeds""" self.api.get_user_suggestions_by_slug(slug='twitter') @unittest.skip('skipping non-updated test') def test_get_user_suggestions(self): """Test getting user suggestions succeeds""" self.api.get_user_suggestions() @unittest.skip('skipping non-updated test') def test_get_user_suggestions_statuses_by_slug(self): """Test getting status of suggested users succeeds""" self.api.get_user_suggestions_statuses_by_slug(slug='funny') # Favorites @unittest.skip('skipping non-updated test') def test_get_favorites(self): """Test getting list of favorites for the authenticated user succeeds""" self.api.get_favorites() @unittest.skip('skipping non-updated test') def test_create_and_destroy_favorite(self): """Test creating and destroying a favorite on a tweet succeeds""" self.api.create_favorite(id=test_tweet_id) self.api.destroy_favorite(id=test_tweet_id) # Lists @unittest.skip('skipping non-updated test') def test_show_lists(self): """Test show lists for specified user""" self.api.show_lists(screen_name='twitter') @unittest.skip('skipping non-updated test') def test_get_list_statuses(self): """Test timeline of tweets authored by members of the specified list succeeds""" self.api.get_list_statuses(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) @unittest.skip('skipping non-updated test') def test_create_update_destroy_list_add_remove_list_members(self): """Test create a list, adding and removing members then deleting the list succeeds""" the_list = self.api.create_list(name='Stuff %s' % int(time.time())) list_id = the_list['id_str'] self.api.update_list(list_id=list_id, name='Stuff Renamed %s' % int(time.time())) screen_names = ['johncena', 'xbox'] # Multi add/delete members self.api.create_list_members(list_id=list_id, screen_name=screen_names) self.api.delete_list_members(list_id=list_id, screen_name=screen_names) # Single add/delete member self.api.add_list_member(list_id=list_id, screen_name='justinbieber') self.api.delete_list_member(list_id=list_id, screen_name='justinbieber') self.api.delete_list(list_id=list_id) @unittest.skip('skipping non-updated test') def test_get_list_memberships(self): """Test list of memberhips the authenticated user succeeds""" self.api.get_list_memberships() @unittest.skip('skipping non-updated test') def test_get_list_subscribers(self): """Test list of subscribers of a specific list succeeds""" self.api.get_list_subscribers(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) @unittest.skip('skipping non-updated test') def test_subscribe_is_subbed_and_unsubscribe_to_list(self): """Test subscribing, is a list sub and unsubbing to list succeeds""" self.api.subscribe_to_list(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) # Returns 404 if user is not a subscriber self.api.is_list_subscriber(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name, screen_name=screen_name) self.api.unsubscribe_from_list(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) @unittest.skip('skipping non-updated test') def test_is_list_member(self): """Test returning if specified user is member of a list succeeds""" # Returns 404 if not list member self.api.is_list_member(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name, screen_name='themattharris') @unittest.skip('skipping non-updated test') def test_get_list_members(self): """Test listing members of the specified list succeeds""" self.api.get_list_members(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) @unittest.skip('skipping non-updated test') def test_get_specific_list(self): """Test getting specific list succeeds""" self.api.get_specific_list(slug=test_list_slug, owner_screen_name=test_list_owner_screen_name) @unittest.skip('skipping non-updated test') def test_get_list_subscriptions(self): """Test collection of the lists the specified user is subscribed to succeeds""" self.api.get_list_subscriptions(screen_name='twitter') @unittest.skip('skipping non-updated test') def test_show_owned_lists(self): """Test collection of lists the specified user owns succeeds""" self.api.show_owned_lists(screen_name='twitter') # Saved Searches @unittest.skip('skipping non-updated test') def test_get_saved_searches(self): """Test getting list of saved searches for authenticated user succeeds""" self.api.get_saved_searches() @unittest.skip('skipping non-updated test') def test_create_get_destroy_saved_search(self): """Test getting list of saved searches for authenticated user succeeds""" saved_search = self.api.create_saved_search(query='#Twitter') saved_search_id = saved_search['id_str'] self.api.show_saved_search(id=saved_search_id) self.api.destroy_saved_search(id=saved_search_id) # Places & Geo @unittest.skip('skipping non-updated test') def test_get_geo_info(self): """Test getting info about a geo location succeeds""" self.api.get_geo_info(place_id='df51dec6f4ee2b2c') @unittest.skip('skipping non-updated test') def test_reverse_geo_code(self): """Test reversing geocode succeeds""" self.api.reverse_geocode(lat='37.76893497', long='-122.42284884') @unittest.skip('skipping non-updated test') def test_search_geo(self): """Test search for places that can be attached to a statuses/update succeeds""" self.api.search_geo(query='Toronto') @unittest.skip('skipping non-updated test') def test_get_similar_places(self): """Test locates places near the given coordinates which are similar in name succeeds""" self.api.get_similar_places(lat='37', long='-122', name='Twitter HQ') # Trends @unittest.skip('skipping non-updated test') def test_get_place_trends(self): """Test getting the top 10 trending topics for a specific WOEID succeeds""" self.api.get_place_trends(id=1) @unittest.skip('skipping non-updated test') def test_get_available_trends(self): """Test returning locations that Twitter has trending topic information for succeeds""" self.api.get_available_trends() @unittest.skip('skipping non-updated test') def test_get_closest_trends(self): """Test getting the locations that Twitter has trending topic information for, closest to a specified location succeeds""" self.api.get_closest_trends(lat='37', long='-122') # Help @unittest.skip('skipping non-updated test') def test_get_twitter_configuration(self): """Test getting Twitter's configuration succeeds""" self.api.get_twitter_configuration() @unittest.skip('skipping non-updated test') def test_get_supported_languages(self): """Test getting languages supported by Twitter succeeds""" self.api.get_supported_languages() @unittest.skip('skipping non-updated test') def test_privacy_policy(self): """Test getting Twitter's Privacy Policy succeeds""" self.api.get_privacy_policy() @unittest.skip('skipping non-updated test') def test_get_tos(self): """Test getting the Twitter Terms of Service succeeds""" self.api.get_tos() @unittest.skip('skipping non-updated test') def test_get_application_rate_limit_status(self): """Test getting application rate limit status succeeds""" self.oauth2_api.get_application_rate_limit_status()