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

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

現在,它來了。

前提條件

前提條件當然是先下載 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

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