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

cnblogs和其他的博客平臺相比會比較複雜,需要設置的項目也比較多一些,弄懂了cnblogs的實現方式,那麼你應該對selenium的整個框架使用已經爛熟於心了。

除了正常的標題,內容,摘要之外,cnblogs還需要設置個人分類,合集,投稿選項,投稿至網站分類,tags標籤等內容。

要填的東西比較多,比較複雜。接下來我們會一項項的介紹cnblogs的具體實現方式。

前提條件

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

cnblogs的實現

因爲需要設置個人分類,合集,投稿選項,投稿至網站分類,tags標籤等內容,所以我們需要在配置文件中提供這些內容。

配置文件在config/cnblogs.yaml中。

首先是個人分類和合集部分:

# 個人分類  工具技巧 AIGC
categories:
  - 工具技巧

# 添加到合集: 工具技巧 AIGC
collections:
  - 工具技巧

這兩個部分都是需要你自己提前在cnblogs中創建好的。否則你會找不到這些內容,對應的界面地址如下:

image-20240507171326499

接下來是投顧至網站分類:

image-20240507171845646

cnblogs的這些網站分類是直接用文字來說明的,所以我們需要在配置文件中再定義一個網站分類:

topic: 開源研究

最後就是tag標籤了,我們直接設置即可:

tags:
  - 人工智能
  - aigc
  - openai
  - ai開發
  - 程序那些事

image-20240507172029658

文章標題

不得不說cnblogs的實現就是正規,cnblogs幾乎每個輸入的標籤都是帶有ID的,所以我們實現起來特別的簡單,這裏要給cnblogs點個贊。

    # 文章標題
    title = driver.find_element(By.ID, 'post-title')
    title.clear()
    if 'title' in front_matter['title'] and front_matter['title']:
        title.send_keys(front_matter['title'])
    else:
        title.send_keys(common_config['title'])
    time.sleep(2)  # 等待2秒

我們找到ID,直接調用send_keys方法即可。

文章內容

cnblogs的文章內容是一個textarea,也是帶有ID的,所以我們直接根據ID獲取即可:

    # 文章內容
    file_content = read_file_with_footer(common_config['content'])
    content = driver.find_element(By.ID, 'md-editor')
    content.send_keys(file_content)
    time.sleep(5)  # 等待5秒

頁面滾動

如果你觀察cnblogs的頁面,可以看到文章內容之後已經佔滿了整個屏幕,如果我們還需要繼續處理後面的內容的話,就需要對頁面進行一個滾動操作。

這裏我們借用了ActionChains的scroll to element方法。

首先我們找到最下面的發佈按鈕,然後直接滾動到這個發佈按鈕即可。

    # 滾輪滾到最下面的位置
    submit_button = driver.find_element(By.XPATH, '//button[@data-el-locator="publishBtn"]')
    ActionChains(driver) \
        .scroll_to_element(submit_button) \
        .perform()
    time.sleep(1)

個人分類

個人分類是一個下拉框。

image-20240507173020475

他有一個比較特別的tag name叫做cnb-post-category-select。

所以我們可以通過這個tag name找到這個元素,然後點擊他。

因爲所有的要選擇的元素都是在cnb-post-category-select這個tag內部的,所以我們調用post_category_select.find_element來查找它內部的input元素。

找到之後,我們輸入個人分類,然後從下拉框中選擇對應的個人分類tag,然後點擊回車。

所有的個人分類都選擇完畢之後,我們再次點擊post_category_select,以關閉下拉框。

對應的代碼如下:

    # 個人分類
    categories = cnblogs_config['categories']
    if categories:
        post_category_select = driver.find_element(By.TAG_NAME, 'cnb-post-category-select')
        post_category_select.click()
        for category in categories:
            category_search = post_category_select.find_element(By.XPATH, '//nz-select-search/input')
            category_search.send_keys(category)
            time.sleep(1)
            category_select = post_category_select.find_element(By.XPATH, f'//nz-tree-node-title[contains(@title, "{category}")]/div')
            category_select.click()
            time.sleep(0.5)
        post_category_select.click()
    time.sleep(2)

添加到合集

添加到合集的實現方式跟個人分類有些類似。

image-20240507173806856

默認情況下,添加到合集這個選項中的內容是隱藏的,所以我們需要首先點擊這個選項頭,讓對應的選項露出來。

這裏可以通過name來獲取到這個元素。然後點擊。

接下來就是通過text屬性來查找collection_select中要選擇的合集元素,然後點擊他們。

注意,這裏如果選擇的是包含合集文字的span,如下所示。這個span是不可被點擊的。

所以我們的解決辦法就是找到它的父元素。

通過: collection_item.find_element(By.XPATH, '..') 來實現。

然後點擊他的父元素即可。

image-20240507174113523

最終的實現代碼如下:

    # 添加到合集
    collections = cnblogs_config['collections']
    if collections:
        collection_select = driver.find_element(By.NAME, '添加到合集')
        collection_select.click()
        # print(collection_select.get_attribute('innerHTML'))
        for collection in collections:
            collection_item = collection_select.find_element(By.XPATH, f'//span[contains(@class,"item__text") and contains(text(), "{collection}")]')
            parent_element = collection_item.find_element(By.XPATH, '..')
            # print(parent_element.tag_name)
            parent_element.click()
            time.sleep(0.5)
    time.sleep(2)

投稿選項

投稿選項比較簡單,直接通過ID選擇即可:

    # 投稿選項
    post_type = driver.find_element(By.ID, 'site-publish-site-home')
    post_type.click()
    time.sleep(2)

投顧至網站分類

網站分類的ID就是分類的名字,所以,我們可以下面代碼來實現:

    # 投顧至網站分類
    topic = cnblogs_config['topic']
    if topic:
        post_type_detail = driver.find_element(By.NAME, '投稿至網站分類')
        post_type_detail.click()
        topic_item = driver.find_element(By.ID, topic)
        topic_item.click()
    time.sleep(2)

摘要

摘要也是通過ID來獲取的,代碼如下:

    # 摘要
    summary = common_config['summary']
    summary_item = driver.find_element(By.ID, 'summary')
    summary_item.send_keys(summary)
    time.sleep(2)

tag標籤

tag標籤是一個輸入框。所以我們先定位到這個輸入框,然後輸入tag,等待網站的tag列表出來之後,直接回車即可。

實現代碼如下:

    # tag標籤
    tags = cnblogs_config['tags']
    if tags:
        tag_item = driver.find_element(By.ID, 'tags')
        tag_item.click()
        for tag in tags:
            tag_input = tag_item.find_element(By.TAG_NAME, 'input')
            tag_input.send_keys(tag)
            time.sleep(1)
            tag_input.send_keys(Keys.ENTER)
    time.sleep(2)

提交文章

最後就是提交文章啦,這個提交按鈕需要根據xpath來獲取:

    # 提交文章
    if auto_publish:
        submit_button = driver.find_element(By.XPATH, '//button[@data-el-locator="publishBtn"]')
        submit_button.click()

總結

cnblogs的實現還是比較規範的,主要就是各項內容會比較多一些,需要耗費一些時間來實現。

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

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