一键自动化博客发布工具,用过的人都说好(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/writetags:- 人工智能- 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/670179.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频剪辑入门:快速掌握AI智剪基本技巧,批量剪辑很简单

在数字媒体日益盛行的今天,视频剪辑已经成为了一个非常热门的技能。无论你是专业的视频制作人,还是业余的视频爱好者,掌握一些基本的视频剪辑技巧都是非常必要的。近年来,随着人工智能技术的发展,AI智剪工具也应运而生…

AI 不仅会画画,还能造车 | 最新快讯

本周的北京,正在上演一场深刻的变革。 汽车产业,这个曾经以工业制造为核心的行业,正迅速地被数字化浪潮所改变,汽车、电商、互联网、人工智能等领域的界限变得模糊。在这样的背景下,车企们纷纷开始打破传统&#xff0c…

C++之set/map相关实现

看着上面的图片,你可能对set和map的多样变化产生疑惑,下面我们就来详细讲解他们的区别以及实现 一.set/map 首先,在这里我们要声明,如果你对二叉搜索树一点都不了解的话,建议你先去将搜索二叉树学会再来学习这里的内…

【算法系列】栈

目录 leetcode题目 一、删除字符串中的所有相邻重复项 二、比较含退格的字符串 三、基本计算器 II 四、字符串解码 五、验证栈序列 六、有效的括号 七、最小栈 八、逆波兰表达式求值 九、用栈实现队列 十、用队列实现栈 leetcode题目 一、删除字符串中的所有相邻重…

普通组件的注册-局部注册和全局注册

目录 一、局部注册和全局注册-概述 二、局部注册的使用示例 三、全局注册的使用示例 一、局部注册和全局注册-概述 组件注册有两种方式: 局部注册:只能在注册的组件内使用。使用方法:创建.vue文件,在使用的组件内导入并注册。…

【教程】极简Python接入免费语音识别API

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,请不吝给个[点赞、收藏、关注]哦~ 安装库: pip install SpeechRecognition 使用方法: import speech_recognition as srr sr.Recognizer() harvard sr…

coherence的基本概念

考虑上面这个比较简化的系统: 多核,每个核有多个线程;多核间存在share memory;每个核的多个线程,都可以同时对share momory进行load & store;每个核有自己私有的data cache;多核间有share的…

谷歌搜索引擎seo套餐是怎样的?

在谷歌搜索引擎优化(SEO)套餐方面,你会发现服务提供商通常提供多样化的定制服务,旨在满足不同业务的独特需求,下面一些关键点,帮助理解一个典型的SEO服务套餐可能包括哪些内容: 具体目标&#x…

引领智算变革,九章云极DataCanvas公司激活油气行业新质生产力

近日,“2024中国石油石化企业信息技术交流大会暨油气产业数字化转型高峰论坛”在京成功举办,九章云极DataCanvas公司携“油气行业AI智算服务全栈解决方案”震撼亮相,为油气行业数智化转型和新质生产力发展提供领先的技术视角和前瞻实战经验分…

(22)采集微信通讯录详情面板-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙 出品 | CSDN(ID:lichao19897314) Q Q | 978124155 往期知识回顾 (1)C#开启探索微信自动化之路-微信UI自动化 (2)C#创建微信窗体自动化实例-微信UI自动化 (3)C#针对系统热键管理-微信UI自动化 (4)C#采集微信通讯录…

MoonBit 开源之夏重磅来袭!12000元奖金等你来拿!

宣讲视频 MoonBit 开源之夏宣讲视频 关于我们 开源之夏 「开源之夏 (OSPP)」是中科院软件所「开源软件供应链点亮计划」指导下的系列暑期活动,旨在鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者,促进优秀开源软件社区…

OpenSSL实现AES-CBC加解密,可一次性加解密任意长度的明文字符串或字节流(QT C++环境)

本篇博文讲述如何在Qt C的环境中使用OpenSSL实现AES-CBC-Pkcs7加/解密,可以一次性加解密一个任意长度的明文字符串或者字节流,但不适合分段读取加解密的(例如,一个4GB的大型文件需要加解密,要分段读取,每次…