雖然頭條現在非常強大,但是我還是不得不吐槽一下頭條的部落格釋出,居然不支援markdown格式。
並且在某些瀏覽器上還會出現編輯頁面打不開的情況,讓我一度懷疑是我瀏覽器的問題。
不過,這都不重要,重要的是blog-auto-publishing-tools這個工具可以實現頭條的自動化。
前提條件
前提條件當然是先下載 blog-auto-publishing-tools這個部落格自動釋出工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools
頭條的實現
頭條需要填寫的內容也是挺多的。
我們接下來一個個來實現。
標題
雖然頭條的標題是一個textarea,但是沒有id或者name,所以我們只能透過placeholder來獲得這個標題:
# 文章標題
title = driver.find_element(By.XPATH, '//div[@class="publish-editor-title-inner"]//textarea[contains(@placeholder,"請輸入文章標題")]')
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'])
正文
頭條的正文用的也是ProseMirror,這是一個動態的文字編輯器,會隨著你輸入的內容動態更新html。所以不能用傳統的textArea的方式來實現。
在實現上我們可以使用複製貼上的方式來實現。
現在還剩一個大問題,就是頭條不支援markdown格式。
我們還需要考慮先把markdown格式轉換成html,然後直接複製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']
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秒
# 用tab定位,然後複製
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="publish-editor"]//div[@class="ProseMirror"]')
content_element.click()
time.sleep(1)
action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
time.sleep(3) # 等待3秒
解釋下實現的邏輯。
convert_md_to_html是把markdown轉換成了html。
get_html_web_content是在新的web tab中開啟這個html檔案,然後使用系統的複製功能把html內容複製到剪貼簿上。
然後再定位到要貼上的位置,使用系統的貼上功能把內容貼上到內容框中。
是不是很複雜?
標題設定
一般來說頭條會自動為我們設定標題。所以這裡就不選擇了。
展示封面
目前還沒看到頭條的封面上傳的input標籤,所以這個功能展示還沒實現。
大家就手動上傳封面吧~~~
摘要
摘要是一個textarea,我們根據placeholder來定位到這個元素:
summary_input = driver.find_element(By.XPATH, '//div[@class="multi-abstract-cell-content-input"]//textarea[contains(@placeholder,"好的摘要比標題更吸引讀者")]')
summary_input.send_keys(summary)
原創首發
當然,我們要設定成原創:
original_button = driver.find_element(By.XPATH, '//div[@class="original-tag"]//span[contains(text(),"宣告原創")]')
original_button.click()
time.sleep(2)
這裡用xpath定位,判斷text中是否包含宣告原創這幾個字。
最終釋出
最後就是最終的釋出按鈕了,我們透過class中是否包含publish-btn-last來判斷。
publish_button = driver.find_element(By.XPATH, '//div[contains(@class,"publish-btn-last")]')
publish_button.click()
總結
頭條頁面設計的基本上沒啥規範,所以獲取元素比較困難,大部分都是需要透過xpath來定位才行。
點我檢視更多精彩內容:www.flydean.com