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

flydean發表於2024-05-24

之前收到很多朋友的要求,說是需要一個公眾號的自動釋出工具。

現在,它來了。

前提條件

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

公眾號的實現

因為公眾號每隔一段時間就會登入失效,所以在使用自動釋出公眾號之前,一定要確保你的公眾號是登入狀態。

否則沒辦法自動釋出公眾號訊息。

登入到首頁

如果你已經登入過公眾號,那麼可以直接訪問https://mp.weixin.qq.com/, 這樣會直接跳轉到公眾號的後臺釋出介面。

點選圖文訊息

到了首頁之後,我們就可以點選圖文訊息這個按鈕,開始我們的創作了。

image-20240519110216544

公眾號的圖文訊息實現的比較複雜。我們只能透過xpath來定位到這個元素。

    # 點選圖文訊息
    pic_and_article_button = driver.find_element(By.XPATH, '//div[@class="new-creation__menu-item"]//div[@class="new-creation__menu-title" and contains(text(), "圖文訊息")]')
    pic_and_article_button.click()
    time.sleep(1)

點選之後,就會跳轉到公眾號創作頁面。

所以,我們需要切換一下tab:

    # 切換到新的tab
    driver.switch_to.window(driver.window_handles[-1])
    time.sleep(1)

輸入標題

公眾號的標題是帶有title id的,所以我們可以直接透過id來獲取。

    # 文章標題
    title = driver.find_element(By.ID, 'title')
    title.clear()
    if 'title' in front_matter['title'] and front_matter['title']:
        title.send_keys(front_matter['title'])
    else:
        title.send_keys(common_config['title'])
    time.sleep(2)  # 等待3秒

輸入作者

公眾號的作者也是帶有author id的。

這裡有兩種方法來配置作者ID,第一種,也是推薦的一種就是把作者,title,圖片等資訊寫到markdown檔案的YAML Front Matter中,如下所示:

image-20240507154807745

第二種就是在mpweixin自己的配置檔案中設定author這個欄位。

兩種都可以,但是我個人推薦第一種。

實現程式碼如下:

    # 文章作者
    author = driver.find_element(By.ID, 'author')
    if 'authors' in front_matter and front_matter['authors']:
        author.send_keys(front_matter['authors'])
    else:
        author.send_keys(mpweixin_config['author'])
    time.sleep(1)

文章內容

說實話,我不知道騰訊到底是怎麼想的,這裡的文章內容居然是一個嵌入的iframe:

image-20240519111141051

說不上為什麼,但是總是感覺怪怪的。

不過沒關係,我們還是能夠實現。

當然,這種就不能像傳統方式那樣來設定內容了。

我們只能使用複製貼上的方式。

另外,微信公眾號不能識別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, False)
    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.ID, 'edui1_contentplaceholder')
    ActionChains(driver).click(content_element).perform()
    time.sleep(1)
    # 模擬實際的貼上操作
    action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
    time.sleep(3)  # 等待5秒 不需要進行圖片解析

新增封面

公眾號的這個新增封面比較複雜,目前我還沒找到它對應的input上傳tag。所以這個功能展示就沒實現。

原創宣告

一般來說,大家應該都是原創的。

所以原創宣告這個功能我實現了。

首先我們需要點選原創這個label:

        original_statement = driver.find_element(By.ID, 'js_original')
        original_statement.click()

然後在彈出的對話方塊中點選確認按鈕:

        ## 點選確認按鈕
        confirm_button = driver.find_element(By.XPATH, '//div[@class="weui-desktop-dialog"]//div[@class="weui-desktop-btn_wrp"]//button[contains(text(), "確定")]')
        confirm_button.click()

開啟讚賞

只有宣告原創之後才能開啟讚賞。

所以我們把讚賞放在和原創宣告一起。

同樣的,讚賞需要點選讚賞的按鈕,這裡可以透過id來獲得:

        # 讚賞
        zhanshang_button = driver.find_element(By.ID, 'js_reward_setting_area')
        zhanshang_button.click()

然後在彈出的對話方塊中,點選確認按鈕:

        ## 點選確認按鈕
        confirm_button = driver.find_element(By.XPATH, '//div[@class="reward-setting-dialog__footer"]//div[@class="weui-desktop-btn_wrp"]//button[contains(text(), "確定")]')
        confirm_button.click()

設定合集

然後需要設定的應該就是合集了。

合集我們需要先找到合集的可以點選的區域:

image-20240519130700907

        tag_button = driver.find_element(By.XPATH, '//div[@id="js_article_tags_area"]//div[contains(@class,"js_article_tags_label")]/span[text()="未新增"]')
        ActionChains(driver).move_to_element(tag_button).perform()
        time.sleep(1)
        ActionChains(driver).click(tag_button).perform()
        time.sleep(1)

這裡不能用tag_button.click方法,會直接報錯。

所以我們可以用ActionChains來模擬滑鼠的點選操作。

在彈出框中,我們找到tag input,一個個輸入,然後點選回車:

        # 輸入標籤
        tag_input = driver.find_element(By.XPATH,
                                        '//span[@class="weui-desktop-form-tag__area"]//input[@placeholder="輸入後按回車分割"]')
        for tag in tags:
            tag_input.send_keys(tag)
            time.sleep(1)
            tag_input.send_keys(Keys.ENTER)
            time.sleep(1)

最後,點選確認按鈕:

# 點選確定按鈕
        confirm_button = driver.find_element(By.XPATH, '//div[@class="weui-desktop-btn_wrp"]//button[contains(text(), "確定")]')
        confirm_button.click()

最後的釋出

好了,終於到了最後的釋出時候了,找到按鈕點選即可:

confirm_button = driver.find_element(By.ID, 'js_send')
confirm_button.click()

在彈出框中再點一次確認:

send_button = driver.find_element(By.XPATH, '//div[@class="weui-desktop-btn_wrp"]/button[text()="發表"]')
send_button.click()

總結

公眾號的基本功能完成了,實際上還有一些細節內容並沒有實現。因為我覺得通常情況下沒啥用。

大家如果有需要的話,可以告訴我。

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

相關文章