首頁 > 軟體

Python實現自動回覆討論功能的指令碼分享

2022-10-30 14:00:45

好久不見

寫這篇文章只是想證明一下:本博主還在呼吸

許久未更,甚是想更吶~

這段時間生活中充斥著各種事情,感覺每天都在忙忙碌碌,偶而停下疲憊的身軀,突然擡頭,卻不知自己身處何方,忙了這麼久,到底在忙些什麼呢?找不著方向,於是開始惶恐,便又不知方向的胡亂奔走……,好吧好吧,總結兩個字:迷茫,再加兩個字:瞎忙……

其實這幾天一直想寫部落格的,想寫有趣又輕鬆的一篇文章,但又不到寫哪些內容比較好,又因還要解決各種事情,於是就擱到了現在……

直到某天,為了完成MOOC(MOOC不會沒人不知道吧)上的回覆討論任務,我不已為然的點開了MOOC……突然?我看到了一個進度條,那個進度條彷彿就像是深淵,腦海中突然閃出一句話,我%@#!,咳咳咳,不是不是,是一句名言:當你凝望深淵,深淵也在凝望著你……

(進度條是已經用代……不是,是已經用我辛勤的勞動把它拉起來的)

不知到有沒有小夥伴經歷過要回復幾十條討論的經歷,當場看見那進度條我就……,就偷偷寫指令碼了

這個指令碼花了我比較長的時間才完成的,因為偵錯的過程有些許麻煩……,不過最終還是解決了,想看效果如何,請往下看

實現過程

老操作了兄弟們~

又雙叒叕是Get_cookie.py了兄弟,看過我《小玩意兒》專欄文章的都能看爛了,但別說,還真好用,登入一次,一勞永逸,就靠它了~,話不多說,直接上號

上碼

(記得在三十秒內登入哦~)

from selenium import webdriver
import time
import json


driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.icourse163.org/')
time.sleep(30)

dictCookies = driver.get_cookies()
jsonCookies = json.dumps(dictCookies) # 轉換成字串儲存
with open('moocCookie.txt', 'w') as f:
    f.write(jsonCookies)
    print("cookies儲存成功")

一步拿捏討論

以前回復討論咱們講究的是什麼?講究的是靈活運用Ctrl C和Ctrl V,講究的是快準狠

現在回覆討論咱們講究的是什麼?講究的是能不用手就不用手,講究的是一個 automation,科技是第一生產力呀兄弟們 

什麼?相應模組怎麼下載?pip install 模組名 就完事了兄弟~

什麼?chromedriver怎麼設定?看這篇文章就完事兄弟~

【Python網路蜘蛛 · 9】:selenium模組【安裝和設定環境變數教學、提取資料操作、無頭模式】(附操作原始碼)

什麼?不會搞?看下圖幹就完事了兄弟

實現程式碼

話不多說碼來

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import json
import time

