我們已經學習了很多自動化的知識了,接下來讓我們看看在blog-auto-publishing-tools中是如何實現自動傳送博文到知乎的。
前提條件
前提條件當然是先下載 blog-auto-publishing-tools這個部落格自動釋出工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools
知乎的實現
知乎的欄位不是太多,算是中規中矩。但是有些實現還是需要一些技巧的。一起來看看吧。
設定標題
知乎的標題是一個textarea,可以看到知乎的textarea有class,placeholder這些屬性。class後面的那一長串是自動生成的。
所以可以使用的欄位就只有placeholder這個屬性了。
所以,我們可以這樣來定位標題欄位:
# 文章標題
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標籤,如下所示:
所以我們可以使用selenium的input上傳功能,來上傳封面。
封面資料可以寫到markdown檔案的YAML Front Matter中,如下所示:
具體的實現程式碼如下:
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