You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

131 lines
4.6 KiB

class Profile:
def __init__(self, profile, container, proxieservers):
"""Creates a new profile to do searches with.
Args:
profile (dict): Document fetched from database.
container (str): Docker container that runs the script.
"""
self.doc = profile
# Användaruppgifter
self.name = self.doc["name"].strip()
self.email = self.doc["email"]
self.pwd = self.doc["pwd"]
self.server = self.doc["server"]
self.cookie = self.doc["cookie"]
self.useragent = self.doc["useragent"]
self.proxieservers = proxieservers
self.blocked = False
self.container = str(container)
self.users_checked = 0
# Ange proxies
session = requests.Session()
session.proxies = self.doc['proxies']
# Starta browser
user_agent = self.useragent
self.browser = RoboBrowser(
session=session, user_agent=user_agent, history=False, parser="lxml"
)
try:
self.browser.session.cookies = pickle.load(
open("data/cookie_{}.pkl".format(self.name), "rb")
)
self.logged_in = True
except:
try:
self.browser.session.cookies.update(self.cookie)
self.logged_in = True
except:
self.logged_in = False
def update_time(self):
""" Uppdatera dokumentet i arango. """
self.doc["in_use"] = nowstamp()
db.update_document(self.doc, check_rev=False)
def viewing(self):
""" Returnerar browser i html-format """
return self.browser.parsed
def open(self, url):
n = 0
while True:
n += 1
sleep(1)
try:
self.browser.open(url)
if '/a/nux/wizard/nav.php?step=phone&skip' in self.viewing():
self.browser.open(url_bas + '/a/nux/wizard/nav.php?step=phone&skip')
break
except Exception as e:
print(e)
print(n)
_print(self, None, f'Kunde inte öppna url {url}')
if n == 5:
if 'Connection refused' in e:
self.doc['e'] = e
db.insert_document('blocked_profiles', self.doc)
n = 0
from arangodb import get_profile, remove_profile
# Ta bort den gamla profilen från databasen och ersätt profile med nytt innehåll från ny profil
remove_profile(self)
self.__init__(get_profile(self.proxieservers), self.container)
_print(self, None, f'Ny profil hämtad {self.email}')
self.update_time()
else:
sleep(40)
def accept_cookies(self):
""" Accepterar cookies """
self.browser.open("https://mbasic.facebook.com")
soup = BeautifulSoup(str(self.browser.parsed), "lxml")
if "accept all" not in soup.text.lower():
sleep_(2)
cookie_accept_url = "https://mbasic.facebook.com/cookie/consent-page"
self.browser.open(cookie_accept_url)
sleep_(2)
try:
form = self.browser.get_form()
self.browser.submit_form(form)
_print(self, None, f"Accepterade cookies för {self.name}")
sleep_(2)
update_cookie(self.browser.session.cookies, self)
except:
try:
write_error(12, self, soup=self.browser.parsed)
except:
pass
_print(self, None, f"Accepterade inte cookies för {self.name}")
def login(self):
""" Loggar in på Facebook. """
print("Loggar in {}".format(self.name))
# Gå till log in-sidan
self.browser.open("https://mbasic.facebook.com/login")
# Kolla om browser redan är inloggad
soup = BeautifulSoup(str(self.browser.parsed), "lxml")
if "log out" in soup.text.lower():
print("Redan inloggad.")
try:
# Hitta och fyll i formulär
form = self.browser.get_form(id="login_form")
form["email"].value = self.email
form["pass"].value = self.pwd
self.browser.submit_form(form, submit=form["login"])
# Vänta lite och uppdatera cookie
print("Loggade in.")
sleep_(2)
self.open(url_bas)
sleep_(2)
except TypeError:
try:
write_error(11, self, soup=soup, profile=self.name)
except:
pass