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.
 
 

268 lines
8.1 KiB

import pickle
import random
from datetime import datetime
import requests
import werkzeug
from bs4 import BeautifulSoup
werkzeug.cached_property = werkzeug.utils.cached_property
from robobrowser import RoboBrowser
from arangodb import db
from config import *
from helpers import sleep_, update_cookie, write_error, nowstamp
class User:
def __init__(self, username, mode, other_pictures=[]):
self.collection = "members"
self.username = str(username)
self.mode = mode
self.fetched = datetime.now().strftime("%Y%m%d")
self.url_coverphotos = ""
self.id = ""
self.url_likes = ""
self.url_about = ""
self.url_timeline = ""
self.url_profilepictures = ""
self.profile_pictures = 0
self.pictures = []
self.url_friends = ""
self.url = ""
self.name = ""
self.url_other_pictures = other_pictures
self.reactions = 0
self.profile_pictures = 0
self.checked_pictures = []
def add_to_db(self):
# Lägg till profilen till arrango
db.insert_document(
self.collection,
{
"_key": self.username,
"url": self.url,
"name": self.name,
"profile_pictures": self.profile_pictures,
"facebook_id": self.id,
"timeline": self.url_timeline,
"likes": self.url_likes,
"about": self.url_about,
"cover photos": self.url_coverphotos,
"fetched": self.fetched,
"reactions": self.reactions,
"mode": self.mode,
"pictures": self.pictures,
},
overwrite_mode="update",
silent=True,
keep_none=False,
)
def checked(self):
db.update_document(
{
"_id": "members/" + str(self.username),
"checked": True,
"pictures_checked": len(self.checked_pictures),
"checked_pictures": self.checked_pictures,
"reactions": self.reactions,
}
)
class Picture:
def __init__(self, user):
self.collection = "pictures"
self.user = user
self.id = ""
self.url_full = ""
self.date = ""
self.url = ""
self.no_reactions = ""
self.reactions = []
def add_to_db(self):
db.insert_document(
self.collection,
{
"_key": self.id,
"url": self.url_full,
"date": self.date,
"url": self.url,
"no_reactions": self.no_reactions,
"user": self.user,
},
overwrite_mode="update",
silent=True,
keep_none=False,
)
class Profile:
def __init__(self, profile, container):
"""Creates a new profile to do searches with.
Args:
profile (dict): Document fetched from database.
"""
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.blocked = False
self.container = container
self.users_checked = 0
# Ange proxies
session = requests.Session()
session.proxies = {
"https": "socks5://'8155249667566524'@{}".format(self.server),
"http": "socks5://'8155249667566524'@{}".format(self.server),
}
# Starta browser
# user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"
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 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(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(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)
except TypeError:
try:
write_error(11, self, soup=soup, profile=self.name)
except:
pass
def unused(self):
""" Sätter user till False för valda profiler """
self.doc["in_use"] = False
db.update_document(self.doc, silent=True, check_rev=False)
class Proxies:
def __init__(self):
self.proxies = [
"gb25-wg.socks5.mullvad.net:1080",
"gb26-wg.socks5.mullvad.net:1080",
"gb27-wg.socks5.mullvad.net:1080",
"gb28-wg.socks5.mullvad.net:1080",
"gb29-wg.socks5.mullvad.net:1080",
]
def get_proxie(self):
return self.proxies.pop(random.randrange(0, len(self.proxies), 1))
class Friend:
def __init__(self, user):
self.collection = "members"
self.user = user # The friends friend
self.username = ""
self.url = ""
self.name = ""
self.single = ""
def add_to_db(self):
db.insert_document(
self.collection,
{
"_key": str(self.username),
"url": url_bas + self.url,
"name": self.name,
},
overwrite_mode="update",
silent=True,
)
class Reaction:
def __init__(self, user, friend_username, picture_id):
self.collection = "picture_reactions"
self.user = user
self.picture_id = picture_id
self.user_name_friend = friend_username
self.type = False
def get_dict(self):
key = str(self.picture_id) + "_" + str(self.user_name_friend)
return {
"_to": "members/" + str(self.user),
"_from": "members/" + str(self.user_name_friend),
"_key": key,
"_id": "picture_reactions/" + key,
"picture": self.picture_id,
"reaction": self.type,
}