BlogPublishTool - 博客发布工具
BlogPublishTool - 博客发布工具
这是一个发布博客的工具。本博客使用本工具发布。
本工具源码已上传至github:https://github.com/ChildishChange/BlogPublishTool
本工具主要参考了:如何高效的编写与同步博客(二)- 快速发布到多个渠道
一、痛点
最近实习,在给一个产品写教程博客,教程一共计划十篇博客。
平均每篇博客需要插入20+张图片,
同时博客之间有许多同一系列之间的链接,
并且我们需要在多个博客平台下发布博客(目前仅在cnblogs和csdn)上发布。
这就要求我们每次发布博客前手动上传20+次图片,
同时需要保持本地博客与平台上一致,
并且同一个平台上的系列博客之间的相互链接必须链接在原平台。
这些工作对一篇博客来说并不算很麻烦,但是当要维护的博客多了之后,这些工作手动完成是很麻烦的。
我相信其他发布过系列博客的博主也有这样的感受吧。
二、于是
于是在mentor的要求下,我完成了这样一个博客发布工具:BlogPublishTool
这是一个C#完成的控制台程序,有如下三个功能:
1.上传图片
注:该功能目前仅支持博客园博客。
在使用VS code编写Markdown文本时,图片引用一般是以路径或URL的形式链接的,这个工具可以将文本中所有以文件路径形式链接的图片上传,并用得到的URL替换原有的文件路径(需要登录博客园)。
使用时支持如下的命令格式:
//将路径下的.md文件/文件夹下所有.md文件中未上传的图片上传,路径支持绝对路径与相对路径
BlogPublishTool.exe uploadpic --input json_file/directory
//当带有--test时,仅列出路径下的.md文件/文件夹下所有.md文件中未上传的图片,不上传
BlogPubilshTool.exe uploadpic --input json_file/directory --test
2.替换链接
注:该功能目前仅支持博客园博客与CSDN博客。
当系列博客中的一篇需要引用系列中的其他博客时,仅需将链接写为:
即可,接下来只需要运行本工具,程序将从json文件中读取该博客在对应平台下的链接,并进行替换,可在不同平台上发布的多份文件。
使用时支持如下的命令格式:
//将路径下的.md文件/文件夹下所有.md文件中所有链接替换为json中的URL,并写回原文件,路径支持绝对路径与相对路径
BlogPublishTool.exe replace --input json_file/directory --config json_file_path
//将路径下的.md文件/文件夹下所有.md文件中所有链接替换为json中的URL,并写入指定的目录下,路径支持绝对路径与相对路径
BlogPublishTool.exe replace --input json_file/directory --output directory --config json_file_path
json从哪里来?请继续往下看。
3.发布博客
注:该功能目前仅支持博客园博客。
在系列博客的第一篇发布时,需要指定一个json文件,文件可以是空的。
在发布了第一篇之后,程序就会自动将发布信息写入json;之后再发布新博客同样也会将新的信息写入json。但如果发布之前发布的博客(即json中记录的博客),那么只会修改原博客,而不会发布新的。
使用时支持如下的命令格式:
//将路径下的.md文件/文件夹下所有.md文件发布至博客,并修改json文件
BlogPublishTool.exe publish --input json_file/directory --config json_file_path
json的格式如下:
[
{
"1.md":{
"title":"test-1",
"cnblogs":"https://www.cnblogs.com/ChildishChange/p/9372888.html",
"csdn":""
}
},
{
"2.md":{
"title":"test-2",
"cnblogs":"https://www.cnblogs.com/ChildishChange/p/9372972.html",
"csdn":""
}
}
]
但是,由于CSDN关闭了metaweblog接口,因此并不能发布到CSDN,也不能生成json中CSDN对应的内容,需要复制.md文件手动发布并添加进json。
三、设计思路
首先这个程序要解决三个痛点:
- 上传图片
- 替换链接
- 发布博客
因此,不难想到这个程序的运行流程:
命令 <= 解析命令()
switch(命令)
case uploadpic:上传图片(命令)
break
case replace: 替换链接(命令)
break
case publish: 发布博客(命令)
break
于是,不难想到这个程序需要以下三个模块:
- 命令行解析模块:用于解析命令行,获取参数
- 命令处理模块:根据命令与参数执行对应的操作
- 核心模块:获取命令行,调用命令行解析模块,根据解析结果调用命令处理模块
进一步分析:
- 上传图片、替换链接:都需要解析markdown中的特定文本并替换,最终写入到文件
- 上传图片、发布博客:都需要建立与博客服务器的连接
- 上传图片、替换链接、发布博客:都需要处理绝对路径与相对路径,都需要获取路径中的所有.md文件
把相似的功能放到一起,又多出三个模块:
- 路径处理模块:处理路径、获取.md文件
- Markdown处理模块:解析markdown特定文本、替换、写入文件
- 博客连接模块:登录博客、发布博客、修改博客
四、实现过程
在造轮子之前,先看看有没有轮子
于是我发现了这个项目:如何高效的编写与同步博客(二)- 快速发布到多个渠道
在查看了他的代码之后,我发现了一个用于连接博客服务器的Nuget包:MetaweblogClient.core
更进一步地,我找到了一个强大的解析命令行的Nuget包:Command Line Parser Library for CLR and NetStandard
于是,实现的难度大幅度降低了,这里主要讲两个部分,命令解析和博客连接部分,因为这两个部分使用了Nuget包。
1.命令解析部分
我使用了commandlineparser提供的verb功能,创建了三个类,分别代表上文提到的三种verb command:
[Verb("publish", HelpText = "Publish the blog file to the specified blog platform.")]
public class PublishOptions
{
//自定义参数,例如输入路径--input或者测试命令--test等等
}
[Verb("replace", HelpText = "Replace link of picture in the blog.")]
public class ReplaceOptions
{
//自定义参数
}
[Verb("uploadpic", HelpText = "Upload and replace picture with URL.")]
public class UploadPicOptions
{
//自定义参数
}
简单举几个verb command(即动词命令)的例子:
git add . //add 就是verb
git commit ... //commit 同理
git push //push 也是
定义好了不同的动词命令后,只需在main函数中调用命令行解析函数ParseArguments
即可,并支持将解析结果进行map操作:
//命令行解析
Parser.Default.ParseArguments<UploadPicOptions, ReplaceOptions, PublishOptions>(args)
.MapResult(
(UploadPicOptions opts)=> RunUploadPicOptions(opts),
(ReplaceOptions opts) => RunReplaceOptions(opts),
(PublishOptions opts) => RunPublishOptions(opts),
errs => 1);
2.博客处理部分
这部分调用了metaweblogclient.core提供的接口。
//建立博客连接所需的信息:
BlogConnectionInfo _connectionInfo = new BlogConnectionInfo(
BlogUrl, //例如我的博客园博客URL就是 http://www.cnblogs.com/ChildishChange/
MetaWeblogUrl, //同理,我的博客园的metaweblog地址是 https://rpc.cnblogs.com/metaweblog/ChildishChange/
blogId, //我的ID就是 ChildishChange
userName, //我的用户名还是 ChildishChange
passWord); //我的密码是******************
//建立连接
var blogClient = new Client(_connectionInfo);
//上传图片(其实这个接口是用于上传文件的)
var pictureUrl = blogClient.NewMediaObject(
picturePath, //文件路径
"image/jpeg", //文件类型
File.ReadAllBytes(pictureAbsPath)); //文件内容
//发布博客
var postId = blogClient.NewPost(
blogTitle, //博客标题
blogContent, //博客内容
new List<string> { "[Markdown]" }, //博客类别
true, //是否发布
DateTime.Now); //发布时间
//编辑博客
blogClient.EditPost(
postId, //post ID 比如本篇博客的postID就是:9378139
blogTitle, //博客标题
blogContent, //博客内容
new List<string> { "[Markdown]" }, //博客类别
true); //是否发布
五、鸣谢
BlogPublishTool - 博客发布工具的更多相关文章
- Mac端博客发布工具推荐
引子 推荐一款好用的 Mac 端博客发布工具. 下载地址 echo 博客对接 这里以cnblog为例.接入类型为metawebblog,access point可以在cnblog的设置最下边找到,然后 ...
- 多平台博客发布工具OpenWrite的使用
1 介绍 OpenWrite官网 OpenWrite是一款便捷的多平台博客发布工具,可以在OpenWrite编写markdown文档,然后发布到其他博客平台,目前已经支持CSDN.SegmentFau ...
- 【转】如何使用离线博客发布工具发布CSDN的博客文章
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- 基于.NET Core开发的个人博客发布至CentOS小计
早些时候,使用 .NET Framework 开发网站,只能部署在 Windows 服务器上面,近两年 .NET Core 如火如荼,乘此机会赶紧上车,最近将自己利用 .NET Core 开发的个人博 ...
- 使用metaweblog API实现通用博客发布 之 API测试
使用metaweblog API实现通用博客发布 之 API测试 使用博客比较少,一则是文笔有限,怕写出的东西狗屁不通,有碍观瞻, 二则是懒,很讨厌要登录到网站上写东西,也没有那么多时间(借口).个人 ...
- 用Python编写博客导出工具
用Python编写博客导出工具 罗朝辉 (http://kesalin.github.io/) CC 许可,转载请注明出处 写在前面的话 我在 github 上用 octopress 搭建了个人博 ...
- 使用Office-Word的博客发布功能(测试博文)
本人打算在博客园开博,但平时收集和整理资料都在OneNote中,又不想在写博客时还要进行复制粘贴操作,于是就想到了Microsoft Office自带的博客发布功能.在此做了一下测试,发布了此博文. ...
- longblogV1.0——我的静态博客发布系统
longblogV1.0——我的静态博客发布系统 环境依赖: python3-markdown 作者:IT小小龙个人主页:http://long_python.gitcafe.com/电子邮箱:lon ...
- 修改vscode caipeiyu.writeCnblog ,简化博客发布
修改vscode caipeiyu.writeCnblog ,简化博客发布 1. 安装caipeiyu.writeCnblog vscode的博客园文章发布插件WriteCnblog : https: ...
随机推荐
- Hash问题----Hash强碰撞
包含内容:hellowword,byeworld文件md5,pdf1,2的sha1值. 等待笔记...
- SDN期末作业——负载均衡
作业链接 期末作业 1.负载均衡程序 代码 2.演示视频 地址 3.小组分工 小组:incredible five 构建拓扑:俞鋆 编写程序:陈绍纬.周龙荣 程序调试和视频录制:陈辉.林德望 4.个人 ...
- leetcode 2. Add Two Numbers [java]
注意点: 最后的进位 (l1 == null || l1.next == null) break; public ListNode addTwoNumbers(ListNode l1, ListNod ...
- linux禁止非法用户试探登录
当我们的linux主机一旦暴露在互联网上,就会遭受到来自网络上的一些非法用户的骚扰.如弱口令扫描,试探性登录:这些行为对linux主机构成一定的威胁.那怎样防范此类的攻击了,这里写了一个脚本,功能就是 ...
- iptables设置规则
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 8080 -j ACCEPT 添加到最后一条iptables -I INPUT -p tcp --dpor ...
- Angular2学习笔记(1)——Hello World
1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之前主要使用的是jQuery,由于 ...
- Excel 怎样去掉单元格中的回车符号
1.同时按下 CTRL+H调出"查找---替换"对话框:2.在查找中输入:按住ALT ,小键盘输入 10 ,然后松开ALT:3.在替换中写入要替换的符号:这样就将回车符换成其他符号 ...
- Python基础5
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- 11.C++和C的区别,什么是面向对象
c++封装更好,调用接口,c调用子函数 1.首先C和C++在基础语句上没有太大区别,c++在c基础上改进,兼容大部分c的语法结构.c++面向对象,c面向过程. 2.新增new和delete的语法,引用 ...
- Android4.4 ContentResolver查询图片无效 及 图库删除 增加图片后,ContentResolver不更新的问题解决
问题背景: 参考链接 做了一个图片浏览,用ContentResolver扫描图库照片,且严格按照时间拍摄顺序排好序显示在listview里.如下图所示: 遇到的问题是在4.2的手机上能正常显示,但是新 ...