class MOOC(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://www.icourse163.org/')

    def login(self):
        #獲取儲存下的cookie值
        with open('moocCookie.txt', 'r', encoding='utf-8') as f:
            listCookies = json.loads(f.read())

        # 往driver裡新增cookie
        for cookie in listCookies:
            cookie_dict = {
                'domain': '.icourse163.org',
                'name': cookie.get('name'),
                'value': cookie.get('value'),
                'expires': '',
                'path': '/',
                'httpOnly': False,
                'HostOnly': False,
                'Secure': False
            }
            self.driver.add_cookie(cookie_dict)

        self.driver.refresh() # 重新整理頁面

    # 進入課程
    def entering_the_course(self):
        #等待「個人中心」元素出現
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id="j-indexNav-bar"]/div/div/div/div/div[7]/div[3]/div/div/a/span'))
        )
        self.driver.find_element(By.XPATH, '//*[@id="j-indexNav-bar"]/div/div/div/div/div[7]/div[3]/div/div/a/span').click()

        # 等待「SPOC課程12」元素出現並點選
        time.sleep(1)
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="u-selectTab-container"]/div[2]/a'))
        )
        self.driver.find_element(By.XPATH, '//div[@class="u-selectTab-container"]/div[2]/a').click()

        #等待課程元素出現,並獲取元素,使用者選擇課程
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="course-card-wrapper"]/div/a/div/img'))
        )
        course_ele = self.driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]/div/a/div/img')
        course_name = [ele.get_attribute('alt') for ele in course_ele]

        for index, i in enumerate(course_name):
            print(index, i)
        user = int(input('請輸入課程式號:'))

        course_ele[user].click()
        time.sleep(2)
        self.driver.switch_to.window(self.driver.window_handles[-1]) # 切換視窗
        time.sleep(2)
        #等待課件出現並點選
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//li[@data-name="課件"]'))
        )
        self.driver.find_element(By.XPATH, '//li[@data-name="課件"]').click()

        # 等待章節元素出現並點選
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="m-learnChapterList f-pr"]/div[@class="m-learnChapterNormal f-pr"][1]'))
        )
        # 點選章節
        self.driver.find_element(By.XPATH, '//div[@class="m-learnChapterList f-pr"]/div[@class="m-learnChapterNormal f-pr"][1]').click()
        time.sleep(0.3)
        # 點選進入視訊
        self.driver.find_elements(By.XPATH, '//div[@class="sourceList"]/div[1]')[0].click()

        # 獲取章節中」選擇課程「的元素並點選
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located(
                (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
        )
        # 獲取所有章節
        temp_chapters = self.driver.find_elements(By.XPATH, '//div[@class="f-fl j-chapter"]//div[@class="down f-bg j-list"]/div')


        # 通過迴圈獲取到的章節元素和課程元素,進行討論
        for chapter_index in range(len(temp_chapters)): # 迴圈章節
            # 獲取章節中」選擇課程「的元素並點選
            WebDriverWait(self.driver, 1000).until(
                EC.presence_of_element_located(
                    (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
            )
            # 獲取章節選項框並點選
            self.driver.find_element(By.XPATH, '//div[@class="f-fl j-chapter"]/div[@class="u-select"]/div[1]').click()
            self.driver.find_elements(By.XPATH, '//div[@class="f-fl j-chapter"]//div[@class="down f-bg j-list"]/div')[chapter_index].click()

            # 等待課程元素出現
            WebDriverWait(self.driver, 1000).until(
                EC.presence_of_element_located(
                    (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
            )
            # 獲取章節中所有課程
            course = self.driver.find_elements(By.XPATH,'//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div')
            course_names = [i.get_attribute('title') for i in course]

            for c_index in range(len(course)): # 迴圈課程
                WebDriverWait(self.driver, 1000).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
                )
                self.driver.find_element(By.XPATH,'//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div').click()

                WebDriverWait(self.driver, 1000).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div'))
                )
                # 重新獲取課程元素並點選
                course1 = self.driver.find_elements(By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div')
                course1[c_index].click()
                time.sleep(2)

                try:
                    try:
                        # 獲取討論元素
                        disc = self.driver.find_element(By.XPATH, '//li[@title="討論:討論話題"]/span[2]')
                        if disc.is_enabled(): # 如果討論元素存在且可以點選
                            disc.click()
                            self.discuss() # 呼叫討論函數
                    except:
                        time.sleep(0.5)
                        if course_names[c_index] == '討論區':
                            self.discuss()
                except:
                    pass


    # 討論
    def discuss(self):
        # 等待「回覆」元素出現
        WebDriverWait(self.driver, 100).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="optbar f-cb"]/a[1]/span'))
        )
        time.sleep(0.5)
        self.driver.execute_script("var q=document.documentElement.scrollTop=10000")
        time.sleep(0.5)

        try:
            content = self.driver.find_element(By.XPATH, '//div[@class="j-list"]/div/div[3]/div/div[2]/p').text
        except:
            content = self.driver.find_element(By.XPATH, '//div[@class="j-list"]/div/div[1]/div/div[2]').text

        self.driver.switch_to.frame(0)
        time.sleep(0.5)
        # 定位輸入框並輸入資訊
        self.driver.find_element(By.XPATH, '//body[@contenteditable="true"]').send_keys(content)
        self.driver.switch_to.window(self.driver.window_handles[-1])    # 進行視窗切換
        time.sleep(1)
        # 點選傳送回復
        self.driver.find_element(By.XPATH,'/html/body/div[5]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/div[2]/div[2]/div/div/div[5]/div/div[1]/div[2]/a[1]').click()

    def run(self):
        self.login()
        self.entering_the_course()

mooc = MOOC()
mooc.run()

美圖

以上就是Python實現自動回覆討論功能的指令碼分享的詳細內容,更多關於Python自動回覆討論的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com