一鍵自動化博客發佈工具,用過的人都說好(segmentfault篇)

segmentfault是我在這些平臺中看過界面最爲簡潔的博客平臺了。

今天就以segmentfault爲例,講講在blog-auto-publishing-tools中的實現原理。

前提條件

前提條件當然是先下載 blog-auto-publishing-tools這個博客自動發佈工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools

segmentfault的實現

接下來我們手把手看看具體在segmentfault的自動化是如何實現的。

segmentfault的配置文件

在config目錄下面,你會找到一個segmentfault.yaml的文件,這個就是segmentfault的配置文件了。

內容很簡單,如下所示:

site: https://segmentfault.com/write

tags:
  - 人工智能
  - aigc
  - openai
  - ai開發

裏面主要是兩個內容,site是segmentfault的博客編寫頁面。

tags是你的博客的一些標籤,可以自行設置。

這裏要注意的是,segmentfault中的標籤並不能隨意寫,你需要選擇segmentfault中已有的標籤纔可以。

segmentfault的實現邏輯

所有的發佈器都在publisher目錄下,在下面你可以找到segmentfault_publisher這個專門給segmentfault的發佈器。

首先我們需要打開新的tab,然後切換到segmentfault的博客發佈頁面:

    # 打開新標籤頁並切換到新標籤頁
    driver.switch_to.new_window('tab')
    # 瀏覽器實例現在可以被重用,進行你的自動化操作
    driver.get(segmentfault_config['site'])
    time.sleep(2)  # 等待2秒

處理標題

進入發佈頁面,我們看看頁面的一些結構,首先是標題。

標題比較簡單,自帶了ID:

image-20240506104029630

所以我們可以直接使用find_element by ID直接獲得title的input,然後調用send_keys方法,把title的內容輸入進去。

如下所示:

    # 文章標題
    title = driver.find_element(By.ID, 'title')
    title.clear()
    title.send_keys(common_config['title'])
    time.sleep(2)  # 等待3秒

處理內容

接下來我們看看內容這一塊。如果進入調試模式,你會看到segmentfault的內容部分不是一個簡單的textarea,而是使用了CodeMirror這個開源的在線代碼編輯工具。

image-20240506104412339

這個CodeMirror的代碼內容是會隨着你的輸入不斷進行變化的。

那麼我們怎麼才能把鼠標定位到CodeMirror的代碼塊中進行內容輸入呢?

這裏我們有一個小技巧。

如果你進入segmentfault寫博客的首頁,你會發現鼠標默認是定位在『請輸入標題』這個標題欄的部分。

接下來如果我們連續輸入三次tab鍵,鼠標就會定位到CodeMirror內容編輯框了。

然後我們只需要使用複製粘貼功能,把markdown的內容粘貼到內容框即可完成內容的輸入。

以下是代碼實現:

    # 文章內容
    file_content = read_file_with_footer(common_config['content'])
    # segmentfault比較特殊,用的是CodeMirror,不能用元素賦值的方法,所以我們使用拷貝的方法
    cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
    # 將要粘貼的文本內容複製到剪貼板
    pyperclip.copy(file_content)
    # 三次tab按鈕,讓光標定位到內容窗口:
    action_chains = webdriver.ActionChains(driver)
    for i in range(3):
        action_chains.key_down(Keys.TAB).key_up(Keys.TAB).perform()
        time.sleep(1)

    # 模擬實際的粘貼操作
    action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
    time.sleep(3)  # 等待3秒

實際上在操作中,你會發現使用tab鍵定位之後,拷貝是拷貝不進去的。

所以上面的方法其實是不可行的。我們仍然需要定位到文章內容部分.....

我們仔細看看內容編輯部分,可以看到在CodeMirror-code下面有一個span的role=presentation,就它了,我們使用xpath來定位,代碼如下所示:

 # 文章內容
    file_content = read_file_with_footer(common_config['content'])
    # segmentfault比較特殊,用的是CodeMirror,不能用元素賦值的方法,所以我們使用拷貝的方法
    cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
    # 將要粘貼的文本內容複製到剪貼板
    pyperclip.copy(file_content)
    action_chains = webdriver.ActionChains(driver)
    # 三次tab按鈕,讓光標定位到內容窗口:
    for i in range(3):
        action_chains.key_down(Keys.TAB).key_up(Keys.TAB).perform()
        time.sleep(1)

    # 找到初始的內容描述文字
    content = driver.find_element(By.XPATH, '//div[@class="CodeMirror-code"]//span[@role="presentation"]')
    content.click()
    # 模擬實際的粘貼操作
    action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
    time.sleep(3)  # 等待3秒

處理標籤

標題,內容都有了,接下來就是標籤處理了。

image-20240506110505887

segmentfault的標籤處理邏輯:

  1. 點擊添加標籤按鈕
  2. 在搜索標籤框輸入要添加的標籤
  3. 回車即可。
  4. 如果有多個標籤,重複2-3這兩步。

所以我們可以得到下面的代碼:

    # 添加標籤
    tag_button = driver.find_element(By.ID, 'tags-toggle')
    tag_button.click()
    tag_input = driver.find_element(By.XPATH, '//input[@placeholder="搜索標籤"]')
    for tag in segmentfault_config['tags']:
        tag_input.send_keys(tag)
        tag_input.send_keys(Keys.ENTER)
        time.sleep(2)
    time.sleep(2)

點擊發布文章按鈕

點擊發布文章按鈕之後,會有一個下拉彈窗框,讓你選擇封面,文章類型,發佈到,定時發佈和註明版權這些東西。

發佈文章按鈕很簡單,直接根據ID查找即可:

    # 發佈按鈕
    publish_button = driver.find_element(By.ID, 'publish-toggle')
    publish_button.click()
    time.sleep(2)

設置封面

正常情況下設置封面需要點擊設置封面按鈕,然後從本地選擇一個封面圖片上傳。

這樣就比較麻煩了。我們直接從markdown的front matter中讀取imge的地址,上傳到網站上。

事實上,除了image之外,title,tags,description 都會優先從markdown的front matter中去會獲取。這樣就不用每次去修改配置文件了。

title: 一鍵自動化博客發佈工具,用過的人都說好(segmentfault篇)
authors: flydean
tags: [自動化工具,博客,自動發佈]
image: https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405061040404.png
description: 使用一鍵自動化博客發佈工具blog-auto-publishing-tools把博客發佈到segmentfault上。

上傳封面的代碼如下:

    # 設置封面
    if front_matter['image']:
        file_input = driver.find_element(By.XPATH, "//input[type='file']")
        file_input.send_keys(front_matter['image'])
        time.sleep(2)

設置版權

    # 版權
    copy_right = driver.find_element(By.ID, 'license')
    copy_right.click()
    time.sleep(2)

版權設置比較簡單,直接找到對應的ID即可。

最終發佈

最後找到發佈按鈕就可以發佈了。

    # 確認發佈
    if auto_publish:
        confirm_button = driver.find_element(By.ID, 'sureSubmitBtn')
        confirm_button.click()

點我查看更多精彩內容:www.flydean.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章