好不容易寫好了一篇博客,現在想要把它發佈到各個平臺上供大家一起欣賞?
然後一個網站一個網站打開要發佈的博客站點,手動點創建文章,然後拷貝粘貼寫的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,也沒有封面圖片。就是博客內容對圖片識別效果不太好。