Fixes for new facebook site #129

Merged
weskerfoot merged 3 commits from new-facebook into master 5 years ago
  1. 19
      deletefb/tools/conversations.py
  2. 51
      deletefb/tools/wall.py

19
deletefb/tools/conversations.py

@ -6,6 +6,7 @@ from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select from selenium.webdriver.support.ui import Select
from pendulum import now from pendulum import now
from json import loads from json import loads
from time import sleep
import lxml.html as lxh import lxml.html as lxh
@ -29,12 +30,13 @@ def get_conversations(driver):
date = None date = None
if url and "messages/read" in url: if url and "messages/read" in url:
try:
date = convo.find_element_by_xpath("../../..//abbr").text date = convo.find_element_by_xpath("../../..//abbr").text
conversation_name = convo.find_element_by_xpath("../../../div/div/header/h3").text.strip() conversation_name = convo.find_element_by_xpath("../../../div/div/header/h3").text.strip()
assert(conversation_name)
assert(conversation_name) assert(url)
assert(url) except (SELENIUM_EXCEPTIONS + (AssertionError,)):
continue
conversations.append( conversations.append(
Conversation( Conversation(
@ -49,7 +51,10 @@ def get_conversations(driver):
find_element_by_xpath("a"). find_element_by_xpath("a").
get_attribute("href")) get_attribute("href"))
except SELENIUM_EXCEPTIONS: print("next_url", next_url)
except SELENIUM_EXCEPTIONS as e:
print(e)
break break
if not next_url: if not next_url:
break break

51
deletefb/tools/wall.py

@ -26,21 +26,39 @@ def delete_posts(driver,
driver.get(user_profile_url) driver.get(user_profile_url)
for _ in range(MAX_POSTS): finished = False
post_button_sel = "_4xev"
post_content_sel = "userContent" with archiver("wall") as archive_wall_post:
post_timestamp_sel = "timestampContent" for _ in range(MAX_POSTS):
if finished:
break
post_button_sel = "_4s19"
button_types = ["FeedDeleteOption", "HIDE_FROM_TIMELINE", "UNTAG"] post_content_sel = "userContent"
post_timestamp_sel = "timestampContent"
confirmation_button_exp = "//div[contains(@data-sigil, 'undo-content')]//*/a[contains(@href, 'direct_action_execute')]"
# Cannot return a text node, so it returns the parent.
# Tries to be pretty resilient against DOM re-organizations
timestamp_exp = "//article//*/header//*/div/a[contains(@href, 'story_fbid')]//text()/.."
button_types = ["Delete post", "Remove Tag", "Hide from timeline"]
with archiver("wall") as archive_wall_post:
while True: while True:
try: try:
timeline_element = driver.find_element_by_class_name(post_button_sel) try:
timeline_element = driver.find_element_by_xpath("//div[@data-sigil='story-popup-causal-init']/a")
except SELENIUM_EXCEPTIONS:
print("Could not find any posts")
finished = True
break
post_content_element = driver.find_element_by_class_name(post_content_sel) post_content_element = driver.find_element_by_xpath("//article/div[@class='story_body_container']/div")
post_content_ts = driver.find_element_by_class_name(post_timestamp_sel) post_content_ts = driver.find_element_by_xpath(timestamp_exp)
if not (post_content_element or post_content_ts):
break
# Archive the post # Archive the post
archive_wall_post.archive( archive_wall_post.archive(
@ -53,15 +71,18 @@ def delete_posts(driver,
actions = ActionChains(driver) actions = ActionChains(driver)
actions.move_to_element(timeline_element).click().perform() actions.move_to_element(timeline_element).click().perform()
wait_xpath(driver, "//*[@id='feed_post_menu']/..") # Wait until the buttons show up
wait_xpath(driver, "//*[contains(@data-sigil, 'removeStoryButton')]")
menu = driver.find_element_by_xpath("//*[@id='feed_post_menu']/..")
delete_button = None delete_button = None
# Search for visible buttons in priority order
# Delete -> Untag -> Hide
for button_type in button_types: for button_type in button_types:
try: try:
delete_button = menu.find_element_by_xpath("//a[@data-feed-option-name=\"{0}\"]".format(button_type)) delete_button = driver.find_element_by_xpath("//*[text()='{0}']".format(button_type))
if not delete_button.is_displayed():
continue
break break
except SELENIUM_EXCEPTIONS as e: except SELENIUM_EXCEPTIONS as e:
print(e) print(e)
@ -72,8 +93,10 @@ def delete_posts(driver,
break break
click_button(driver, delete_button) click_button(driver, delete_button)
confirmation_button = driver.find_element_by_class_name("layerConfirm") wait_xpath(driver, confirmation_button_exp)
confirmation_button = driver.find_element_by_xpath(confirmation_button_exp)
print(confirmation_button)
click_button(driver, confirmation_button) click_button(driver, confirmation_button)
except SELENIUM_EXCEPTIONS as e: except SELENIUM_EXCEPTIONS as e:

Loading…
Cancel
Save