Last active
November 18, 2020 19:42
-
-
Save nwithan8/8bbe9bdfef1060ded051fad3b3680874 to your computer and use it in GitHub Desktop.
See what someone else sees on their Twitter timeline by mirroring their timeline to a Twitter list
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/python3 | |
| import tweepy | |
| import argparse | |
| # Fill out Twitter API credentials below | |
| consumer_key = 'xxxx' | |
| consumer_secret = 'xxxx' | |
| access_token = 'xxxx' | |
| access_secret = 'xxxx' | |
| parser = argparse.ArgumentParser(description="Mirror someone's Twitter timeline onto a Twitter list.") | |
| parser.add_argument('-u', | |
| '--username', | |
| type=str, | |
| required=True, | |
| help='The user whose timeline you want to mirror') | |
| parser.add_argument('-l', | |
| '--list_name', | |
| type=str, | |
| default=None, | |
| help="Name of the new Twitter list") | |
| args = parser.parse_args() | |
| auth = tweepy.OAuthHandler(consumer_key, consumer_secret) | |
| auth.set_access_token(access_token, access_secret) | |
| twitter = tweepy.API(auth) | |
| def y_n_prompt(prompt: str): | |
| response = input(f"{prompt} (Y/N) ") | |
| if response.lower() == 'y': | |
| return True | |
| return False | |
| def _get_existing_list(name: str): | |
| for list in twitter.lists_all(screen_name=twitter.me().screen_name): | |
| if list.name == name: | |
| modify = y_n_prompt(prompt=f"The list '{name}' already exists on your account.\n" | |
| f"Would you like to modify this list?") | |
| if not modify: | |
| print("Exiting...") | |
| exit(0) | |
| return list | |
| return None | |
| def _clear_list_members(list): | |
| for member in twitter.list_members(list_id=list.id): | |
| if not remove_user_from_list(user=member, list=list): | |
| print(f"Could not remove {member.screen_name} from list.") | |
| def create_list(name: str, description: str = None, private: bool = False): | |
| return twitter.create_list(name=name, mode=('private' if private else 'public'), description=description) | |
| def _strip_at(screen_name: str): | |
| if screen_name.startswith("@"): | |
| return screen_name[1:] | |
| return screen_name | |
| def _make_full_url(uri: str): | |
| return f"https://twitter.com{uri}" | |
| def add_user_to_list(user, list): | |
| try: | |
| twitter.add_list_members(user_id=[user.id], list_id=list.id) | |
| return True | |
| except: | |
| return False | |
| def remove_user_from_list(user, list): | |
| try: | |
| twitter.remove_list_members(user_id=[user.id], list_id=list.id) | |
| return True | |
| except: | |
| return False | |
| if __name__ == '__main__': | |
| user_screen_name = args.username | |
| list_name = args.list_name | |
| if not list_name: | |
| list_name = f"What {user_screen_name} Sees" | |
| try: | |
| target_user = twitter.get_user(screen_name=user_screen_name) | |
| except: | |
| raise Exception(f"Could not find {user_screen_name}") | |
| twitter_list = _get_existing_list(name=list_name) | |
| if twitter_list: | |
| print(f"Resetting members of '{list_name}'...") | |
| _clear_list_members(list=twitter_list) | |
| elif not twitter_list: | |
| print(f"Creating '{list_name}' list...") | |
| twitter_list = create_list(name=list_name) | |
| for user in tweepy.Cursor(twitter.friends, screen_name=_strip_at(screen_name=user_screen_name)).items(): | |
| if add_user_to_list(user=user, list=twitter_list): | |
| print(f"Added {user.screen_name}.") | |
| else: | |
| print(f"Could not add {user.screen_name}") | |
| if add_user_to_list(user=target_user, list=twitter_list): | |
| print(f"Added {target_user.screen_name}.") | |
| else: | |
| print(f"Could not add {target_user.screen_name}") | |
| print(f"View at {_make_full_url(twitter_list.uri)}") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment