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:

所以我们可以直接使用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这个开源的在线代码编辑工具。

这个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秒

处理标签

标题,内容都有了,接下来就是标签处理了。

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

一键自动化博客发布工具,用过的人都说好(segmentfault篇)的更多相关文章

  1. BlogPublishTool - 博客发布工具

    BlogPublishTool - 博客发布工具 这是一个发布博客的工具.本博客使用本工具发布. 本工具源码已上传至github:https://github.com/ChildishChange/B ...

  2. Mac端博客发布工具推荐

    引子 推荐一款好用的 Mac 端博客发布工具. 下载地址 echo 博客对接 这里以cnblog为例.接入类型为metawebblog,access point可以在cnblog的设置最下边找到,然后 ...

  3. 多平台博客发布工具OpenWrite的使用

    1 介绍 OpenWrite官网 OpenWrite是一款便捷的多平台博客发布工具,可以在OpenWrite编写markdown文档,然后发布到其他博客平台,目前已经支持CSDN.SegmentFau ...

  4. 【转】如何使用离线博客发布工具发布CSDN的博客文章

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  5. 基于.NET Core开发的个人博客发布至CentOS小计

    早些时候,使用 .NET Framework 开发网站,只能部署在 Windows 服务器上面,近两年 .NET Core 如火如荼,乘此机会赶紧上车,最近将自己利用 .NET Core 开发的个人博 ...

  6. 使用metaweblog API实现通用博客发布 之 API测试

    使用metaweblog API实现通用博客发布 之 API测试 使用博客比较少,一则是文笔有限,怕写出的东西狗屁不通,有碍观瞻, 二则是懒,很讨厌要登录到网站上写东西,也没有那么多时间(借口).个人 ...

  7. 用Python编写博客导出工具

    用Python编写博客导出工具 罗朝辉 (http://kesalin.github.io/) CC 许可,转载请注明出处   写在前面的话 我在 github 上用 octopress 搭建了个人博 ...

  8. 使用Office-Word的博客发布功能(测试博文)

    本人打算在博客园开博,但平时收集和整理资料都在OneNote中,又不想在写博客时还要进行复制粘贴操作,于是就想到了Microsoft Office自带的博客发布功能.在此做了一下测试,发布了此博文. ...

  9. longblogV1.0——我的静态博客发布系统

    longblogV1.0——我的静态博客发布系统 环境依赖: python3-markdown 作者:IT小小龙个人主页:http://long_python.gitcafe.com/电子邮箱:lon ...

  10. 修改vscode caipeiyu.writeCnblog ,简化博客发布

    修改vscode caipeiyu.writeCnblog ,简化博客发布 1. 安装caipeiyu.writeCnblog vscode的博客园文章发布插件WriteCnblog : https: ...

随机推荐

  1. GIT版本控制学习博客

    GIT版本控制学习博客 环境部署 下载git版本控制即可. 用户配置 (1)设置用户及地址 git config --global user.name "Username" git ...

  2. 小师妹学JavaIO之:文件编码和字符集Unicode

    目录 简介 使用Properties读取文件 乱码初现 字符集和文件编码 解决Properties中的乱码 真.终极解决办法 总结 简介 小师妹一时兴起,使用了一项从来都没用过的新技能,没想却出现了一 ...

  3. RabbitMQ 05 直连模式-Spring Boot操作

    Spring Boot集成RabbitMQ是现在主流的操作RabbitMQ的方式. 官方文档:https://docs.spring.io/spring-amqp/docs/current/refer ...

  4. 报表格式太难?一文教你Excel融合分析

    Excel是我们最经常使用的处理报表工具了,尤其是金融行业更是需要天天和报表打交道.但是Excel有一个问题,如果面对的数据庞杂,则处理起来就会相当麻烦,当需要从多个数据源获取数据来制作一个报表时,这 ...

  5. Jenkins安装插件很慢的解决方法

    修改 Jenkins /  update  /  default.json  这个文件就可以了 修改内容 1. 把 " www.google.com "  改成  " h ...

  6. 【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(下)

    [中秋国庆不断更]HarmonyOS对通知类消息的管理与发布通知(下) 一.发布进度条类型通知 进度条通知也是常见的通知类型,主要应用于文件下载.事务处理进度显示.HarmonyOS提供了进度条模板, ...

  7. Hive 查看表/分区更新时间

    1.查看分区 hive> show partitions table_name; 2.查看分区更新时间 获取hdfs路径 hive> desc formatted table_name; ...

  8. css 中的BFC

    一.是什么 我们在页面布局的时候,经常出现以下情况: 这个元素高度怎么没了? 这两栏布局怎么没法自适应? 这两个元素的间距怎么有点奇怪的样子? ...... 归根究底是元素之间相互的影响,导致了意料之 ...

  9. 【GDKOI 2024 TG Day2】染色(set) 题解

    发现我们给一个点染上色后有: 我们称这是一个大小为 1 的十字. 进一步地,我们给这 5 个点再次染上色后有: 我们称这是一个大小为 2 的十字. 同理可得,我们给这 5 个点染上相同的大小为 2 的 ...

  10. 力扣32(java)-最长有效括号(困难)

    题目: 给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度. 示例 1: 输入:s = "(()"输出:2解释:最长有效括号子串是 &quo ...