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.
262 lines
8.0 KiB
262 lines
8.0 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, lookingup): |
|
"""Creates a new profile to do searches with. |
|
|
|
Args: |
|
profile (dict): Document fetched from database. |
|
lookingup (string): Container name. |
|
""" |
|
|
|
# Uppdatera dokumentet i arango |
|
self.doc = profile |
|
self.doc["in_use"] = nowstamp() |
|
db.update_document(self.doc, check_rev=False) |
|
|
|
# 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.lookingup = lookingup |
|
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) |
|
print(self.browser.session.cookies.values) |
|
self.logged_in = True |
|
except: |
|
self.logged_in = 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.name) |
|
except: |
|
write_error(12, soup=self.browser.parsed, profile=self.name) |
|
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: |
|
write_error(11, soup=soup, profile=self.name) |
|
|
|
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": 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, |
|
} |
|
|
|
|