From 0780e637ec7569b27bc72bae214e753bab65d02c Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Mon, 20 May 2019 10:42:41 -0400 Subject: [PATCH] Refactor into a proper package --- README.md | 7 +--- deletefb.py | 64 ----------------------------- deletefb/__init__.py | 0 deletefb/deletefb.py | 98 ++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 2 - setup.py | 8 ++-- 6 files changed, 104 insertions(+), 75 deletions(-) delete mode 100755 deletefb.py create mode 100644 deletefb/__init__.py create mode 100755 deletefb/deletefb.py diff --git a/README.md b/README.md index 0edfb52..ce4c66c 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,8 @@ * Make sure that you have Google Chrome installed and that it is up to date * Install python 3.x (tested on python 3.7) along with pip -* `virtualenv -p $(which python3) ./venv` -* `source venv/bin/activate` -* `pip3 install -r requirements.txt` -* Edit `deletefb.py` to include your email, password, and profile URL. -* Run `python3 deletefb.py` with your virtual environment activated. +* `pip3 install --user delete-facebook-posts` +* Run `deletefb -E "youremail@example.org" -P "yourfacebookpassword" -U "https://www.facebook.com/your.profile.url" * Wait a long time * Say goodbye to your Facebook posts! diff --git a/deletefb.py b/deletefb.py deleted file mode 100755 index 38538cc..0000000 --- a/deletefb.py +++ /dev/null @@ -1,64 +0,0 @@ -#! /usr/bin/env python - -from seleniumrequests import Chrome -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.chrome.options import Options -import time - -EMAIL_ADDRESS = "Your Email Here" -PASSWORD = "Your Password Here" - -PROFILE_URL = "https://www.facebook.com/your.name" - -chrome_options = Options() -prefs = {"profile.default_content_setting_values.notifications" : 2} -chrome_options.add_experimental_option("prefs", prefs) - -chrome_options.add_argument("start-maximized") - -driver = Chrome(chrome_options=chrome_options) - -driver.get("https://facebook.com") - -email = "email" -password = "pass" -login="loginbutton" - -emailelement = driver.find_element_by_name(email) - -passwordelement = driver.find_element_by_name(password) - -emailelement.send_keys(EMAIL_ADDRESS) - -passwordelement.send_keys(PASSWORD) - -loginelement = driver.find_element_by_id(login) - -loginelement.click() -time.sleep(3) - -driver.get(PROFILE_URL) -time.sleep(3) - -for _ in range(5100): - post_button_sel = "_4xev" - timeline_element = driver.find_element_by_class_name(post_button_sel) - actions = ActionChains(driver) - actions.move_to_element(timeline_element).click().perform() - time.sleep(5) - - menu = driver.find_element_by_css_selector("#globalContainer > div.uiContextualLayerPositioner.uiLayer > div") - actions.move_to_element(menu).perform() - try: - delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"FeedDeleteOption\"]") - except: - delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"HIDE_FROM_TIMELINE\"]") - - actions.move_to_element(delete_button).click().perform() - - time.sleep(4) - - confirmation_button = driver.find_element_by_class_name("layerConfirm") - driver.execute_script("arguments[0].click();", confirmation_button) - time.sleep(3) - driver.refresh() diff --git a/deletefb/__init__.py b/deletefb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/deletefb/deletefb.py b/deletefb/deletefb.py new file mode 100755 index 0000000..3a2370e --- /dev/null +++ b/deletefb/deletefb.py @@ -0,0 +1,98 @@ +#! /usr/bin/env python + +from seleniumrequests import Chrome +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.chrome.options import Options +import time +import argparse + +def run_delete(): + parser = argparse.ArgumentParser() + parser.add_argument("-E", + "--email", + default=None, + help="Your email address associated with the account") + + parser.add_argument("-P", + "--password", + default=None, + help="Your Facebook password") + + parser.add_argument("-U", + "--profile-url", + default=None, + help=""" + The link to your Facebook profile, e.g. https://www.facebook.com/your.name + """) + + args = parser.parse_args() + + delete_posts(user_email_address=args.email, + user_password=args.password, + user_profile_url=args.profile_url) + +def delete_posts(user_email_address=None, + user_password=None, + user_profile_url=None): + """ + user_email_address: Your Email + user_password: Your password + user_profile_url: Your profile URL + """ + + assert all((user_email_address, + user_password, + user_profile_url)), "Insufficient arguments provided" + + chrome_options = Options() + prefs = {"profile.default_content_setting_values.notifications" : 2} + chrome_options.add_experimental_option("prefs", prefs) + + chrome_options.add_argument("start-maximized") + + driver = Chrome(chrome_options=chrome_options) + + driver.get("https://facebook.com") + + email = "email" + password = "pass" + login="loginbutton" + + emailelement = driver.find_element_by_name(email) + + passwordelement = driver.find_element_by_name(password) + + emailelement.send_keys(user_email_address) + + passwordelement.send_keys(user_password) + + loginelement = driver.find_element_by_id(login) + + loginelement.click() + time.sleep(3) + + driver.get(user_profile_url) + time.sleep(3) + + for _ in range(5100): + post_button_sel = "_4xev" + timeline_element = driver.find_element_by_class_name(post_button_sel) + actions = ActionChains(driver) + actions.move_to_element(timeline_element).click().perform() + time.sleep(5) + + menu = driver.find_element_by_css_selector("#globalContainer > div.uiContextualLayerPositioner.uiLayer > div") + actions.move_to_element(menu).perform() + try: + delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"FeedDeleteOption\"]") + except: + delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"HIDE_FROM_TIMELINE\"]") + + actions.move_to_element(delete_button).click().perform() + + time.sleep(4) + + confirmation_button = driver.find_element_by_class_name("layerConfirm") + driver.execute_script("arguments[0].click();", confirmation_button) + time.sleep(3) + driver.refresh() diff --git a/requirements.txt b/requirements.txt index 7c524be..01c97bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,6 @@ certifi==2018.11.29 chardet==3.0.4 idna==2.8 -mahotas==1.4.5 -numpy==1.16.2 requests==2.21.0 requests-file==1.4.3 selenium==3.141.0 diff --git a/setup.py b/setup.py index 99f7c5f..c466bd5 100644 --- a/setup.py +++ b/setup.py @@ -14,9 +14,9 @@ setuptools.setup( url="https://github.com/weskerfoot/DeleteFB", packages=setuptools.find_packages(), install_requires = [ - "selenium>=3.141.0", - "selenium-requests>=1.3", - "requests>=2.21.0" + "selenium", + "selenium-requests", + "requests" ], classifiers= [ "Programming Language :: Python :: 3", @@ -25,7 +25,7 @@ setuptools.setup( ], entry_points = { "console_scripts" : [ - "deletefb = deletefb:run_delete" + "deletefb = deletefb.deletefb:run_delete" ] } )