用VIM写OSCHINA的博客

<p>前几天看了用《<a href="http://my.oschina.net/javayou/blog/39107">使用Live writter 在OSCHINA上写博客</a>》的文章,又看了站长@红薯的<a href="http://www.oschina.net/code/snippet_12_8206">接口程序</a>,真是 Lucky,支持xmlrpc。有不少插件支持wordpress的xmlrpc接口,想尝试着弄过去,就萌生了用VIM来写oschina博客的想法。 </p>php

<hr />html

<h1>VIM插件的选择</h1>java

<p>固然支持写blog的VIM插件不少,像<a href="http://www.vim.org/scripts/script.php?script_id=3510">vimrepress</a>,<a href="http://www.vim.org/scripts/script.php?script_id=1953">vimpress</a>等等。基本原理都是利用python的xmlrpclib实现客户端进行远程访问。最后我选择了<a href="http://www.vim.org/scripts/script.php?script_id=3532">ultrablog</a>。 </p>python

<h2>选择ultrablog缘由</h2>git

<p>由于很大啊,呵呵。ultrablog的主要由python写的,功能不少,支持本地数据库(sqlite),结构很不错,做为学习python的一个example,有消息说,VIM的做者打算在7.4的版本里完善python的支持。</p>github

<h2>要准备的工做</h2>sql

<p>之前是用SuSE来进行平常的工做,不过这回转到ubuntu上来了(SuSE装软件真是太痛苦了),固然系统不是必须的,任何VIM和PYTHON支持的系统都OK啦,硬性的要求有: </p>数据库

<ul> <li>VIM(+python), 这是选择ubuntu的主因啦,12.04(LTS)版恰好知足 </li> <li>SQLAlchemy 0.7+,这个主要是python的SQL库,用去进行SQLite访问的 </li> </ul>ubuntu

<p>其余可选的一些包: </p>vim

<ul> <li>python-markdown,用去作markdown到HTML的转化,推荐用python-markdown2. </li> <li>python-html2text, 正好和上一个相反 </li> <li>pandoc, 各类转换 </li> </ul>

<p>用apt-get很容易的安装这些: </p>

<pre><code>sudo apt-get install python-markdown </code></pre>

<p>python-markdown2要去下源码进行安装,比前一个版本,速度更快且修复了一些BUG, 以下: </p>

<pre><code>git clone https://github.com/trentm/python-markdown2.git cd python-markdown2 sudo python2 setup.py install </code></pre>

<h2>安装ultrablog.vim</h2>

<p>下载ultrablog,并解压到~/.vim/下,固然,能够用vunble等管理VIM插件,很少说了,我没有用,刚开始的时候没有使用,又对插件作了不少更改,也就没有移过去 </p>

<h2>配置</h2>

<p>在.vimrc中加入如下代码: </p>

<pre><code>let ub_blog = {'login_name':'BLOG-USER-NAME', \'password ':'USER-PASSWORD', \'url':'http://my.oschina.net/action/xmlrpc', \'db':'~/.vim/UltraBlog.db' } </code></pre>

<p>其中,用户名和密码就很少说了,第三个是xmlrpc的url(能在前那个几个文章里查到),db是SQLite的文件。由于密码是明文的,因此,注意安全,建议放到单独文件再source进去 </p>

<hr />

<h1>Debug</h1>

<p>OK, 都安装配置好了,能用么? No.还有很长很长的路要走...... </p>

<h2>根本连不上</h2>

<p>第一个错误就是连不服务,直接用python连没问题:</p>

<pre><code>handle=xmlrpclib.ServerProxy('http://my.oschina.net/action/xmlrpc') </code></pre>

<p>其实vimpress不用发生这个问题,由于ultrablog太智能了,他会把url加上'xmlrpc.php',可能这个对wordpress有用,不过对OSCHINA,呵呵! 更改ultrablog/util.py里面的 </p>

<pre><code>self.xmlrpc = self.url+'xmlrpc.php' </code></pre>

<p>成为: </p>

<pre><code>self.xmlrpc = self.url#+'xmlrpc.php' </code></pre>

<h2>getPost找不到服务器端的函数</h2>

<p>上一个问题更正以后,用命令: </p>

<pre><code>:UBList post remote 100 </code></pre>

<p>已经成功的列出服务器的全部文章,这个命令实际上调用了远端的函数: </p>

<pre><code>public Object getRecentPosts(String blogid, String username, String pwd, int numberOfPosts) </code></pre>

<p>实际上这个函数已经反回了Blog文章的全部东西,包括文章内容,可是ultrablog只用了postid及文章标题,多是wordpress只是返回id及标题吧,无论这个问题,继续下去,想要列出某一文章,问题发生了,‘can't find the remote server function: getPosts(int, String, String)’,相似的问题吧,记不太准确了。 由于python的变量太灵活了,postid是只有数字的字符串,在调用的过程当中被转化成int了,而remote server上的函数原型是: </p>

<pre><code>public Object getPost(String postid, String username, String pwd) </code></pre>

<p>因此,因为参数类型不对,远程访问失败。在这里作一些修正,即在远程调用时作了类型的强制转换: </p>

<pre><code>key = str(self.itemKey) remote_post = api.metaWeblog.getPost(key, cfg.loginName, cfg.password) </code></pre>

<h2>类型的灾难,xmlrpclib.py的错误</h2>

<p>一样仍是在调用getPost, 一样的地方,调用栈的最后几层简单的变了下,错误的内容大概是'int don't have the function: encode'。估计,python类型又在不知不觉中变了,大概是要调用String的encode函数,可是 这个对象被转成了‘int’。针对这一假设,更改下xmlrpclib.py来测试(有源代码就是好啊,想改就改,不知道这样改有没有问题...),果真是这样!!! 个人python的版本是2.7.3, xmlrpclib.py更改以下(line 183): </p>

<pre><code>return str(string).encode("ascii") </code></pre>

<p>即在出问题的string调用encode的时候作一次类型转化。纯数字的字符串还真是难搞...... <br /> Go on! 一样仍是只是艰难的走了几步,尚未走出getPost这个函数,不过幸运的是,远程调用有返回值了!错误的地方是数组访问越界,奇怪的错误,通常不会 发生啦,居然在通用的库里出这种错误, 抓包,打桩测试,原来getPost的返回,有两个类型不支持,致使了parse的错误,以至于parse dict的时候出了单数,key-value不成对了,因此...... 对xmlrpclib.py更改是在class Unmarshaller里加入对不支持的tag: </p>

<pre><code>dispatch["ex:nil"] = end_nil dispatch["ex:i8"] = end_int </code></pre>

<h2>图片上传的问题</h2>

<p>小小的不兼容问题,只是对图片的返回值作修正。上传Media的返回值只有url的dict,不作修正而还要须要file的dict。对返回值作处理:</p>

<pre><code>result = api.metaWeblog.newMediaObject('', cfg.loginName, cfg.password, dict(name=os.path.basename(file_path), type=file_type, bits=bin_data)) img_tmpl_info = ub_get_option('ub_tmpl_img_url', True) result['file'] = file_path img_url = img_tmpl_info['tmpl'] % result </code></pre>

<hr />

<h1>写在本篇的最后</h1>

<p>OK, 运行没问题,用VIM写下了这篇文章。上图: <img src="http://static.oschina.net/uploads/img/201305/14062215_9jw6.jpg" alt="/home/austin/Documents/screen.jpg" /></p>

相关文章
相关标签/搜索