Automate Scrubbing your Facebook Presence
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.
 
 
 
 

95 lines
2.4 KiB

from ..types import Post
from .archive import archiver
from .common import SELENIUM_EXCEPTIONS, click_button, wait_xpath, force_mobile
from .config import settings
from selenium.webdriver.common.action_chains import ActionChains
from calendar import month_name
months = [m for m in month_name if m]
import time
# Used as a threshold to avoid running forever
MAX_POSTS = settings["MAX_POSTS"]
def get_load_more(driver):
"""
Click the "Load more from X" button repeatedly
"""
button_expr = f"//div[contains(text(), 'Load more from')]"
print("Trying to load more")
while True:
try:
wait_xpath(driver, button_expr)
driver.find_element_by_xpath(button_expr).click()
except SELENIUM_EXCEPTIONS:
break
def get_timeslices(driver):
"""
Get a list of the time slices Facebook is going to let us click.
"""
slice_expr = "//header"
wait_xpath(driver, slice_expr)
print("Loaded")
for ts in driver.find_elements_by_xpath(slice_expr):
if any(w in months for w in ts.text.strip().split()):
yield ts
try:
int(ts.text.strip())
if len(ts.text.strip()) == 4: # it's a year
yield ts
except ValueError:
continue
def delete_activity(driver,
year=None):
"""
Deletes or hides all activity related to posts.
Args:
driver: seleniumrequests.Chrome Driver instance
year: optional int YYYY year
"""
driver.get("https://m.facebook.com/allactivity/?category_key=statuscluster")
if year is None:
print("Deleting all years")
years = [elem.text.strip() for elem in get_timeslices(driver)]
else:
years = [elem.text.strip() for elem in get_timeslices(driver) if year in elem.text.strip()]
actions = ActionChains(driver)
print(years)
for year in years:
year_elems = [y for y in get_timeslices(driver) if y.text.strip() == year]
if not year_elems:
raise ValueError("Non-existent year") # FIXME use a better exception
year_elem = year_elems[0]
# Need to figure out how to ignore the ones with nothing in them
print(f"Deleting activity from {year_elem.text}")
actions.move_to_element(year_elem)
year_elem.click()
get_load_more(driver)
time.sleep(10)
driver.refresh()
#with archiver("activity") as archive_wall_post: