前言
之前写了一个简单的vim插件开发之helloworld插件,本文我们将介绍一个简单的实用示例:在vim下发osc的动弹。
如果你平时在viim下写代码,当你写的很累的时候,是不是很想休息一会,上osc发一条动弹,调节一下。但是来回切换浏览器和vim,是不是觉得很麻烦?如果能在vim中直接来条命令OscTweet [动弹内容]就能完成上述的工作,是不是觉得很cool。边写代码边发动弹,或者遇到啥问题及时拷贝一下相关代码并发到osc的动弹上面去。
很高兴的通知您,现在您可以做到了。
开发
插件github地址为:git@github.com:gschen/vim-plugin-oschina.git
http://git.oschina.net/gschen-register/vim-plugin-oschina
之所以采用vim+python的方式进行开发,主要是python语法比较简洁,且类库比较多有些类库使用起来比较方便。还有一个重要的原因就是很多比较著名的插件都是使用python来开发的。
思路:vim中调用python模拟登录并发动弹;
下面的代码应该说明一些了,呵呵。
关于下述代码有几点需要说明的地方:
相关的http请求使用的是requests类库,这个大家可能比较陌生,但确实是个非常好的库,可能大家对urllib, urllib2等之类的比较熟悉,但urllib的库太ugly,使用起来非常的不方便,非常非常的不爽,不知道当初的api是怎么设计的;
html解析这块使用的是BeautifulSoup,做过java html解析的一定对Joup比较了解,这个你就当是python中的啥soup吧,不过这个库是真心好用啊;
hashlib库主要是用来加密解密的,因为osc的密码使用了sha1加密方式;
在做http请求的时候,要加上header:user-agent,另外tweet的时候需要加上referer。
注:由于使用了requests, BeautifulSoup库,如果你系统未安装,可通过如下命令安装:
easy_install requests, BeautifulSoup
"--------------------------------------- " vim plugin for oschina's tweet " Maintainer: justin <gschen.cn@gmail.com> " Last Updated: 04 June 2013 " Changes: " TODO: " v 0.1: " * first edition, just for fun "--------------------------------------- " check the vim supports python if !has('python') echo 'Error: Required vim compile with +python' finish endif " define your own command command! -nargs=1 OscTweet exec('py Oschina().tweet(<f-args>)') python << EOF import requests import hashlib from BeautifulSoup import BeautifulSoup username = "YOUR USERNAME" password = "YOUR PASSWORD" class Oschina: def __init__(self): self.login() def login(self): payload = {'email':username,'pwd':hashlib.sha1(password).hexdigest(),'save_login':'1'} headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 '} url = 'http://www.oschina.net/action/user/hash_login' s = requests.Session() r = s.post(url, data=payload, headers=headers) #print r.text print "login success!" self.session = s def tweet(self,msg): soup = self.getHomePage() userId, userCode = self.getUserIdAndCode(soup) url = 'http://my.oschina.net/action/tweet/pub' payload = {'user':userId, 'user_code':userCode, 'attachment':'0', 'msg':msg} headers={'user-agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 ','referer':'https://www.oschina.net/home/login?goto_page=http%3A%2F%2Fwww.oschina.net%2F'} r=self.session.post(url,data=payload,headers = headers) print r.text print "tweet success." def getHomePage(self): headers={'user-agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 ','referer':'https://www.oschina.net/home/login?goto_page=http%3A%2F%2Fwww.oschina.net%2F'} resp = self.session.get("http://my.oschina.net/gschen",headers=headers) soup = BeautifulSoup(resp.text) return soup def getUserIdAndCode(self,soup): userCode= soup('input', {'name':'user_code'})[0]['value'] userId= soup('input', {'name':'user'})[0]['value'] return userId, userCode EOF
注:上述代码有一些不足的地方,那就是每次动弹都需要重新登陆,这样就很影响速度和远程服务器,效率不高,后续会有一个改进的版本,将会使用vim buffer来解决该问题,只要第一次登陆,后续的动弹就无需再登陆了。
插件使用方法
- 下载插件https://github.com/gschen/vim-plugin-oschina
- 替换osc.tweet.vim中的
YOUR USERNAME 为你的osc用户名
YOUR PASSWORD 为你的osc密码
- 保存文件并移动到~/.vim/plugin/下;
- 用vim打开任意的文件,输入命令
:OscTweet 动弹内容
总结
本文主要介绍了在vim中发osc动弹的小插件,时间仓促,有很多异常未处理,但是在网络正常情况下,在vim中发osc动弹是没有任何问题的。
累了,饿了,不管啥,都发个吧!
先上个图吧
引用
[1] http://www.crummy.com/software/BeautifulSoup/
[2] http://docs.python-requests.org/en/latest/index.html
[3] http://docs.python.org/2/library/hashlib.html