一直热衷使用Markdown,使用了图床,以及多款的MD编辑器。

wp的后台太重了,又不想转 hexo + git ,对于文章上传至博客,总想办法折腾怎么上传wordprss。

之前的解决办法就是,直接将MD编辑器生成的html复制到wordpress中,也能得到比较好的效果。

前提是配置好了:

但每次还得复制、粘贴……今天总算想起要再折腾一下。

为知笔记

首先想到的,就是有一款为知笔记了。之前就一直了解到它既支持Markdown,又可以一键发布至博客。

不过一直使用的是印象,转移成本太高,就从来没有考虑过。

开始折腾!下载、注册,新建一个Markdown笔记,在右上角找到了分享中的这个按钮:

发布到博客

python-markdown自动发送wordpress文章(python-xmlrpc-wordpress)-半竹博客

大概配置了一下,还是比较简单;

  • 和之前的 windows live writer 一样,是通过 wprdpress 的 xmlrpc 的接口发布;

  • 其他可配置项还有分类、标签等等;

  • 未购买 VIP 之前,会在文件末尾加上为知的广告链接;

总结:

  • 生成 html 的效果还是很不错的;

  • 为知的 MD 格式和 HTML 格式是同一文档,MD 是使用 html 渲染,和其他 MD 软件相比打开太慢;

  • 有广告;

  • 为了一个小功能,要做众多转移,还是放弃吧;

进入正题:

python-markdown自动发送wordpress文章

在网上找到了一篇文章,是使用 python 的几个模块,自动将本地 .md 文件上传至 wordpress 博客;地址:http://www.pianshen.com/article/441310060/

所使用的 python 模块:

  • python-frontmatter:通过python-frontmatter库获取文章信息,标题、分类、标签、正文内容等

  • markdown2:通过markdown2库将正文内容转换成HTML格式

  • python-xmlrpc-wordpress:最后将这些信息通过python-wordpress-xmlrpc库发布到网站上

python-xmlrpc-wordpress 模块安装不上可以通过 git 地址安装;

一、使用方法

1、将三个 模块 安装完成;

2、将代码复制成一个文件 wp.py;

3、将 md 格式的文章放置在一个固定文件夹:如存储在 D/markdown/doc

4、将 wp.py 文件放置在 D/markdown 文件夹;

5、通过执行以下命令即可自动将写好的文章自动以送到wordpress博客:

# python  执行文件  上传文章md文件
python wp.py doc/20181222_test.md

二、更改

具体方法可以参考那篇文章,不过自己想记录的是自己的修改。

1、代码改正

原代码中有个单词错了,让我等小白找了一番才发现,将其改正,并整合在一起发上来。

将以下代码复制存储为一个 .py 文件即可:

#!python
# -*- coding:utf-8 -*-

# 1 导入模块 front matter
import sys
import frontmatter
# 2 导入模块 markdown2
import markdown2
from markdown2 import Markdown
# 3 导入模块  wordpress_xmlrpc
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts,NewPost


# 1 front matter
# 获得md文章路径信息
dir_md = sys.argv[1]
# 通过front matter.load函数加载读取文档里的信息
# 这里关于Python-front matter模块的各种函数使用方式GitHub都有说明,下面直接贴可实现的代码
post = frontmatter.load(dir_md)
# 将获取到的信息赋值给变量
post_title = post.metadata['title']
post_tag = post.metadata['tag']
post_category = post.metadata['category']
post_url = post.metadata['url']
# 通过print函数来看我们获取到信息状态,确定无误后这个步骤是不需要的
print(post_title)
print(post_tag)
print(post_category)
print(post_url)
print(post.content)


# 2 markdown2
# post.content里面是我们md格式的正文内容,现在转换成HTML格式
markdowner = Markdown()
post_content_html = markdowner.convert(post.content)
post_content_html = post_content_html.encode("utf-8")
# 现在print post_content_html看看,是不是HTML标签了
print(post_content_html)


