一鍵自動化博客發佈工具,用過的人都說好(掘金篇)

終於要講解我們親愛的掘金了。掘金是一個非常不錯的平臺。所以很多朋友會把博客發佈到掘金上。

發佈到掘金要填寫的內容也比較多。今天給大家介紹一下如何用blog-auto-publishing-tools這個工具自動把博客發佈到掘金平臺上去。

前提條件

前提條件當然是先下載 blog-auto-publishing-tools這個博客自動發佈工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools

掘金的實現

點擊寫文章按鈕

要進入掘金的寫文章頁面,我們需要先點擊掘金的發佈文章按鈕。

找到寫文章按鈕比較簡單,我們直接通過class name定位到寫文章按鈕,點擊即可。

    # 寫文章按鈕
    write_btn = driver.find_element(By.CLASS_NAME, 'send-button')
    write_btn.click()
    time.sleep(2)  # 等待3秒

點擊寫文章按鈕之後,會開啓一個新的tab頁面。

所以接下來我們需要切換到這個新的tab頁面,然後等待輸入文章標題的title出現。

切換tab可以調用driver.switch_to.window方法。

然後我們調用wait.until來等待新標籤完成加載內容。

    # 切換到新的tab
    driver.switch_to.window(driver.window_handles[-1])
    # 等待新標籤頁完成加載內容
    wait.until(EC.presence_of_element_located((By.XPATH, '//input[@placeholder="輸入文章標題..."]')))

輸入文章標題

掘金的文章標題沒有id,所以我們只能通過xpth來定位。

    # 文章標題
    title = driver.find_element(By.XPATH, '//input[@placeholder="輸入文章標題..."]')
    title.clear()
    title.send_keys(common_config['title'])
    time.sleep(2)  # 等待3秒

輸入文章內容

從debug上來看,掘金的文章內容部分用的是CodeMirror這個富文本編輯工具。

CodeMirror的特點就是html內容會隨着你的輸入而動態變化。

所以這裏我們不能拿到某個元素用send_keys方法,來輸入文章內容。

image-20240509180511628

我們需要轉變一下思路。

除了send_keys方法之外,我們還可以選擇把文章內容拷貝到系統的剪貼板上,然後把鼠標定位到文章內容部分之後,再調用系統的粘貼命令把文章粘貼到指定的位置。

對,就這麼幹:

    # 文章內容
    file_content = read_file_with_footer(common_config['content'])
    # 掘金比較特殊,不能用元素賦值的方法,所以我們使用拷貝的方法
    cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
    # 將要粘貼的文本內容複製到剪貼板
    pyperclip.copy(file_content)
    content = driver.find_element(By.XPATH, '//div[@class="CodeMirror-code"]//span[@role="presentation"]')
    content.click()
    # 模擬實際的粘貼操作(在某些情況下可能更合適):
    action_chains = webdriver.ActionChains(driver)
    action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
    time.sleep(15)  # 等待15秒 圖片解析需要花比較長時間

這裏要注意的是,掘金會嘗試重新上傳圖片,如果你的圖片內容比較多的話,需要耗費比較長的時間。

所以這裏我sleep了15秒鐘。

點擊發布按鈕

接下來就可以點擊發布按鈕了。

點擊發布按鈕之後,會有一個彈出框:

image-20240509181037744

這裏我們可以填寫類型,標籤,封面,專欄,話題和摘要。接下來我們一個個來看看怎麼實現。

文章分類

分類可以在class爲category-list的div下面查找對應文字內容的category,如下所示:

    # 分類
    category = juejin_config['category']
    if category:
        category_btn = driver.find_element(By.XPATH, f'//div[@class="form-item-content category-list"]//div[contains(text(), "{category}")]')
        category_btn.click()
        time.sleep(2)

添加標籤

添加標籤需要首先點擊標籤下拉框:

 tag_btn = driver.find_element(By.XPATH, '//div[contains(@class,"byte-select__placeholder") and contains(text(), "請搜索添加標籤")]')
 tag_btn.click()

然後需要在輸入框裏面輸入你需要添加的標籤,等標籤出現在下拉框的時候,輸入回車就可以選中了對應的標籤了。

# 使用複製粘貼的方式
        pyperclip.copy(tag)
        action_chains = webdriver.ActionChains(driver)
        action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
        # 從下拉框中選擇對應的tag
        tag_element = driver.find_element(By.XPATH, f'//li[contains(@class,"byte-select-option") and contains(text(), "{tag}")]')
        tag_element.click()
        time.sleep(2)  # 等待3秒

注意,這裏我們的輸入比較好的方式就是使用複製粘貼,這樣不需要定位到輸入元素也可以進行。

設置文章封面

文章封面有一個input標籤,所以我們可以使用selenium的上傳圖片功能來實現:

    # 文章封面
    if 'image' in front_matter and front_matter['image']:
        file_input = driver.find_element(By.XPATH, "//input[@type='file']")
        # 文件上傳不支持遠程文件上傳,所以需要把圖片下載到本地
        file_input.send_keys(download_image(front_matter['image']))
        time.sleep(2)

注意,這裏的圖片是在markdown文件的yaml front matter中設置的。如下所示:

image-20240507154807745

收錄至專欄

收錄至專欄需要定位到專欄輸入框,輸入對應的專欄,然後回車即可。

# 收錄至專欄
    collections = juejin_config['collections']
    collection_button = driver.find_element(By.XPATH, '//div[contains(@class,"byte-select__placeholder") and contains(text(), "請搜索添加專欄,同一篇文章最多添加三個專欄")]')
    collection_button.click()
    for coll in collections:
        # 使用複製粘貼的方式
        pyperclip.copy(coll)
        action_chains = webdriver.ActionChains(driver)
        action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
        # 從下拉框中選擇對應的tag
        coll_element = driver.find_element(By.XPATH, f'//li[contains(@class,"byte-select-option") and contains(text(), "{coll}")]')
        coll_element.click()
        time.sleep(2)  # 等待3秒

同樣的,我們也使用的是複製粘貼的方法進行輸入。

創作話題

話題跟專欄的實現方式類似,也是先定位,然後輸入,之後回車選擇。

代碼如下所示:

    # 創作話題
    topic = juejin_config['topic']
    if topic:
        topic_btn = driver.find_element(By.XPATH, '//div[contains(@class,"byte-select__placeholder") and contains(text(), "請搜索添加話題,最多添加1個話題")]')
        topic_btn.click()
        # 使用複製粘貼的方式
        pyperclip.copy(topic)
        action_chains = webdriver.ActionChains(driver)
        action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
        # 從下拉框中選擇對應的tag
        topic_element = driver.find_element(By.XPATH, f'//li[@class="byte-select-option"]//span[contains(text(), "{topic}")]')
        topic_element.click()
        time.sleep(2)  # 等待3秒

這裏也使用的是複製粘貼的方式。

設置摘要

摘要是一個textarea,我們通過xpath來定位它:

    if summary:
        summary_ui = driver.find_element(By.XPATH, '//textarea[@class="byte-input__textarea"]')
        summary_ui.clear()
        summary_ui.send_keys(summary)
        time.sleep(2)  # 等待3秒

最終的發佈

最後就是發佈了。

publish_button = driver.find_element(By.XPATH, '//button[contains(text(), "確定併發布")]')
publish_button.click()

同樣的,我們通過xpath來定位到發佈按鈕。

總結

掘金相對而言實現是比較複雜的。大家可以仔細研究一下具體的實現細節。

點我查看更多精彩內容:www.flydean.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章