diff --git a/README.md b/README.md index 4b2b4c3..c882e17 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,7 @@ You have several options to run it. 1) Install from PyPI with `pip install --user delete-facebook-posts` 2) Clone this repo and run `pip install --user .` or do `pip install --user git+https://github.com/weskerfoot/DeleteFB.git` -3) Set up a Python virtualenv, activate it, and run `pip install -r -requirements.txt`, then you can just run `python -m deletefb.deletefb.py` in the project directory, as you would if you had installed it from PyPI. +3) Set up a Python virtualenv, activate it, and run `pip install -r requirements.txt`, then you can just run `python deletefb` in the DeleteFB directory. ## How To Use It diff --git a/deletefb/__main__.py b/deletefb/__main__.py new file mode 100644 index 0000000..c735177 --- /dev/null +++ b/deletefb/__main__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +import deletefb + +if __name__ == "__main__": + deletefb.run_delete() diff --git a/deletefb/deletefb.log b/deletefb/deletefb.log new file mode 100644 index 0000000..e69de29 diff --git a/deletefb/deletefb.py b/deletefb/deletefb.py index b6cc483..54d0c66 100755 --- a/deletefb/deletefb.py +++ b/deletefb/deletefb.py @@ -2,12 +2,17 @@ import argparse import getpass -import sys +import json import os +import sys + +from tools.common import logger +from tools.login import login +from tools.wall import delete_posts +from tools.likes import unlike_pages + +LOG = logger("deletefb") -from .tools.login import login -from .tools.wall import delete_posts -from .tools.likes import unlike_pages def run_delete(): parser = argparse.ArgumentParser() diff --git a/deletefb/logging_conf.json b/deletefb/logging_conf.json new file mode 100644 index 0000000..2078e80 --- /dev/null +++ b/deletefb/logging_conf.json @@ -0,0 +1,62 @@ +{ + "logging": { + "version": 1, + "disable_existing_loggers": true, + "formatters": { + "brief": { + "class": "logging.Formatter", + "style": "{", + "datefmt": "%H:%M:%S", + "format": "{name:s}-{levelname:s}-{asctime:s}-{message:s}" + }, + "verbose": { + "class": "logging.Formatter", + "style": "{", + "datefmt": "%Y-%m-%dT%H:%M:%S", + "format": "{name:s}:{levelname:s}:L{lineno:d} {asctime:s} {message:s}" + } + }, + "handlers": { + "console": { + "level": "DEBUG", + "class": "logging.StreamHandler", + "formatter": "brief", + "stream": "ext://sys.stdout" + }, + "file_handler": { + "level": "INFO", + "class": "logging.handlers.WatchedFileHandler", + "formatter": "verbose", + "filename": "deletefb/deletefb.log", + "mode": "a", + "encoding": "utf-8" + } + }, + "loggers": { + "root": { + "level": "DEBUG", + "handlers": ["console", "file_handler"] + }, + "deletefb": { + "level": "DEBUG", + "handlers": ["console"], + "propagate": false + }, + "login": { + "level": "DEBUG", + "handlers": ["file_handler"], + "propagate": false + }, + "likes": { + "level": "DEBUG", + "handlers": ["file_handler"], + "propagate": false + }, + "wall": { + "level": "DEBUG", + "handlers": ["file_handler"], + "propagate": false + } + } + } +} diff --git a/deletefb/tools/common.py b/deletefb/tools/common.py index e086df6..fe97881 100644 --- a/deletefb/tools/common.py +++ b/deletefb/tools/common.py @@ -1,6 +1,8 @@ import json +import logging +import logging.config import os -from os.path import abspath, relpath, split +from os.path import abspath, relpath, split, isfile import time from selenium.common.exceptions import ( @@ -24,6 +26,21 @@ def try_move(actions, el): time.sleep(5) continue +def logger(name): + """ + Args: + name (str): Logger name + + Returns: + logging.Logger + """ + config_path = "deletefb/logging_conf.json" + if not isfile(config_path): # called from file (deletefb.py) + os.chdir("..") + with open(config_path, "r", encoding="utf-8") as config_file: + config = json.load(config_file) + logging.config.dictConfig(config["logging"]) + return logging.getLogger(name) def archiver(category): """ diff --git a/deletefb/tools/likes.py b/deletefb/tools/likes.py index abef381..cbb8886 100644 --- a/deletefb/tools/likes.py +++ b/deletefb/tools/likes.py @@ -3,7 +3,9 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC -from .common import SELENIUM_EXCEPTIONS, archiver +from .common import SELENIUM_EXCEPTIONS, archiver, logger + +LOG = logger(__name__) def load_likes(driver): @@ -29,6 +31,7 @@ def load_likes(driver): EC.presence_of_element_located((By.XPATH, "//button/div/i[@aria-hidden=\"true\"]")) ) except SELENIUM_EXCEPTIONS: + LOG.exception("Traceback of load_likes") return def unlike_pages(driver): diff --git a/deletefb/tools/wall.py b/deletefb/tools/wall.py index 9983e41..26da422 100644 --- a/deletefb/tools/wall.py +++ b/deletefb/tools/wall.py @@ -51,10 +51,7 @@ def delete_posts(driver, try: delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"FeedDeleteOption\"]") except SELENIUM_EXCEPTIONS: - try: - delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"HIDE_FROM_TIMELINE\"]") - except SELENIUM_EXCEPTIONS: - delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"UNTAG\"]") + delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"HIDE_FROM_TIMELINE\"]") actions.move_to_element(delete_button).click().perform() confirmation_button = driver.find_element_by_class_name("layerConfirm")