Untitled

mail@pastecode.io avatar
unknown
python
2 years ago
5.3 kB
2
Indexable
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import undetected_chromedriver.v2 as uc
from selenium.webdriver.chrome.service import Service

def antiBan(): #防止操作太快被ban,設置停頓時間
    time.sleep(0.8)

class quizletEngine:
    def __init__(self, account, passwd) -> None:
        self.account = account
        self.passwd = passwd
        self.loginUrl = 'https://quizlet.com/zh-tw'
        self.photoID = 100000000
        self.setup()
        try:
            self.login()
        except:
            print("Already Login finish")

    def checkPhotoID(self): #防止圖片無限增加
        if(self.photoID > 999999999):
            self.photoID = 100000000

    def setup(self): #設定Chrome driver參數
        chrome_options = webdriver.ChromeOptions()
        chrome_options.user_data_dir = "temp/profile"
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--disable-dev-shm-usage')
        chrome_options.add_argument('window-size=1920x1080') 
        chrome_options.add_argument('lang=zh_CN.UTF-8')
        chrome_options.add_argument('--start-maximized')
        chrome_options.add_argument('--incognito')
        chrome_options.add_argument('--disable-infobars')
        chrome_options.add_argument('--no-first-run --no-service-autorun --password-store=basic')
        chrome_options.add_argument('User-Agent=Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36')

        #driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
        self.driver = uc.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options, version_main=94)

    def login(self): #找到登入按鈕並成功登入
        self.driver.get(self.loginUrl)
        self.driver.save_screenshot('photo/' + str(1) + '.png')
        self.driver.find_element(By.CLASS_NAME, "SiteNavLoginSection-loginButton").click()
        antiBan()
        self.driver.find_element(By.ID, "username").send_keys(self.account)
        antiBan()
        self.driver.find_element(By.ID, "password").send_keys(self.passwd)
        antiBan()
        #self.driver.find_element(by=By.CSS_SELECTOR, value="[aria-label=Exit]").click()
        #antiBan()
        self.driver.find_elements(by=By.CSS_SELECTOR, value="[aria-label=登入]")[1].click()
        antiBan()

        print("Login finish")

    def browsePage(self, url, bigChapter, smallChapter, questionList): #搜尋章節和題號
        photoIDArr = []
        #try:
        for questionIndex in questionList:
            print(bigChapter, smallChapter, questionIndex, end="\n")
            self.driver.get(url)
            self.driver.find_element(by=By.CSS_SELECTOR, value="[aria-label=第"+str(bigChapter)+"章]").click()
            antiBan()

            smallChapterList = self.driver.find_elements(by=By.CSS_SELECTOR, value="[aria-label^=第"+str(bigChapter)+"]")
            smallChapterList[smallChapter-1+1].click()
            antiBan()

            tmpRoot = self.driver.find_elements(by=By.CSS_SELECTOR, value="[data-testid=TextbookTableOfContentsChapterMenu]")
            root = tmpRoot[bigChapter-1].find_element(by=By.CSS_SELECTOR, value="div>div>div>div>div:nth-child(2)>div>div>div:nth-child(%s)>span>a>span" %questionIndex)
            antiBan()

            root.click()
            antiBan()

            res = self.screenShot()
            photoIDArr.append(res)
        
        return photoIDArr
        #except:
            #self.driver.save_screenshot('photo/' + str('error') + '.png')
            

    def screenShot(self): #把視窗放大至容納得下所有解答後截圖
        try:
            js="var q=document.documentElement.scrollTop=100000"
            self.driver.execute_script(js)
            time.sleep(2)

            self.driver.find_element(by=By.CSS_SELECTOR, value="[aria-label=顯示所有步驟]").click()
            antiBan()

            js="var q=document.documentElement.scrollTop=0"
            self.driver.execute_script(js)
        except:
            pass
        time.sleep(2)


        res = self.photoID

        original_size = self.driver.get_window_size()
        required_width = self.driver.execute_script('return document.body.parentNode.scrollWidth')
        required_height = self.driver.execute_script('return document.body.parentNode.scrollHeight')
        self.driver.set_window_size(required_width, required_height)
        # driver.save_screenshot(path)  # has scrollbar
        self.driver.find_element_by_tag_name('body').screenshot('photo/' + str(self.photoID) + '.png')  # avoids scrollbar
        self.driver.set_window_size(original_size['width'], original_size['height'])
        
        #self.driver.save_screenshot('photo/' + str(self.photoID) + '.png')
        self.photoID+=1
        self.checkPhotoID()
        time.sleep(2)
        return res