一鍵自動化部落格釋出工具,用過的人都說好(知乎篇)

flydean發表於2024-05-22

我們已經學習了很多自動化的知識了,接下來讓我們看看在blog-auto-publishing-tools中是如何實現自動傳送博文到知乎的。

前提條件

前提條件當然是先下載 blog-auto-publishing-tools這個部落格自動釋出工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools

知乎的實現

知乎的欄位不是太多,算是中規中矩。但是有些實現還是需要一些技巧的。一起來看看吧。

設定標題

知乎的標題是一個textarea,可以看到知乎的textarea有class,placeholder這些屬性。class後面的那一長串是自動生成的。

所以可以使用的欄位就只有placeholder這個屬性了。

image-20240510213849893

所以,我們可以這樣來定位標題欄位:

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

設定內容

知乎的內容部分也是動態的,透過除錯可以看到,好像是用的是一個叫做DraftEditor的東西(不太確定)。

基本上和之前講過的CodeMirror是類似的東西。

如果你看過我之前的文章,那麼就可以知道類似這種動態的標籤,我們可以使用複製和貼上的方法來實現內容的輸入。

另外,知乎是不支援markdown格式的。

雖然知乎有個識別markdown格式的東西,但是如果你試過就會發現,markdown在知乎並不好使。

所以,我們在複製之前,需要把markdown格式轉換成為html格式。

網上有很多把markdown轉換成html的工具,其中一個比較出名的就是pandoc。

pandoc的功能很強大,可以轉換很多格式的文字。

對於markdown轉換成html,可以使用下面的命令:

 pandoc -f markdown -t html5 input.md -o output.html

當然為了複製出來的樣式好看一些,這裡我還新增了css檔案。

實現方法都寫在了convert_md_to_html方法裡面了。

感興趣的朋友可以去看看。

最後我們的實現程式碼如下:

# 文章內容 html版本
    content_file = common_config['content']
    # 注意,zhihu 不能識別轉換過後的程式碼塊格式
    content_file_html = convert_md_to_html(content_file)
    get_html_web_content(driver, content_file_html)
    time.sleep(2)  # 等待2秒
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(1)  # 等待1秒
    # 不能用元素賦值的方法,所以我們使用複製的方法
    cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
    action_chains = webdriver.ActionChains(driver)
    # 點選內容元素
    content_element = driver.find_element(By.XPATH, '//div[@class="DraftEditor-editorContainer"]//div[@class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"]')
    content_element.click()
    time.sleep(2)
    # 模擬實際的貼上操作
    action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
    time.sleep(3)  # 等待5秒 不需要進行圖片解析

解釋下實現的邏輯。

convert_md_to_html是把markdown轉換成了html。

get_html_web_content是在新的web tab中開啟這個html檔案,然後使用系統的複製功能把html內容複製到剪貼簿上。

然後再定位到要貼上的位置,使用系統的貼上功能把內容貼上到內容框中。

設定封面

很棒的是知乎的的上傳封面有一個input標籤,如下所示:

image-20240517234037280

所以我們可以使用selenium的input上傳功能,來上傳封面。

封面資料可以寫到markdown檔案的YAML Front Matter中,如下所示:

image-20240507154807745

具體的實現程式碼如下:

        file_input = driver.find_element(By.XPATH, "//input[@type='file']")
        # 檔案上傳不支援遠端檔案上傳,所以需要把圖片下載到本地
        file_input.send_keys(download_image(front_matter['image']))
        time.sleep(2)

投稿至問題

說實話,這個我真的不知道怎麼實現,因為每個文章對應的問題是不一樣的。

所以這個作為待解決的問題。如果有朋友希望我實現這個功能,可以跟我說。

文章話題

知乎這個文章話題實現起來比較困難。

因為知乎會自動給你檔案打上話題。如果要自定義話題的話,需要先刪除已有的話題,然後再新增上自己的話題。

這個這裡就不實現了。

專欄收錄

專欄當然要收錄在自己的專欄裡面啦。

所以我們需要點選發布到專欄按鈕。

還好,知乎的的專欄按鈕是有一個id的。

    # 專欄收錄
    pubish_panel = driver.find_element(By.ID, 'PublishPanel-columnLabel-1')
    pubish_panel.click()

最後的釋出

最後就是確認釋出了。我們找到最後的釋出按鈕,點選即可。

        confirm_button = driver.find_element(By.XPATH, '//button[contains(text(), "釋出")]')
        confirm_button.click()

點我檢視更多精彩內容:www.flydean.com

相關文章