一鍵自動化部落格釋出工具,用過的人都說好(簡書篇)

flydean發表於2024-04-30

好不容易寫好了一篇部落格,現在想要把它釋出到各個平臺上供大家一起欣賞?

然後一個網站一個網站開啟要釋出的部落格站點,手動點建立文章,然後複製貼上寫的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有的缺點它都有。比如,封面圖片上傳目前沒法自動化,需要手動操作,或者不使用封面圖片。

怎麼使用

  1. 目前這個工具是基於chrome的,所以你需要先下載一個chrome。

  2. 然後就是下載和chrome配套的chrome Driver Chrome Driver

  3. chrome 以debug模式啟動

chrome --remote-debugging-port=9222

在命令列你會看到類似下面的內容:

DevTools listening on ws://127.0.0.1:9222/devtools/browser/d4d05dd2-5b74-4380-b02d-12baa123445

這行ws很重要,我們把它記下來。

  1. 修改配置檔案

修改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

這些按照你自己的需求開啟。

  1. 執行程式

執行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來查詢釋出文章的按鈕。

image-20240429231837646

selenium中可以透過class,xpath,tag,id等型別進行元素的定位和查詢。

id是最簡的,因為id是全域性唯一的,你只需要找到對應id即可。

tag和class往往會有很多個,不是很好定位。這個時候就需要用到xpath定位了。

xpath定位很強大,但是也比較複雜,接下來我們會在實際的案例中進行總結。

點選寫文章,我們會跳轉到新的寫文章的介面,在簡書中,左邊是文集區,中間是文章區,右邊是釋出文章區:

image-20240429233421885

接下我們要做的就是點選左邊的文集,然後點選中間的文章,最後在最右邊釋出文章。

在點選左邊的文集之前,需要先切換到最新開啟的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。

image-20240429234936105

這個定位非常巧妙,大家可以學習一下。

然後就是釋出按鈕了:

    # 釋出按鈕
    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

相關文章