• 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); //是否发布
    
    

    五、鸣谢

    介绍页 Github Repo
    如何高效的编写与同步博客(二)- 快速发布到多个渠道 https://github.com/stulzq/BlogTools
    CommandLineParser https://github.com/commandlineparser/commandline
    MetaWeblogClient.Core https://github.com/chenxizhang/metaweblogclient.core
  • 相关阅读:
    在servlet中实现页面跳转
    我的jsp学习日记——001:@include(静态包含指令)和jsp:include(动态包含指令)的区别
    myEclipse中修改新建jsp文档的编码格式
    js判断一个图片是否已经存在于缓存中
    MyEclipse的JavaScript提示插件(JSEclipse)
    pku2051 Argus
    pku2084 Game of Connections
    pku2001 Shortest Prefixes
    pku2007 Scrambled Polygon
    pku2153 Rank List
  • 原文地址:https://www.cnblogs.com/ChildishChange/p/9378139.html
Copyright © 2020-2023  润新知