之前收到很多朋友的要求,說是需要一個公眾號的自動釋出工具。
現在,它來了。
前提條件
前提條件當然是先下載 blog-auto-publishing-tools這個部落格自動釋出工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools
公眾號的實現
因為公眾號每隔一段時間就會登入失效,所以在使用自動釋出公眾號之前,一定要確保你的公眾號是登入狀態。
否則沒辦法自動釋出公眾號訊息。
登入到首頁
如果你已經登入過公眾號,那麼可以直接訪問https://mp.weixin.qq.com/, 這樣會直接跳轉到公眾號的後臺釋出介面。
點選圖文訊息
到了首頁之後,我們就可以點選圖文訊息這個按鈕,開始我們的創作了。
公眾號的圖文訊息實現的比較複雜。我們只能透過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中,如下所示:
第二種就是在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:
說不上為什麼,但是總是感覺怪怪的。
不過沒關係,我們還是能夠實現。
當然,這種就不能像傳統方式那樣來設定內容了。
我們只能使用複製貼上的方式。
另外,微信公眾號不能識別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()
設定合集
然後需要設定的應該就是合集了。
合集我們需要先找到合集的可以點選的區域:
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