前言
之前写了一个简单的vim插件开发之helloworld插件,本文我们将介绍一个简单的实用示例:在vim下发osc的动弹。
如果你平时在vim下写代码,当你写的很累的时候,是不是很想休息一会,上osc发一条动弹,调节一下。但是来回切换浏览器和vim,是不是觉得很麻烦?如果能在vim中直接来条命令OscTweet [动弹内容]就能完成上述的工作,是不是觉得很cool。边写代码边发动弹,或者遇到啥问题及时拷贝一下相关代码并发到osc的动弹上面去。
很高兴的通知您,现在您可以做到了。
开发
插件github地址为:git@github.com:gschen/vim-plugin-oschina.git
之所以采用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来解决该问题,只要第一次登陆,后续的动弹就无需再登陆了。
插件使用方法
- 下载插件github.com/gschen/vim-…
- 替换osc.tweet.vim中的
YOUR USERNAME 为你的osc用户名
YOUR PASSWORD 为你的osc密码
- 保存文件并移动到~/.vim/plugin/下;
- 用vim打开任意的文件,输入命令
:OscTweet 动弹内容
总结
本文主要介绍了在vim中发osc动弹的小插件,时间仓促,有很多异常未处理,但是在网络正常情况下,在vim中发osc动弹是没有任何问题的。
累了,饿了,不管啥,都发个吧!
先上个图吧
引用
[1] www.crummy.com/software/Be…