MetaWeblogApi for Hexo 开发纪录
为什么要开发MetaWeblogApi for hexo
- 讨厌每次都要敲命令行
- 想在任何地方编写文章并可以提交
- 喜欢编辑器沉浸式的编写体验
实现原理
participant 编辑器 as B
participant MetaWeblogApi as M
participant 博客Git地址 as A
participant 博客 as E
B->M: 发送Mardown格式的文本
note left of M: git pull
M->B: 返回BlogId确认提交成功
note right of M: 生成Hexo 的Markdown
M->A: 提交到
note right of M: 调用Hexo 生成
M->E: deploy 到博客地址
具体实现
外部访问Api实现部分
使用SpringBoot
- SpringMVC是目前Java最流行的框架
- Java是我本来的开发语言,趁手的才是最好的
- SpringBoot相对于原始的SpringMVC 更简单的配置
Metaweblog 的格式
Metaweblog的实现主要是参考这个开源项目,这个源码写得很直白,非常好懂。简单一点解释Metaweblog Api(后面简称M),和M对接的url其实只有一个,然后把访问不同的方法名封装在一个XML里面,通过解析这个xml,我们就能够知道这个请求到底需要访问什么方法。这个和我们一般的Api都不太一样,我在这个地方迷茫了好久。知道这个之后剩下的就是xml解析的问题了
使用Groovy XMLParser 解析xml
需要解析的xml
<?xml version="1.0"?>
<methodCall>
<methodName>blogger.getUsersBlogs</methodName>
<params>
<param>
<value>
<string></string>
</value>
</param>
<param>
<value>
<string>12</string>
</value>
</param>
<param>
<value>
<string>12</string>
</value>
</param>
</params>
</methodCall>
解析使用的groovy代码
methodCall = new XmlParser().parseText(text)
methodName = methodCall.methodName.text()
params = methodCall.params.param
mUserAccount = params[1].text()
mUserPassword = params[2].text()
使用groovy 解析的话就好像使用js一样,直接使用xml字段名就能获取到值,非常方便
Git的提交部分
JGit 是个Java实现的Git操作库,可以很方便的操作各种Git操作,我主要使用到以下几个方法
clone
mGit = Git.cloneRepository()
.setURI(url)
.setDirectory(new File(mGitConfig.repositoryLocation))
.setTransportConfigCallback(mTransportConfigCallback)
.setBranch('master')
.setCloneSubmodules(true)
.setTimeout(30000)
.call()
update
def git = git()
git.pull().setTransportConfigCallback(mTransportConfigCallback).call()
git.submoduleUpdate().call()
//如果不是干净的就合并
if (!git.status().call().clean) {
git.add().addFilepattern('.').call()
git.commit().setMessage(buildCommitMessage(git.status().call())).call()
push
def pushResult = git().push()
.setPushAll()
.setTransportConfigCallback(mTransportConfigCallback)
.call()
因为使用的
git
url 提交,需要ssh
key ,需要在~/.ssh/
生成密钥
调用Hexo 部分
我重新拓展了groovy String 中的execute,使得每次执行命令都在博客的目录下
String.metaClass.execute {
if (new File(mConfigBean.repositoryLocation).exists()){
delegate.execute(null,new File(mConfigBean.repositoryLocation))
}else{
delegate.execute(null,new File('/'))
}
}
但是我不建议这样做,这样写是方便了,但是会造成在别的地方执行execute会失败。建议是重新拓展一个方法。
因为使用groovy,我就可以这样执行hexo
的命令了
初始化hexo
'npm install '.execute().text
生成和推送
'hexo generate -d'.execute()
docker封装
Docker 这个过程最蛋疼!!
- nodejs 要安装6版本
- npm不需要安装了,安装node的时候附带了
贴出构建Docker的Dockerfile
FROM java:8u111-jdk
MAINTAINER <Hangox,liang.hanguang93@gmail.com>
RUN apt-get update -y --no-install-recommends
RUN apt-get install -y --no-install-recommends git-core curl
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get install -y --no-install-recommends nodejs
RUN npm install hexo-cli -g
COPY . /app
WORKDIR /app
RUN ./gradlew assemble
RUN mv build/libs/MetaweblogApi-1.0.jar app.jar
ENV GIT_NAME HexoMetaApi
ENV GIT_EMAIL your@email.com
ENV ACCOUNT account
ENV PASSWORD password
ENV REPOSITORY ''
#
#VOLUME ["root/.ssh", "/hexo"]
#EXPOSE 9000
CMD java -jar app.jar \
--blog.account=$ACCOUNT \
--blog.password=$PASSWORD \
--git.repository=$REPOSITORY \
--git.name=$GIT_NAME \
--git.email=$GIT_EMAIL
总结
SpringBoot 这个框架简化了很多SpringMVC的配置,搭配Groovy开发非常舒服。
Metaweblog api 的实现还在于很粗糙的程度,目前也只是实现了,newPost
和editPost
两个简单的操作,争取实现更多的操作。Docker构建的话,还是希望自己以后不要在智商掉线了。Docker的相关信息也是时候要总结一下了。