oschina和segmentfault一樣,界面非常的清爽。
界面上除了必須的標題,內容之外,還有文章專輯和推廣專區這幾個選項。
一起來看看在blog-auto-publishing-tools中,是如何實現自動發佈到oschina的吧。
前提條件
前提條件當然是先下載 blog-auto-publishing-tools這個博客自動發佈工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools
oschina的實現
接下來我們手把手看看具體在oschina的自動化是如何實現的。
oschina的配置文件
除了title和content之外,oschina還需要一個文章專輯和推廣專區:
所以我們的配置文件大概是這樣的:
site: https://my.oschina.net/flydean/blog/write
#專輯
collection: 程序那些事
#推廣專區:45 Llama中文社區
#44 ChatGPT
#43 非結構化數據
#28 大前端
#27 開發技能
#10 數據庫
#9 雲計算
#17 飛槳專區
#16 OpenHarmony專區
#19 開源治理
#46 銀河麒麟專區
#14 程序人生
#26 軟件架構
#15 行業趨勢
#11 硬件 & IoT
#8 AI & 大數據
#39 昇思MindSpore
#35 OpenVINO 中文社區
#42 摸魚專區
#41 OneOS
#40 華爲開發者聯盟
#38 PostgreSQL
#37 Linux基金會開源軟件大學
#36 OSCTraining
#34 EdgeX 中文社區
#31 鯤鵬專區
#30 openEuler
#25 信息安全
#24 運維
#23 軟件測試
#22 網絡技術
#21 遊戲開發
#20 多媒體處理
#13 DevOps
#6 區塊鏈
topic: 開發技能
其中collection是你自己創建的文章集合。
topic是oschina中自帶的topic,你只需要從中間選擇一個即可。
oschina的實現代碼
所有的發佈器都在publisher目錄下,在下面你可以找到oschina_publisher這個專門給oschina的發佈器。
首先我們需要打開新的tab,然後切換到oschina的博客發佈頁面:
填充文章內容
先看下頁面上文章內容的信息:
可以看到oschina使用的也是CodeMirror這個開源的代碼編輯工具。
這個工具不同於傳統的text或者textArea,他裏面的元素是隨着你的輸入動態變化的,所以這裏很難像傳統的頁面一樣直接使用send_keys來填充內容。
那麼我們怎麼向CodeMirror輸入內容呢?
既然send_keys不行,我們可以換一個思路,比如藉助系統自帶的複製和粘貼功能。
首先定位到內容的輸入位置,然後把要輸入的內容粘貼進去即可。
# 文章內容
file_content = read_file_with_footer(common_config['content'])
# 用的是CodeMirror,不能用元素賦值的方法,所以我們使用拷貝的方法
cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
# 將要粘貼的文本內容複製到剪貼板
pyperclip.copy(file_content)
action_chains = webdriver.ActionChains(driver)
# 找到初始的內容描述文字
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秒
定位元素,我們是找到CodeMirror-code class下面的role=presentation的span即可。
這裏,我們使用的是xpath定位。
然後使用ActionChains來模擬系統的粘貼操作。
填充文章的標題
標題部分比較簡單,他有一個name字段:
所以我們可以這樣來使用:
# 文章標題
title = driver.find_element(By.NAME, 'title')
title.clear()
title.send_keys(common_config['title'])
time.sleep(2) # 等待3秒
文章專輯
接下來,我們點擊發布文章按鈕之後,就會顯示一個彈出框。
這裏我們需要填入文章專輯。
文章專輯需要分兩步走。
第一步是點擊下拉框:
category_select = driver.find_element(By.XPATH, '//div[contains(@class, "selection dropdown catalog-select")]')
category_select.click()
這裏通過xpath來定位下拉框。
第二步是從下拉框選擇對應的文章專輯:
select_element = category_select.find_element(By.XPATH, f'//div[contains(text(), "{collection}")]')
select_element.click()
同樣的,我們使用xpath的contains來獲取到text中包含有要選擇專輯名字的列表。
推廣專區
推廣專區和文章專輯很類似,都是一個下拉框。
同樣的,我們先點擊下拉框:
topic_select = driver.find_element(By.XPATH, '//div[contains(@class, "selection dropdown groups")]')
topic_select.click()
然後選擇對應的推廣專區:
topic_item = topic_select.find_element(By.XPATH, f'//div[contains(text(), "{topic}")]')
topic_item.click()
發佈按鈕
最後一步,就可以點擊發布按鈕發佈了:
confirm_button = driver.find_element(By.XPATH, '//div[contains(@class,"submit button effective-button")]')
confirm_button.click()
總結
這樣我們對於oschina的自動發佈就完成了。oschina相對而言比較簡單,甚至沒有封面上傳:-)