# coding=utf-8 # author foreigner.web@gmail.com import sys import os import traceback from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.common.exceptions import TimeoutException, NoSuchElementException, ElementNotVisibleException class NotLoggedInError(Exception): pass class Facebook(object): def __init__(self, login, password): self.login = login self.password = password self.nick = None self.normalized_nick = None self.avatar_image = "/Users/foreigner/Downloads/avatar.jpg" self.login_url = u"https://www.facebook.com/login.php" self.update_url = u"https://www.facebook.com/{0}?sk=info&edit=eduwork" self.cookie = None self.driver = webdriver.Firefox() def log_in(self): self.driver.get(self.login_url) self.driver.find_element(By.NAME, u"email").send_keys(self.login) self.driver.find_element(By.NAME, u"pass").send_keys(self.password) self.driver.find_element(By.NAME, u"login").submit() def normalize_nick(text): nick = '.'.join(text.split(' ')) return nick.lower() try: WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.ID, u"navHome"))) self.cookie = self.driver.get_cookies() self.nick = self.driver.find_element(By.CLASS_NAME, u"headerTinymanName").text self.normalized_nick = normalize_nick(self.nick) self.update_url = self.update_url.format(self.normalized_nick) except TimeoutException as e: print "Request Timeout. {0}".format(e.message) except TypeError as te: print 'Error occurred. {0}'.format(te.message) import traceback type_, value_, trace_ = sys.exc_info() print traceback.format_tb(trace_) except: print "Something went wrong. {0}".format(sys.exc_info()[0]) def _stack_trace(self, exc_info): """ :param exc_info: """ _type, _value, _trace = exc_info print "Caught exception:\n\t{0}\n\t{1}\nStacktrace: {2}".format(_type, _value, traceback.format_tb(_trace)) def _update_avatar(self): if not self.cookie: raise NotLoggedInError("No cookies found. Possible Log in failure") try: if not os.path.exists(self.avatar_image): raise IOError("Avatar file not found") self.driver.find_element(By.CLASS_NAME, u"sx_53a53c").click() WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.CLASS_NAME, u"fbTimelineSelectorFileInput"))) WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.NAME, u"pic"))) self.driver.find_element(By.NAME, u"pic").send_keys(self.avatar_image) except NoSuchElementException as NSE: print "Element not found! {0}".format(NSE.msg) except TimeoutException as TE: print "Request Timeout. {0}".format(TE.message) except ElementNotVisibleException as ENV: print "Button not visible! {0}".format(ENV.msg) except IOError as IOE: print IOE.message print IOE.filename except: self._stack_trace(sys.exc_info()) def _update_hometown(self): try: curr_city = self.driver.find_element(By.ID, u"current_city") curr_city.find_element(By.CLASS_NAME, u"fbProfileBlankStateIcon").click() WebDriverWait(self.driver, 15).until(ec.presence_of_element_located((By.ID, u"edit_hometown"))) input_field = self.driver.find_element(By.ID, u"edit_hometown").find_element(By.CLASS_NAME, u"inputtext") input_field.send_keys(u"Минск") input_field.click() WebDriverWait(self.driver, 15).until(ec.presence_of_element_located((By.CLASS_NAME, u"text"))) self.driver.find_element(By.CLASS_NAME, u"text").click() self.driver.find_element(By.NAME, "save").click() except ElementNotVisibleException as NVE: print "Button not visible! {0}".format(NVE.msg) self._stack_trace(sys.exc_info()) except TimeoutException as TE: print "Timeout failure. {0}".format(TE.msg) except NoSuchElementException as nse: print 'Error. Element not found! {0}'.format(nse.msg) import traceback type_, value_, trace_ = sys.exc_info() print traceback.format_tb(trace_) except: print "Something went wrong." import traceback type_, value_, trace_ = sys.exc_info() print type_, "\t", value_ print traceback.format_tb(trace_) def update(self): if not self.cookie: raise NotLoggedInError("No cookies found! Possible Log in failure") self.driver.get(self.update_url) # self._update_avatar() self._update_hometown() account = Facebook("login", "pass") account.log_in() account.update()