好不容易寫好了一篇部落格,現在想要把它釋出到各個平臺上供大家一起欣賞?
然後一個網站一個網站開啟要釋出的部落格站點,手動點建立文章,然後複製貼上寫的markdown檔案。
甚至有些網站還不支援markdown格式,你還需要對格式進行轉換。
每次重複這樣的機械化工作,完全就是浪費生命。
現在不需要了,給大家推薦一個一鍵自動化部落格釋出工具,完全的一鍵操作,讓你輕鬆告別手動釋出部落格的煩惱。
這個工具是什麼
這個工具的全稱叫做 blog-auto-publishing-tools部落格自動釋出工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools
在數字化時代,內容創作與傳播的速度與廣度對於個人或企業品牌的建設至關重要。然而,許多部落格作者和內容創作者在釋出內容時,面臨著跨平臺釋出的繁瑣與不便。每個平臺都有其獨特的釋出規則和操作流程,手動釋出不僅耗時耗力,而且容易因為重複勞動而出現錯誤。為了解決這一痛點,我開發了這款部落格自動釋出工具。
我的原則就是能自動的,絕不手動。
這款部落格自動釋出工具,旨在幫助使用者實現一鍵式多平臺釋出。
使用者只需在工具中編寫或匯入部落格內容,選擇想要釋出的平臺(如CSDN、簡書、掘金、知乎、頭條、51blog、騰訊雲、阿里雲等),點選發布按鈕,即可將內容快速推送到各個平臺。
只需要編寫好Markdown格式的部落格即可,同時能夠根據各平臺的規則自動調整格式,確保內容在不同平臺上的展示效果一致。
支援的部落格平臺
目前這個工具已經支援下面這些平臺:
- 支援簡書
- 支援cnblogs
- 支援alicloud
- 支援51cto
- 支援infoq
- 支援掘金
- 支援oschina
- 支援segmentfault
- 支援頭條
- 支援txcloud
- 支援知乎
應該已經覆蓋了絕大部分的平臺了。如果還有其他的平臺,大家可以留言給我。
工具的實現方式
這個工具本質上是基於selenium這個自動化框架實現的。
透過模擬人工的點選操作,可以完成絕大多數需要人手工才能完成的工作。解放大家的雙手。
另外這個自動化的實現方式有兩種,一種是在執行程式的過程中啟動一個瀏覽器。另外一種是依附到現有的瀏覽器上來操作現有瀏覽器的頁面。
本工具選擇的是依附到現有的瀏覽器上。
主要是因為有些部落格平臺需要用手機掃碼二維碼才能登入。比如阿里雲,騰訊雲等。所以在程式中很難模擬這種登入的過程。
為什麼不直接呼叫部落格平臺的發部落格的介面來實現?而是選擇頁面自動化這種實現方式?
因為部落格平臺的發部落格介面需要傳入很多資料,直接呼叫的話,很多內容是沒法考慮到的,比如:標籤,分類,封面等等。所以我覺得自動化工具幫大家填好內容了,大家只需要看一眼,點選發布就行了,這樣更加方便,如果要進行修改的話也更加靈活。
當然,如果大家真的有需要實現介面傳送,可以私信給我,我可以研究研究怎麼實現。
工具的缺點
當然,這個工具雖然有諸多優點,可以自動填充,傳送部落格。
但是實話實話,缺點還是有的。
總結一下:selenium有的缺點它都有。比如,封面圖片上傳目前沒法自動化,需要手動操作,或者不使用封面圖片。
怎麼使用
-
目前這個工具是基於chrome的,所以你需要先下載一個chrome。
-
然後就是下載和chrome配套的chrome Driver Chrome Driver。
-
chrome 以debug模式啟動
chrome --remote-debugging-port=9222
在命令列你會看到類似下面的內容:
DevTools listening on ws://127.0.0.1:9222/devtools/browser/d4d05dd2-5b74-4380-b02d-12baa123445
這行ws很重要,我們把它記下來。
- 修改配置檔案
修改config/common.yaml 裡面的內容:
# chrome driver地址
service_location: /Users/wayne/Downloads/work/chromedriver-mac-arm64/chromedriver
# chrome除錯地址
debugger_address: localhost:9222/devtools/browser/4aab2b8b-112c-48a3-ba38-12baa123445
把service_location和debugger_address修改為你自己本機的配置。
enable:
csdn: True
jianshu: True
juejin: True
segmentfault: True
oschina: True
cnblogs: True
zhihu: True
cto51: True
infoq: True
toutiao: True
alicloud: True
txcloud: True
這些按照你自己的需求開啟。
- 執行程式
執行open_all.py 可以自動開啟所有的部落格網站。
執行publish_all.py 可以自動釋出部落格內容。
切記,在釋出部落格之前,一定要先保證你的賬號是登入狀態,否則無法傳送部落格。
簡書的實現
接下來我們會從最簡單的簡書開始,講解一下具體的實現細節。
配置檔案
首先是配置檔案,這裡我用的是yaml格式的配置檔案。
裡面配置了service_location, debugger_address 這些非常重要的東西。
因為不同的部落格平臺可能有不同的配置。所以這裡我們為每個部落格平臺設定了一個單獨的配置檔案。
啟動瀏覽器
這裡使用的是append模式,append到當前開啟的瀏覽器上面。所以我們需要提前以debug模式開啟一個chrome瀏覽器。
這裡我們使用的chrome瀏覽器。
# 啟動瀏覽器驅動服務
service = Service(common_config['service_location'])
# Chrome 的除錯地址
debugger_address = common_config['debugger_address']
# 建立Chrome選項,重用現有的瀏覽器例項
options = Options()
options.page_load_strategy = 'normal' # 設定頁面載入策略為'normal' 預設值, 等待所有資源下載,
# options.page_load_strategy = 'eager' # 設定頁面載入策略為'eager' 預設值, 不等待資源下載,
# options.page_load_strategy = 'none' # 完全不會阻塞 WebDriver
options.add_experimental_option('debuggerAddress', debugger_address)
# 使用服務和選項初始化WebDriver
driver = webdriver.Chrome(service=service, options=options)
主要就是在啟動chrome的時候,需要選擇service和options。
釋出部落格
啟動好瀏覽器,接下來就可以釋出部落格了。
首先我們開啟簡書的首頁:
# 開啟新標籤頁並切換到新標籤頁
driver.switch_to.new_window('tab')
# 瀏覽器例項現在可以被重用,進行你的自動化操作
driver.get(jianshu_config['site'])
time.sleep(2) # 等待2秒
driver.switch_to.new_window
確保我們是在新的tab頁開啟的簡書首頁。透過呼叫driver.get方法,我們可以開啟簡書的首頁。
接下來就是需要點選寫文章按鈕。
要點選文章按鈕,首先需要找到這個按鈕。
怎麼找到它呢?
熟悉selenium的朋友一定知道怎麼用的,這裡我給不熟悉的朋友介紹一下,在chrome瀏覽器中找到要定位的元素,右鍵選擇檢查,就可以找到了。
# 寫文章按鈕
write_btn = driver.find_element(By.CLASS_NAME, 'write-btn')
write_btn.click()
time.sleep(2) # 等待3秒
這裡我們透過class name來查詢釋出文章的按鈕。
selenium中可以透過class,xpath,tag,id等型別進行元素的定位和查詢。
id是最簡的,因為id是全域性唯一的,你只需要找到對應id即可。
tag和class往往會有很多個,不是很好定位。這個時候就需要用到xpath定位了。
xpath定位很強大,但是也比較複雜,接下來我們會在實際的案例中進行總結。
點選寫文章,我們會跳轉到新的寫文章的介面,在簡書中,左邊是文集區,中間是文章區,右邊是釋出文章區:
接下我們要做的就是點選左邊的文集,然後點選中間的文章,最後在最右邊釋出文章。
在點選左邊的文集之前,需要先切換到最新開啟的tab頁面:
# 切換到新的tab
driver.switch_to.window(driver.window_handles[-1])
# 等待新標籤頁完成載入內容
wait.until(EC.text_to_be_present_in_element((By.TAG_NAME, 'li'), '日記本'))
然後我們做一個等待,等待日記本這幾個字出現再進行下面的操作。
接下來就是點選要選擇的文集:
# 找到要發表的文集
# 使用XPath表示式查詢元素
article_collection = jianshu_config['article_collection']
li_element = driver.find_element(By.XPATH, f'//li[@title="{article_collection}"]')
li_element.click()
time.sleep(2) # 等待3秒
這裡透過xpath來找到要發表的文集。
這裡的article_collection是寫在配置檔案裡面的,需要修改為你自己的文集,否則程式會報錯
點選新建文章按鈕:
# 點選新建文章按鈕
new_article_btn = driver.find_element(By.CLASS_NAME, 'fa-plus-circle')
new_article_btn.click()
time.sleep(2) # 等待3秒
找到文章內容,然後透過send_keys方法,把內容填寫到content裡面:
# 文章內容
content = driver.find_element(By.ID, 'arthur-editor')
file_content = read_file_with_footer(common_config['content'])
content.clear()
content.send_keys(file_content)
time.sleep(2) # 等待3秒
注意,這裡我單獨新增了一個footer內容,也就是自定義的文章尾部,方便大家做一些特殊的操作。
最後是找到文章的標題框:
# 文章標題
title = driver.find_element(locate_with(By.TAG_NAME, "input").above({By.ID: "arthur-editor"}))
title.clear()
title.send_keys(common_config['title'])
time.sleep(2) # 等待3秒
簡書的這個標題框不太好找,使用xpath很難定位,所以這裡使用了一個小技巧:
先定位到它附近的arthur-editor,然後呼叫selenium的above命令,找到在他上面的input tag。
這個定位非常巧妙,大家可以學習一下。
然後就是釋出按鈕了:
# 釋出按鈕
publish_button = driver.find_element(By.XPATH, '//a[@data-action="publicize"]')
publish_button.click()
是不是一切都做完了呢?
並不是。
如果你的markdown裡面有圖片的話,很可能出現異常,說是有圖片未上傳成功。
那麼我們需要定位到彈窗視窗的確定按鈕,再點選發布按鈕一次。
# 檢查彈窗
alert = wait.until(EC.text_to_be_present_in_element((By.XPATH, '//div[@role="document"]'), '有圖片未上傳成功'))
if alert:
ok_button = driver.find_element(locate_with(By.TAG_NAME, "button").near({By.XPATH: '//div[@role="document"]'}))
ok_button.click()
time.sleep(2)
print("Alert accepted")
# 重新發布一次
publish_button.click()
else:
print("No alert found")
總結
好了,自動釋出到簡書的任務就完成了。
總結一下,簡書其實還是比較簡單的,因為沒有各種tag,也沒有封面圖片。就是部落格內容對圖片識別效果不太好。
點我檢視更多精彩內容:www.flydean.com