@ -7,19 +7,52 @@ from subprocess import check_output
from re import split
from re import split
from socket import gethostname
from socket import gethostname
from arangodb import db , write_report , backup , report_blocked , get_profile , remove_profile , checked_members , friends_of_user
from arangodb import *
from classes import Profile , User
from classes import Profile , User
from helpers import sleep_ , write_error , _print
from helpers import sleep_ , write_error , _print
from scrapers import profile_picture_reactions
from scrapers import profile_picture_reactions
def finish ( ) :
def finish ( profile , profiles , users ) :
""" Avslutar: skriver rapport och gör profilerna oanvända """
""" Avslutar: skriver rapport och gör profilerna oanvända """
for profile in profiles :
for profile in profiles :
profile . unused ( )
profile . unused ( )
write_report ( users , list ( all_pictures . difference ( all_pictures_start ) ) )
try :
e = traceback . format_exc ( )
except :
e = ' Unknown traceback. '
_print ( profile , None , e . split ( ' \n ' ) )
write_report ( users )
exit ( )
exit ( )
def blocked_profile ( profile , profiles ) :
""" Tar bort profilen från listan med profiles, tar bort ur databasen och returnerar uppdaterad lista. """
report_blocked ( profile , users )
remove_profile ( profile )
# 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 :
doc = get_profile ( )
profiles . append ( Profile ( doc , lookingup ) )
_print ( profile , None , f " Laddat ny profil: { profiles [ - 1 ] . name } " )
sleep ( 3 )
except :
_print ( profile , None , " Det behövs nya profiler... " )
if len ( profiles ) == 0 :
finish ( profile , profiles , users )
for s in range ( 0 , int ( 1600 / len ( profiles ) ) ) :
print ( user , f " Sover { 600 - s } sekunder till... " , end = " \r " )
_print ( profile , None , ' Långsover... ' )
for s in range ( 3600 , 0 , - 1 ) :
print ( f ' Sover { s } sekunder till... ' , end = ' \r ' )
sleep ( 1 )
return profiles
if __name__ == " __main__ " :
if __name__ == " __main__ " :
print ( )
print ( )
@ -27,12 +60,12 @@ if __name__ == "__main__":
if gethostname ( ) not in [ ' macbook.local ' ] : # Lägg till för studiodatorn
if gethostname ( ) not in [ ' macbook.local ' ] : # Lägg till för studiodatorn
# Hämta namn för containern där skriptet körs
# Hämta namn för containern där skriptet körs
try :
try :
container s = check_output ( [ ' docker ' , ' container ' , ' ls ' ] ) . decode ( )
lookingup s = check_output ( [ ' docker ' , ' lookingup ' , ' ls ' ] ) . decode ( )
container = split ( ' \ W \ W+ ' , container s. split ( ' \n ' ) [ 1 ] ) [ - 1 ]
lookingup = split ( ' \ W \ W+ ' , lookingup s. split ( ' \n ' ) [ 1 ] ) [ - 1 ]
except FileNotFoundError :
except FileNotFoundError :
pass
pass
else :
else :
container _name = ' macbook '
lookingup _name = ' macbook '
# Argument och alternativ
# Argument och alternativ
argv = argv [ 1 : ]
argv = argv [ 1 : ]
@ -41,7 +74,7 @@ if __name__ == "__main__":
for o , a in opts :
for o , a in opts :
# mode_nr används för hur ofta profile ska roteras
# mode_nr används för hur ofta profile ska roteras
if o in [ " -m " , " --mode " ] :
if o in [ " -m " , " --mode " ] :
mode = a
mode = a . strip ( )
if mode == ' single ' :
if mode == ' single ' :
mode_nr = 1.7
mode_nr = 1.7
elif mode == ' few ' :
elif mode == ' few ' :
@ -62,7 +95,7 @@ if __name__ == "__main__":
except StopIteration :
except StopIteration :
raise Exception
raise Exception
if o in [ " -o " , " --other " ] :
if o in [ " -o " , " --other " ] :
url_other_picture = a
url_other_pictures = a . split ( ' , ' )
if o in [ ' -b ' , ' --backup ' ] :
if o in [ ' -b ' , ' --backup ' ] :
while True :
while True :
backup ( db )
backup ( db )
@ -85,26 +118,29 @@ if __name__ == "__main__":
if mode == ' ' :
if mode == ' ' :
mode = ' all '
mode = ' all '
if " url_other_picture " in globals ( ) :
if " url_other_pictures " in globals ( ) :
users [ 0 ] . url_other_picture = url_other_picture [ url_other_picture . find ( ' facebook.com ' ) + 12 : ]
l = [ ]
for url in url_other_pictures :
l . append ( url [ url . find ( ' facebook.com ' ) + 12 : ] )
users [ 0 ] . url_other_pictures = l
print ( " Kollar profilbilder för: " )
print ( " Kollar profilbilder för: " )
for user in users :
for user in users :
print ( " - " , user . username )
print ( " - " , user . username )
print ( )
print ( )
if ' container ' not in globals ( ) :
if ' lookingup ' not in globals ( ) :
usernames = [ user . username for user in users ]
usernames = [ user . username for user in users ]
if len ( usernames ) == 1 :
if len ( usernames ) == 1 :
container = usernames [ 0 ]
lookingup = usernames [ 0 ]
else :
else :
container = ' - ' . join ( usernames )
lookingup = ' - ' . join ( usernames )
# Skapa tre olika profiler att besöka Facebook med
# Skapa tre olika profiler att besöka Facebook med
profiles = [ ]
profiles = [ ]
for i in range ( 0 , 3 ) :
for i in range ( 0 , 3 ) :
doc = get_profile ( )
doc = get_profile ( )
profile = Profile ( doc , container )
profile = Profile ( doc , lookingup )
profile . browser . open ( " https://api.ipify.org " )
profile . browser . open ( " https://api.ipify.org " )
print ( f " Profil { profile . name } använder IP-adress { profile . viewing ( ) . text } . "
print ( f " Profil { profile . name } använder IP-adress { profile . viewing ( ) . text } . "
)
)
@ -116,106 +152,123 @@ if __name__ == "__main__":
print ( )
print ( )
sleep ( 3 )
sleep ( 3 )
profile_nr = 1
profile_nr = 0
profile = profiles [ profile_nr ]
profile = profiles [ profile_nr ]
_print ( profile . container , user . username , f " Börjar med profilen { profile . name } " )
_print ( profile , user , f " Börjar med profilen { profile . name } " )
# Gå igenom de användare som efterfrågats
# Gå igenom de användare som efterfrågats
try :
#try:
while True :
while True :
for user in users :
for user in users :
# Set för kollade bilder och kollade medlemmar
profile . users_checked + = 1
all_pictures = set ( [ doc [ " _key " ] for doc in db . collection ( " pictures " ) . all ( ) ] )
# Set för kollade bilder och kollade medlemmar
all_pictures_start = all_pictures . copy ( )
all_pictures = set ( [ doc [ " _key " ] for doc in db . collection ( " pictures " ) . all ( ) ] )
members_checked = checked_members ( )
all_pictures_start = all_pictures . copy ( )
profile . container = user . username
members_checked = checked_members ( )
for p in profiles :
# Hämta reaktioner för den första användaren
p . lookingup = user . username
if any ( [ user . username not in members_checked , mode == ' force ' ] ) :
# Hämta reaktioner för den första användaren
try :
if any ( [ user . username not in members_checked , mode == ' force ' ] ) :
profile_picture_reactions ( profile , user , all_pictures , first_user = True , mode = mode )
try :
except :
t = 0
_print ( profile . container , user . username , traceback . format_exc ( ) )
while t < 5 :
if len ( users ) == 1 :
t + = 1
for profile in profiles :
profile = profile_picture_reactions ( profile , user , all_pictures , first_user = True , mode = mode )
profile . unused ( )
if profile . blocked == True :
friends = friends_of_user ( user . username )
profiles = blocked_profile ( profile , profiles )
friends_unchecked = list ( set ( friends ) - set ( members_checked ) )
else :
break
_print ( profile . container , user . username , f " \n Klar med, { user . username } \n " )
except :
_print ( profile . container , user . username , f " Vänner som reagerat: { len ( friends ) } " )
_print ( profile , user , traceback . format_exc ( ) )
_print ( profile . container , user . username , " \n Vänner att kolla: " )
if len ( users ) == 1 :
for p in profiles :
for friend in friends_unchecked :
p . unused ( )
print ( friend )
friends = friends_of_user ( user . username )
_print ( profile . container , user . username , ' , ' . join ( [ friend for friend in friends_unchecked ] ) , silent = True )
friends_unchecked = list ( set ( friends ) - set ( members_checked ) )
print ( )
_print ( profile , user , f " \n Klar med, { user . username } \n " )
_print ( profile , user , f " Vänner som reagerat: { len ( friends ) } " )
# Hämta reaktioner för users vänner (som reagerat)
_print ( profile , user , " \n Vänner att kolla: " )
count_friends = 0
for friend in friends_unchecked :
for friend in friends_unchecked :
count_friends + = 1
print ( friend )
user = User ( str ( friend ) , mode )
_print ( profile , user , [ friend for friend in friends_unchecked ] , silent = True )
sleep_ ( 2 )
print ( )
try :
# Hämta reaktioner för users vänner (som reagerat)
profile_picture_reactions (
count_friends = 0
profile , user , all_pictures , mode = mode
for friend in friends_unchecked :
)
profile . users_checked + = 1
except Exception as e : # Fel4
if profile . users_checked > 30 :
write_error (
_print ( profile , None , ' Långsover... ' )
4 ,
for s in range ( 2600 , 0 , - 1 ) :
e = e ,
print ( f ' Sover { s } sekunder till... ' , end = ' \r ' )
user = user . username ,
sleep ( 1 )
profile = profile . container ,
for p in profiles :
traceback = traceback . format_exc ( ) ,
_print ( p , None , f ' Långsovit. { p . name } hade kollat { p . users_checked } användare. ' )
soup = profile . viewing ( ) ,
p . users_checked = 0
)
count_friends + = 1
_print ( profile . container , user . username , f " \n Fel: { str ( user . username ) } \n " )
user = User ( str ( friend ) , mode , other_pictures = [ ] )
sleep_ ( 15 )
sleep_ ( 2 )
if profile . blocked == False :
try :
_print ( profile . container , user . username , f " Klar med { user . username } \n " )
p = profile_picture_reactions (
profile , user , all_pictures , mode = mode
# Rotera fb-profiler
)
if count_friends > 5 * mode_nr :
if isinstance ( p , Profile ) :
if random . randrange ( 0 , 2 , 1 ) == 1 :
profile = p
profile_nr + = 1
count_friends = 0
except Exception as e : # Fel4
_print ( profile . container , user . username , f " Växlar till { profiles [ profile_nr ] . name } " )
write_error (
elif count_friends > 9 * mode_nr :
4 ,
e = e ,
user = user ,
profile = profile ,
traceback = traceback . format_exc ( ) ,
soup = profile . viewing ( ) ,
)
_print ( profile , user , f " \n Fel: { str ( user . username ) } \n " )
sleep_ ( 15 )
if profile . blocked == False :
_print ( profile , user , f " Klar med { user . username } \n " )
# Rotera fb-profiler
if count_friends > 5 * mode_nr :
if random . randrange ( 0 , 2 , 1 ) == 1 :
profile_nr + = 1
profile_nr + = 1
if profile_nr > = len ( profiles ) :
profile_nr = 0
count_friends = 0
count_friends = 0
_print ( profile . container , user . username , f " Växlar till { profiles [ profile_nr ] . name } " )
_print ( profile , user , f " Växlar till { profiles [ profile_nr ] . name } " )
elif count_friends > 9 * mode_nr :
if profile_nr > len ( profiles ) - 1 :
profile_nr = 0
elif profile . blocked == True :
# Ta bort profilen ur databasen
report_blocked ( profile , users )
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 :
doc = get_profile ( )
profiles [ profile_nr ] = Profile ( doc , container )
_print ( profile . container , user . username , f " Laddat ny profil: { profiles [ profile_nr ] . name } " )
sleep ( 3 )
except e :
_print ( profile . container , user . username , " Det behövs nya profiler... " )
if len ( profiles ) == 0 :
break
for s in range ( 0 , 1600 / len ( profiles ) ) :
print ( user , f " Sover { 600 - s } sekunder till... " , end = " \r " )
profile_nr + = 1
profile_nr + = 1
_print ( profile . container , user . username , f " Försöker med { profiles [ profile_nr ] . name } . " )
if profile_nr > = len ( profiles ) :
profile_nr = 0
count_friends = 0
_print ( profile , user , f " Växlar till { profiles [ profile_nr ] . name } " )
profile = profiles [ profile_nr ]
elif profile . blocked == True :
_print ( profile , user , f " Tar bort { profile . name } \n " . upper ( ) , sleeptime = 1 )
profiles = blocked_profile ( profile , profiles )
profile_nr = len ( profiles ) - 1
profile = profiles [ profile_nr ]
profile = profiles [ profile_nr ]
_print ( profile , None , [ p . name for p in profiles ] )
except :
# Hämta ny användare från databasen (lookups) när alla är genomgångna
finish ( )
doc_new_user = get_user ( )
if doc_new_user == None :
_print ( profile , user , ' No more to look up. ' )
finish ( profile , profiles , users )
else :
new_user = User ( doc_new_user [ ' _key ' ] , mode , doc_new_user [ ' other ' ] )
for p in profiles :
p . lookingup = new_user . username
users . append ( new_user )
# except:
# finish(profile, profiles, users)