Add admina base
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
59
src/main.py
Normal file
59
src/main.py
Normal file
@@ -0,0 +1,59 @@
|
||||
import fbchat
|
||||
from message import handle_message
|
||||
from util.logger import logger
|
||||
|
||||
import atexit
|
||||
from blinker import Signal
|
||||
from threading import Thread
|
||||
from os import environ
|
||||
|
||||
|
||||
def on_event(sender, session, event):
|
||||
match sender:
|
||||
case fbchat.MessageEvent:
|
||||
Thread(target=handle_message, args=(
|
||||
sender, session, event)).start()
|
||||
case _:
|
||||
logger.debug("Ignoring event: %s", event)
|
||||
|
||||
|
||||
def main():
|
||||
email = environ.get("FB_EMAIL")
|
||||
password = environ.get("FB_PASSWORD")
|
||||
cookie_path = environ.get("FB_COOKIE_PATH") or "session.json"
|
||||
|
||||
if not email or not password:
|
||||
raise ValueError("FB_EMAIL and FB_PASSWORD must be set")
|
||||
|
||||
try:
|
||||
logger.info("Loading cookies from %s", cookie_path)
|
||||
session = fbchat.Session.from_file(cookie_path)
|
||||
except (FileNotFoundError, fbchat.FacebookError):
|
||||
logger.warning("Failed to load cookies from %s", cookie_path)
|
||||
logger.info("Logging in with email and password")
|
||||
session = fbchat.Session.login(
|
||||
email, password, on_2fa_callback=lambda: input("Input 2FA code: ")
|
||||
)
|
||||
session.to_file(cookie_path)
|
||||
logger.info("Saved cookies to %s", cookie_path)
|
||||
|
||||
finally:
|
||||
if session.is_logged_in():
|
||||
logger.info("Logged in as %s", session.user.id)
|
||||
else:
|
||||
raise ValueError("Failed to log in")
|
||||
|
||||
atexit.register(lambda: session.to_file(cookie_path))
|
||||
|
||||
listener = fbchat.Listener(
|
||||
session=session, chat_on=False, foreground=False)
|
||||
|
||||
events = Signal()
|
||||
events.connect(on_event)
|
||||
|
||||
for event in listener.listen():
|
||||
events.send(type(event), session=session, event=event)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
8
src/message.py
Normal file
8
src/message.py
Normal file
@@ -0,0 +1,8 @@
|
||||
import fbchat
|
||||
from util.logger import logger
|
||||
from util.database import database
|
||||
from util.session import session
|
||||
|
||||
|
||||
def handle_message(_, event: fbchat.MessageEvent):
|
||||
logger.info("Received message from %s: %s", event.author.id, event.text)
|
15
src/util/database.py
Normal file
15
src/util/database.py
Normal file
@@ -0,0 +1,15 @@
|
||||
import pymongo
|
||||
from os import environ
|
||||
|
||||
MONGO_HOST = environ.get("MONGO_HOST")
|
||||
MONGO_PORT = environ.get("MONGO_PORT")
|
||||
MONGO_USERNAME = environ.get("MONGO_USERNAME")
|
||||
MONGO_PASSWORD = environ.get("MONGO_PASSWORD")
|
||||
MONGO_DATABASE = environ.get("MONGO_DATABASE")
|
||||
|
||||
if not MONGO_HOST or not MONGO_PORT or not MONGO_USERNAME or not MONGO_PASSWORD or not MONGO_DATABASE:
|
||||
raise ValueError(
|
||||
"MONGO_HOST, MONGO_PORT, MONGO_USERNAME, MONGO_PASSWORD and MONGO_DATABASE must be set")
|
||||
|
||||
database = pymongo.MongoClient(MONGO_HOST, int(
|
||||
MONGO_PORT), username=MONGO_USERNAME, password=MONGO_PASSWORD, authSource=MONGO_DATABASE)[MONGO_DATABASE].client
|
29
src/util/logger.py
Normal file
29
src/util/logger.py
Normal file
@@ -0,0 +1,29 @@
|
||||
import sys
|
||||
import logging.config
|
||||
import logging.handlers
|
||||
|
||||
|
||||
def handle_exception(exception_type, exception, traceback):
|
||||
logger.error(
|
||||
"Uncaught exception",
|
||||
exc_info=(exception_type, exception, traceback),
|
||||
)
|
||||
|
||||
|
||||
sys.excepthook = handle_exception
|
||||
|
||||
logger = logging.getLogger()
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
formatter = logging.Formatter(
|
||||
'%(asctime)s:%(levelname)s:%(name)s:%(module)s:%(funcName)s:%(lineno)s:%(message)s')
|
||||
|
||||
stream_handler = logging.StreamHandler(sys.stdout)
|
||||
stream_handler.setLevel(logging.INFO)
|
||||
stream_handler.setFormatter(formatter)
|
||||
logger.addHandler(stream_handler)
|
||||
|
||||
file_handler = logging.FileHandler('output.log')
|
||||
file_handler.setLevel(logging.INFO)
|
||||
file_handler.setFormatter(formatter)
|
||||
logger.addHandler(file_handler)
|
33
src/util/session.py
Normal file
33
src/util/session.py
Normal file
@@ -0,0 +1,33 @@
|
||||
import fbchat
|
||||
from util.logger import logger
|
||||
import atexit
|
||||
from os import environ
|
||||
|
||||
FB_EMAIL = environ.get("FB_EMAIL")
|
||||
FB_PASSWORD = environ.get("FB_PASSWORD")
|
||||
FB_COOKIE_PATH = environ.get("FB_COOKIE_PATH") or "session.json"
|
||||
|
||||
if not FB_EMAIL or not FB_PASSWORD:
|
||||
raise ValueError("FB_EMAIL and FB_PASSWORD must be set")
|
||||
|
||||
try:
|
||||
logger.info("Loading cookies from %s", FB_COOKIE_PATH)
|
||||
session = fbchat.Session.from_file(FB_COOKIE_PATH)
|
||||
|
||||
except (FileNotFoundError, fbchat.FacebookError):
|
||||
logger.warning("Failed to load cookies from %s", FB_COOKIE_PATH)
|
||||
logger.info("Logging in with email and password")
|
||||
session = fbchat.Session.login(
|
||||
FB_EMAIL, FB_PASSWORD, on_2fa_callback=lambda: input(
|
||||
"Input 2FA code: ")
|
||||
)
|
||||
session.session.to_file(FB_COOKIE_PATH)
|
||||
logger.info("Saved cookies to %s", FB_COOKIE_PATH)
|
||||
|
||||
finally:
|
||||
if session.is_logged_in():
|
||||
logger.info("Logged in as %s", session.user.id)
|
||||
else:
|
||||
raise ValueError("Failed to log in")
|
||||
|
||||
atexit.register(lambda: session.to_file(FB_COOKIE_PATH))
|
Reference in New Issue
Block a user