def _get_person_messages(self): """ Get all messages from current open chat, parse to fields name, datetime and text. :return: list of messages [{"name":name, "text": text, "time":time}, {"name":name, "text": text, "time":time}, ...] """ messages = [] rawMessages = self.browser.execute_script(scrapingScripts.getTextMessages()) # Onetime update for user whatsapp name if self.user_whatsapp_name is None: outMsg = self.browser.execute_script(scrapingScripts.getSingleOutgoingMessage()) if outMsg is not None: self.user_whatsapp_name = outMsg[outMsg.find("\xa0")+1: outMsg.find("\xa0", outMsg.find("\xa0")+2)-1] # Extract data from raw message for msg in rawMessages: name, text, dateandtime = self._parse_message(msg) # Unsupported message if name is None: continue msgData = {"name": name, "text": text, "time": dateandtime} messages.append(msgData) return messages
def _get_group_messages(self): """ Returns summary of group chat: each group member name and how many msgs they sent. @:return list of len 2: [int totalMessages , dict {"Asaf":360, "Neta":180,...}] """ groupData = {} # data to be returned rawMessages = self.browser.execute_script(scrapingScripts.getTextMessages()) totalMessages = len(rawMessages) for msg in rawMessages: name, text, dateandtime = self._parse_message(msg) # In case of images if name is None: continue # update contact if exists otherwise create if name in groupData: groupData[ name ] += 1 else: groupData[ name ] = 1 return [ totalMessages, groupData ]
def __init__(self, webdriver): self.browser = Webdriver.getBrowser(webdriver) # Get browser self.browser.set_page_load_timeout(150) # Set timeout to 150 seconds self.browser.get("https://web.whatsapp.com/") # Navigate browser to WhatsApp page self.browser.execute_script(scrapingScripts.initJQuery()) # active the jquery lib self.scrapedContacts = [ ] # List of scraped contacts self.defaultAvatar = Image.open("defaultAvatar.jpg") self.user_whatsapp_name = None # what is the user's whatsapp outgoing messages name # How many contact we scraped already self.person_count = 0 self.group_count = 0 self.probably_hebrew_interface = True # Wait in current page for user to log in using barcode scan. self.wait_for_element('.infinite-list-viewport', 300)
def _get_contact_avatar(self): """ Sends to db the avatar of current loaded chat. """ # print("In getContactAvatar") # Getting the small image's url and switching to the large image avatar_url = self.wait_for_element('#main .chat-avatar img', 2) # If contact has no avatar if avatar_url is None: return None avatar_url = avatar_url.get_attribute("src") avatar_url = avatar_url[:34] + "l" + avatar_url[35:] # Opening a new tab self.browser.execute_script("window.open('" + avatar_url + "');") # Switching to the new tab and navigating to image's url defWin = self.browser.window_handles[0] newWin = self.browser.window_handles[1] self.browser.switch_to_window(newWin) self.browser.get(avatar_url) self.browser.execute_script(scrapingScripts.initJQuery()) # Saving a screen shot img = self.wait_for_element('body img') # Getting image size for cropping width = img.get_attribute("width") height = img.get_attribute("height") self.browser.save_screenshot(self.TEMP_SCREENSHOT_PATH) # Cropping screenshot = Image.open("full_screen_shot_temp.png") cropped = screenshot.crop((0, 0, int(width), int(height))) # Closing the tab self.browser.close() self.browser.switch_to_window(defWin) return self._trim_avatar(cropped)