def update_all(): user_list = SQ.get_user_list('Active') try: start_idx = user_list.index( OPTIONS.start_at_user[0].lower()) if OPTIONS.start_at_user else 0 except ValueError: user = SQ.get_user(OPTIONS.start_at_user[0]) if user: MsgPrinter.print_error("User [ {} ] is marked as '{}'!".format( user[0], user[1])) print( "\t\t\tTry using the '--check_again' option to check if its accessible again." ) print( "\t\t\tYou can also use '--update_status' to manually change its status." ) else: MsgPrinter.print_error( "User [ {} ] is not in the database!".format( OPTIONS.start_at_user[0])) return if OPTIONS.skip: for user in OPTIONS.skip: if user.lower() in user_list: user_list.remove(user) for user in user_list[start_idx::]: MsgPrinter.print_info("Updating User: {}".format(user)) user_timeline(user)
def fuse_users(user_one, user_two): if SQ.get_user(user_one) is None or SQ.get_user(user_two) is None: raise Queries.Exceptions.UnknownUser( "Both or one of the users provided are not present in the database!" .format(user)) user_one_folder = os.path.join(os.getcwd(), user_one) user_two_folder = os.path.join(os.getcwd(), user_two) for _, _, files in os.walk(user_one_folder): for file in files: if user_one.lower() in file.lower(): old_file = os.path.join(user_one_folder, file) try: new_file = os.path.join( user_two_folder, file.lower().replace(user_one.lower(), user_two)) os.rename(old_file, new_file) except FileExistsError: new_file = "[Duplicate] " + file.lower().replace( user_one.lower(), user_two) os.rename(old_file, new_file) Queries.Exceptions.print_info( "Changed name of file {} to {}".format(old_file, new_file)) shutil.rmtree(user_one_folder) Queries.Exceptions.print_info( "Deleted folder [ {} ]".format(user_one_folder)) db = DB.database() db.query("DELETE FROM TWITTER_USERS WHERE lower(TWEET_AUTHOR) = ?", values=(user_one.lower(), ), commit=True) db.close()
def user(user, last_id=None, last_lookup=None): if SQ.get_user(user): Queries.Exceptions.print_error("### ERROR ### -- User [ {} ] already exists!".format(user)) return values = [user.lower()] values.append('Active' if last_lookup and last_id else 'Not Accessible') values.append(last_id if last_id else 0) values.append(last_lookup if last_lookup else time.strftime('%Y-%m-%d %X', time.localtime())) db = DB.database() db.query(statement="INSERT INTO TWITTER_USERS VALUES(?,?,?,?)", values=tuple(values), commit=True) db.close() Queries.Exceptions.print_info('Added user [ {} ] to the database'.format(user))
def update_user(user, status=None): db_user = SQ.get_user(user) if db_user is None: raise Queries.Exceptions.UnknownUser( "We couldn't find any user with the name [ {} ] in the database!". format(user)) db = DB.database() if status: if status.lower().startswith('a'): status = 'Active' elif status.lower().startswith('n'): status = 'Not Accessible' elif status.lower().startswith('p'): status = 'Protected' elif status.lower().startswith('s'): status = 'Suspended' elif status.lower().startswith('d'): status = 'Deleted' else: raise Queries.Exceptions.UnknownStatus( "Status not recognized: {}".format(status)) if db_user[1] != status: db.query( statement= "UPDATE TWITTER_USERS SET STATUS = ? WHERE lower(TWEET_AUTHOR) = ?", values=(status, user.lower()), commit=True) Queries.Exceptions.print_info( "=====> Changed status of [ {} ] to '{}'\n".format( user, status)) try: tweet_id, tweet_date = SQ.get_last_tweet_from_user(user) db.query( statement= "UPDATE TWITTER_USERS SET TWEET_ID = ?, LAST_LOOKUP = ? WHERE lower(TWEET_AUTHOR) = ?", values=(tweet_id, tweet_date, user.lower()), commit=True) except TypeError as err: logging.warning( "Could not find any tweets whose author is the user [ {} ] in the DOWNLOADED_TWEETS table" ) db.close()
def delete_user(user): if SQ.get_user(user) is None: raise Queries.Exceptions.UnknownUser( "We couldn't find any user with the name [ {} ] in the database!". format(user)) values = [user.lower()] values.append(time.strftime('%Y-%m-%d %X', time.localtime())) db = DB.database() db.query("DELETE FROM TWITTER_USERS WHERE lower(TWEET_AUTHOR) = ?", values=(user.lower(), ), commit=True) db.query("INSERT INTO DELETED_USERS_HISTORY VALUES(?,?)", values=tuple(values), commit=True) db.close() shutil.rmtree(os.path.join(os.getcwd(), user), ignore_errors=True) Queries.Exceptions.print_info( "Database updated! User [ {} ] has been deleted!".format(user)) Queries.Exceptions.print_info("Folder deleted!")
def user_timeline(username): save_folder = username os.makedirs(username, exist_ok=True) try: tweets = API.user_timeline( screen_name=username, count=200, exclude_replies=OPTIONS.no_replies, include_rts=OPTIONS.no_retweets, tweet_mode='extended', max_id=OPTIONS.start_at_id[0] if OPTIONS.start_at_id else None) while len(tweets) > 0: for tweet in tweets: process_tweet(tweet, save_folder) tweets = API.user_timeline(screen_name=username, count=200, exclude_replies=OPTIONS.no_replies, include_rts=OPTIONS.no_retweets, tweet_mode='extended', max_id=(tweets[-1].id - 1)) if SQ.get_user(username) is None: IQ.user(username) #UQ.update_user(username, status='Active') except tweepy.error.TweepError as err: if err.response.status_code == 429: error_message = 'The request limit for this resource has been reached.' IQ.error(username, 'RateLimit', 429) else: error_code, error_message = err.response.json( )['errors'][0].values() if error_code == 63: # User Suspended UQ.update_user(username, status='Suspended') IQ.error(username, 'Suspended', error_code) elif error_code == 144: # Tweet Deleted UQ.update_user(username, status='Deleted') IQ.error(username, 'Deleted', error_code) elif error_code == 179: # User Private UQ.update_user(username, status='Protected') IQ.error(username, 'Protected', error_code) MsgPrinter.print_error(error_message) except (MsgPrinter.MaxDupesFound, MsgPrinter.MaxTweetsFetched) as err: global DUPES_COUNT, FETCHED_TWEETS_COUNT DUPES_COUNT = 0 FETCHED_TWEETS_COUNT = 0 MsgPrinter.print_warning(err) except Exception as err: MsgPrinter.print_error(err)
def rename_user(old_user_name, new_user_name, command): db = DB.database() if SQ.get_user(old_user_name) is None: raise Queries.Exceptions.UnknownUser( "We couldn't find any user with the name [ {} ] in the database!". format(old_user_name)) if new_user_name != sanitize_filename(new_user_name): raise Queries.Exceptions.InvalidName( "User [ {} ] already exists in the database!".format( new_user_name)) if SQ.get_user(new_user_name): raise Queries.Exceptions.UserExists( "User [ {} ] already exists in the database!".format( new_user_name)) if os.path.isdir(os.path.join(os.getcwd(), new_user_name)): raise Queries.Exceptions.FolderExists( "A folder named [ {} ] already exists!".format(new_user_name)) db.query( "UPDATE TWITTER_USERS SET TWEET_AUTHOR = ? WHERE lower(TWEET_AUTHOR) = ?", values=(new_user_name, old_user_name.lower())) folder_to_rename = os.path.join(os.getcwd(), old_user_name) for _, _, files in os.walk(folder_to_rename): for file in files: try: if old_user_name.lower() in file.lower(): old_file = os.path.join(folder_to_rename, file) renamed_file = file.lower().replace( old_user_name.lower(), new_user_name) new_file = os.path.join(folder_to_rename, renamed_file) os.rename(old_file, new_file) except FileExistsError: renamed_file = "[Duplicate] " + file.lower().replace( old_user_name.lower(), new_user_name) new_file = os.path.join(folder_to_rename, renamed_file) os.rename(old_file, new_file) break os.rename(folder_to_rename, os.path.join(os.getcwd(), new_user_name)) Queries.Exceptions.print_info( "====> User [ {} ] changed its name to [ {} ]".format( old_user_name, new_user_name)) values = [old_user_name.lower()] values.append(new_user_name.lower()) values.append(time.strftime('%Y-%m-%d %X', time.localtime())) values.append(command) db.query(statement="INSERT INTO RENAMED_USERS_HISTORY VALUES(?,?,?,?)", values=tuple(values), commit=True) db.close()