# 3 wordpress_xmlrpc
wp = Client('http://www.95408.com/xmlrpc.php', '用户名', '密码')
# 现在就很简单了,通过下面的函数,将刚才获取到数据赋给对应的位置
post = WordPressPost()
post.title = post_title
# post.slug文章别名
# 我网站使用%post name%这种固定链接不想一长串,这里是最初md文章URL的参数,英文连字符格式
post.slug = post_url
post.content = post_content_html
# 分类和标签
post.terms_names = {
  'post_tag': post_tag,
  'category': post_category
    }
# post.post_status有publish发布、draft草稿、private隐私状态可选,默认草稿。如果是publish会直接发布
# post.post_status = 'publish'
# 推送文章到WordPress网站
wp.call(NewPost(post))
python-markdown自动发送wordpress文章(python-xmlrpc-wordpress)-半竹博客

2、代码块显示

试了一番,其他都是正常的,就是代码块显示不出来;

原来,默认的代码块并不是我们使用的 ```python 代码内容 ``` 这种三个符号,而是使用 tab 空四格的方式表示代码块;

python-markdown自动发送wordpress文章(python-xmlrpc-wordpress)-半竹博客

但是看了一翻,不会改,这就悲催了。

三、替代模块 markdown

查了一翻,除了作者推介的 python-markdown2 之外,还有一个使用者更多的版本 python-markdown ;

这个版本扩展性更好一点,虽然默认也是以 空格 为代码块的语法,但是可以增加一个代码块的扩展,就可以支持 ```python 代码内容 ``` 这种形式的代码块了。

1、安装模块

pip3 install markdown

2、修改代码

wp.py 文件中的模块及语法替换;

得到如下文件:

#!python
# -*- coding:utf-8 -*-

# 1 导入frontmatter模块
import sys
import frontmatter
# 2.1 导入markdown模块
import markdown
# 3 导入wordpress_xmlrpc模块
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts,NewPost

# 1 导入frontmatter模块
# 获得md文章路径信息
dir_md = sys.argv[1]
# 通过front matter.load函数加载读取文档里的信息
# 这里关于Python-front matter模块的各种函数使用方式GitHub都有说明,下面直接贴可实现的代码
post = frontmatter.load(dir_md)
# 将获取到的信息赋值给变量
post_title = post.metadata['title']
post_tag = post.metadata['tag']
post_category = post.metadata['category']
post_url = post.metadata['url']
# 通过print函数来看我们获取到信息状态,确定无误后这个步骤是不需要的
print(post_title)
print(post_tag)
print(post_category)
print(post_url)
print(post.content)

# 2.1 markdown库导入
post_content_html = markdown.markdown(post.content, extensions=['markdown.extensions.fenced_code'])
# post_content_html = markdown.markdown(post.content)
post_content_html = post_content_html.encode("utf-8")
print(post_content_html)

# 3 导入wordpress_xmlrpc模块
wp = Client('http://www.95408.com/xmlrpc.php', '用户名', '密码')
# 现在就很简单了,通过下面的函数,将刚才获取到数据赋给对应的位置
post = WordPressPost()
post.title = post_title
# post.slug文章别名
# 我网站使用%post name%这种固定链接不想一长串,这里是最初md文章URL的参数,英文连字符格式
post.slug = post_url
post.content = post_content_html
# 分类和标签
post.terms_names = {
  'post_tag': post_tag,
  'category': post_category
    }
# post.post_status有publish发布、draft草稿、private隐私状态可选,默认草稿。如果是publish会直接发布
post.post_status = 'publish'
# 推送文章到WordPress网站
wp.call(NewPost(post))

以上代码已经将 代码块的扩展文件包含在内:

extensions=['markdown.extensions.fenced_code']

3、其他(取消)

因为之前在设置js代码高亮时,自动增加了pre标签上语言属性,所以在这里就将语言属性删除了,留个记录:

文件路径:Python\Python36\Lib\site-packages\markdown\extensions\fenced_code.py

    # CODE_WRAP = '<pre><code%s>%s</code></pre>'
    CODE_WRAP = '<pre><code>%s</code></pre>'


    # code = self.CODE_WRAP % (lang, 
                        # self._escape(m.group('code')))
    code = self.CODE_WRAP % (
                         self._escape(m.group('code')))

以上。