这是一个发布博客的工具。本博客使用本工具发布。 本工具源码已上传至github:https://github.com/ChildishChange/BlogPublishTool 本工具主要参考了:如何高效的编写与同步博客(二)- 快速发布到多个渠道 一、痛点最近实习,在给一个产品写教程博客,教程一共计划十篇博客。 平均每篇博客需要插入20+张图片, 这就要求我们每次发布博客前手动上传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 于是,不难想到这个程序需要以下三个模块:
进一步分析:
把相似的功能放到一起,又多出三个模块:
四、实现过程
于是我发现了这个项目:如何高效的编写与同步博客(二)- 快速发布到多个渠道 在查看了他的代码之后,我发现了一个用于连接博客服务器的Nuget包:MetaweblogClient.core 更进一步地,我找到了一个强大的解析命令行的Nuget包: 于是,实现的难度大幅度降低了,这里主要讲两个部分,命令解析和博客连接部分,因为这两个部分使用了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函数中调用命令行解析函数 //命令行解析 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); //是否发布 五、鸣谢 |
|
来自: 敦行斋 > 《Arithmus》