import random import traceback from getopt import GetoptError, getopt from sys import argv, exit from time import sleep import arangodb from arangodb import db, write_report, backup, report_blocked from classes import Profile, User from helpers import sleep_, write_error from scrapers import profile_picture_reactions # import werkzeug # werkzeug.cached_property = werkzeug.utils.cached_property # from arango import ArangoClient if __name__ == "__main__": print() # Argument och alternativ argv = argv[1:] try: opts, args = getopt(argv, "bm:u:o:", ['backup=',"mode=", "users=", "other="]) for o, a in opts: # mode_nr används för hur ofta profile ska roteras if o in ["-m", "--mode"]: mode = a if mode == 'single': mode_nr = 1.7 elif mode == 'few': mode_nr = 1.4 else: mode = 'all' mode_nr = 1 for o, a in opts: if o in ["-u", "--user"]: users = [ User(str(i).strip(), mode) for i in [(str(i).strip()) for i in a.split(",")] ] if o in ["-o", "--other"]: url_other_picture = a if o in ['-b', '--backup']: while True: backup(db) sleep(21600) if "users" not in globals(): users = [ User(str(i).strip(), mode) for i in input("Vem/vilka vill du kolla bilder för? ").split(",") ] except GetoptError: users = [ User(str(i).strip(), mode) for i in input("Vem/vilka vill du kolla bilder för? ").split(",") ] mode = input("Söka efter alla, första/sida eller första? (all, few, single)? ").lower().strip() if mode == '': mode = 'all' if "url_other_picture" in globals(): users[0].url_other_picture = url_other_picture[url_other_picture.find('facebook.com') + 12:] print("Kollar profilbilder för:") for user in users: print("-", user.username) print() # Skapa tre olika profiler att besöka Facebook med profiles = [] for i in range(0, 3): doc = arangodb.get_profile() profile = Profile(doc) profile.browser.open("https://api.ipify.org") print( f"Profil {profile.name} använder IP-adress {profile.viewing().text}." ) if profile.logged_in == False: profile.accept_cookies() sleep_(2) profile.login() profiles.append(profile) print() sleep(3) profile_nr = 1 profile = profiles[profile_nr] print("Börjar med profilen", profile.name) # Gå igenom de användare som efterfrågats try: while True: for user in users: # Set för kollade bilder och kollade medlemmar all_pictures = set([doc["_key"] for doc in db.collection("pictures").all()]) all_pictures_start = all_pictures.copy() members_checked = arangodb.checked_members() if user.username not in members_checked:# Hämta reaktioner för den första användaren LÄGG TILL NOT IN MEMBERS_CHECKED try: profile_picture_reactions(profile, user, all_pictures, first_user=True, mode=mode) except: print(traceback.format_exc()) if len(users) == 1: for profile in profiles: profile.unused() friends = arangodb.friends_of_user(user.username) friends_unchecked = list(set(friends) - set(members_checked)) # Här följer cookien med så att vi fortfarnade är inloggade print("\nKlar med", user.username, "\n") print("Vänner som reagerat:", len(friends)) print("Vänner att kolla:") for friend in friends_unchecked: print(friend) print() # Hämta reaktioner för users vänner (som reagerat) count_friends = 0 for friend in friends_unchecked: count_friends += 1 user = User(str(friend), mode) sleep_(2) try: profile_picture_reactions( profile, user, all_pictures, mode=mode ) except Exception as e: # Fel4 write_error( 4, e=e, user=user.username, traceback=traceback.format_exc(), soup=profile.viewing(), ) print("\nFel: ", str(user.username), "\n") sleep_(15) if profile.blocked == False: print("Klar med", user.username, "\n") # Rotera fb-profiler if count_friends > 5 * mode_nr: if random.randrange(0, 2, 1) == 1: profile_nr += 1 count_friends = 0 print("Växlar till", profiles[profile_nr].name) elif count_friends > 9 * mode_nr: profile_nr += 1 count_friends = 0 print("Växlar till", profiles[profile_nr].name) if profile_nr > len(profiles) - 1: profile_nr = 0 elif profile.blocked == True: # Ta bort profilen ur databasen report_blocked(profile, users) arangodb.remove_profile(profile.doc) # Ta bort från listan på fb-profiler som används profiles.remove(profile) # Försök lägga till en ny fb-profil (om det finns en skapad och ledig i databasen) try: profiles[profile_nr] = Profile(new=True) print("Laddat ny profil:", profiles[profile_nr].name) sleep(3) except e: print("Det behövs nya profiler...") if len(profiles) == 0: break for s in range(0, 1600 / len(profiles)): print(f"Sover {600-s} sekunder till... ", end="\r") profile_nr += 1 print(f"Försöker med {profiles[profile_nr].name}.") profile = profiles[profile_nr] except: pass # Gör profilerna oanvända for profile in profiles: profile.unused() write_report(users, list(all_pictures.difference(all_pictures_start))) exit()