CSDN应该是大家接触到最多的博客平台了,所以一款能够发布到CSDN的自动化工具还是非常有必要的。
今天给大家讲讲自动化CSDN博客发布的思路和一些问题的解决办法。
解决问题的思路一定是最重要的,知识是死的,问题是活的,如何在工作中解决遇到的问题是我们需要面临的大问题。
前提条件
前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools
CSDN的实现
csdn的文章编辑页面进入很简单,在你已经登录的情况下,直接访问https://editor.csdn.net/md/就可以进入他的博客发布页面了。
具体实现的代码在publisher/csdn_publisher.py中。
标题
csdn的标题部分,没有ID,也没有name,只有一个孤零零的input。
那么我们怎么找到这个元素呢?
一个常用的办法是通过xpath和placeholder来定位到这个input元素。
# 文章标题
title = driver.find_element(By.XPATH, '//div[contains(@class,"article-bar")]//input[contains(@placeholder,"请输入文章标题")]')
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) # 等待3秒
文章内容
csdn的文章内容部分也是动态变动的,不是一个固定的textarea,但是看了它的代码,用的也不是常见的CodeMirror,我猜应该是自己实现的一个动态编辑器。
不过没关系,万变不离其宗。
既然不用使用send_keys来添加内容,我们就是用复制和拷贝大法来实现这个功能。
# 文章内容 markdown版本
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="editor"]//div[@class="cledit-section"]')
content.click()
time.sleep(2)
# 模拟实际的粘贴操作
action_chains.key_down(cmd_ctrl).send_keys('v').key_up(cmd_ctrl).perform()
time.sleep(3) # 等待3秒
拷贝就是通用的流程了。
但是拷贝之前,我们需要先定位到拷贝的地址。