Gửi tin nhắn hàng loạt trên facebook bằng Selenium

Chào các bạn,
Vài năm trước mình có nghịch ngợm viết ra cái tự động đăng nhập bằng facebook rồi gửi tin nhắn messenger cho mọi người, id của người dùng được lưu trong file excel. File được chia làm hai phần, tự động đăng nhập qua Selenium và đọc file excel gửi tin nhắn cho từng người. Các bạn đọc qua có gì chém em nhẹ vì file viết cũng khá lâu rồi.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import unittest
import time
import xlrd
 
#----------------------------------------------------------------------

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome(executable_path=r"chromedriver.exe")
        self.driver.get("https://www.facebook.com/")

    def test_Login(self):
        driver = self.driver
        fbUsername = "myaccount@gmail.com"
        fbPassword = "xxxxxxxxxxxxxx"
        emailFieldID = ".//*[@id='email']"
        passFieldID = ".//*[@id='pass']"
        loginButtonXPath = ".//input[@value='Đăng nhập']"
        flLogoXpath = "(//a[contains(@href, 'logo')])[1]"

        emailFieldElement = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath(emailFieldID))
        passFieldElement = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath(passFieldID))
        loginButtonElement = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath(loginButtonXPath))

        emailFieldElement.click()
        emailFieldElement.clear()
        emailFieldElement.send_keys(fbUsername)

        passFieldElement.click()
        passFieldElement.clear()
        passFieldElement.send_keys(fbPassword)
        loginButtonElement.click()
        WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath(flLogoXpath))
        
        
        
        path = "myfile.xlsx"
        book = xlrd.open_workbook(path)
 
        worksheet = book.sheet_by_index(0)
        first_row = [] # The row where we stock the name of the column
        
        for i in range(1,3):
            for col in range(worksheet.ncols):
                first_row.append( worksheet.cell_value(i,col))
                
             
            time.sleep(3)    
            driver.find_element_by_tag_name("body").send_keys(Keys.COMMAND + 't')
            
            driver.get('https://www.facebook.com/messages/t/'+first_row[29])# id của receiver
            time.sleep(3)
            MessageBox = driver.find_element_by_class_name('_5rpu')
            
            tmp_m = 'Chúng tôi xin cào các bạn '+first_row[0]+' Cám ơn các bạn đã quan tâm đến Python Việt Nam.\n'
            NewLine = ActionChains(driver)
            MessageBox.send_keys(tmp_m)
            NewLine.send_keys(Keys.ENTER)
            first_row = []
            
                 
        
        time.sleep(3)
        driver.close()
        
    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()
1 Like

Hi bạn!
Trong code của bạn mình chưa đọc hết nhưng mình thấy có 1 số góp ý bạn tham khảo thử xem có hợp lý k nha:

  • K nên dùng tk và pass, theo mình thì nên lưu cookie lại để dùng nhiều lần
  • trong phần wait selenium có 1 số hàm hỗ trợ k cần dùng lambda
  • các xpath k cần dùng thêm dấu . ở đầu
  • Mình chưa rõ phần bạn ấn nút COMMAND + ‘t’, theo minh nếu là ấn trong trang web thì bạn dùng ActionChains tránh đc các trường hợp lỗi do phần tử bị che bởi cái khác
  • Hình như nếu máy tính để unikey thì khi sendkeys sẽ giống như khi mình ấn phím, có thể bị dính dấu tiếng việt.