wox插件开发记录(python)

wox简介:Wox是一款启动器。用于快速搜索本机安装的各种程序,文件。也可以通过插件快速搜索网络内容,比如今天天气如何,某某电影的评分是多少等等。

wox项目github地址:https://github.com/Wox-launcher/Wox

本文记录使用python3为wox开发南京图书馆书籍查询插件过程。

环境搭建和设置

  • 环境需求:

    1. wox软件
    2. python3环境
  • wox设置python3路径:
    python_path

wox插件机制简介:

简单来说,Wox与插件之间通过标准输入输出的方式通信,使用JSONRPC来完成通信。使用这种方式,将极大的提高Wox支持的插件种类, 几乎任何语言都可以用来编写Wox插件。

下图展示了Wox与插件之间的通信原理:
wox_jsonrpc

摘抄自:http://doc.getwox.com/zh/plugin/create_plugin.html

创建python插件的步骤

  1. 创建plugin.json文件

    把plugin.json文件放置在插件的根目录

     {
       "ID":"D2D2C23B084D411DB66FE0C79D6C2A6H",   //插件ID,32位的UUID
       "ActionKeyword":"njlib",                   //插件默认的触发关键字
       "Name":"南京图书馆",                        //插件名字
       "Description":"南京图书馆书籍查询插件",      //插件介绍
       "Author":"JWang",                          //作者
       "Version":"1.0.0",                         //插件版本,必须是x.x.x的格式
       "Language":"python",                       //插件语言,目前支持csharp,python
       "Website":"http://www.getwox.com",         //插件网站或者个人网站
       "IcoPath": "Images\\opac.png",              //插件图标,路径是相对插件根目录的路径
       "ExecuteFileName":"main.py"   //执行文件入口,如果是C#插件则填写DLL路径,如果是pyhton则填写python文件路径
     }
  2. 创建python文件:

    跟json中ExecuteeFileName要一致

     #coding=utf-8
     '''
     南京图书馆查询接口
     '''
     import requests
     from bs4 import BeautifulSoup as bs
     import webbrowser
     from wox import Wox,WoxAPI
    
     #创建一个类,这个类必须继承自Wox,wox.py可以在wox的相关目录中找到,自行拷贝到当前脚本目录下即可。
     class NJlib(Wox): 
         '''南京图书馆图书查询'''
    
         def get_page(self,bname):
             headers = {'Host': 'opac.jslib.org.cn',
                        'Connection': 'keep-alive',
                        'Cache-Control': 'max-age=0',
                        'Upgrade-Insecure-Requests': 1,
                        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
                        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                        'Referer': 'http://www.jslib.org.cn/',
                        'Accept-Encoding': 'gzip, deflate, sdch',
                        'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4'
                        }
    
             urldate = {'func': 'find-m',
                        'find_base': 'njl01',
                        'adjacent': 'N',
                        'find_code': 'WRD',
                        'request': bname}
             page = requests.get('http://opac.jslib.org.cn/F/-', params=urldate, headers=headers)
             page.encoding = 'utf-8'
             return page.text
    
         #必须有一个query方法,用户执行查询的时候会自动调用query方法
         def query(self,query):
             page = self.get_page(query)
             s = bs(page,"html.parser")
             results = []
             for book in s.find_all(attrs={'class': 'items'}):
                 # 获取书名
                 bname = book.find(attrs={'class': 'itemtitle'}).a.get_text()
                 burl = book.find(attrs={'class':'itemtitle'}).a.get('href')
                 binfo = book.find(attrs={'class': 'libs'}).a.get_text()
                 results.append({
                     "Title": bname,
                     "SubTitle": binfo,
                     "IcoPath": "Images/opac.png",
                     "JsonRPCAction": {
                         #自定义方法,表示当用户点击查询结果之后执行的操作(打开浏览器、拷贝到粘贴板等),可使用wox自带的方法,具体可查看wox.py文件
                         "method": "openUrl",
                         ##参数必须以数组的形式传过去
                         "parameters": [burl],
                         #是否隐藏窗口
                         "dontHideAfterAction": False
                     }
                 })
             if len(results) != 0:
                 #查询结果为空时处理方式
                 return results
             else:
                 #查询结果不为空时处理结果
                 return [{
                     "Title": "未找到相关书籍",
                     "SubTitle": "可自行网站查找",
                     "IcoPath": "Images/opac.png",
                     "JsonRPCAction": {
                         "method": 'openUrl',
                         "parameters": ["http://opac.jslib.org.cn/F/-"],
                         "dontHideAfterAction": False
                     }
                 }]
    
         def openUrl(self,url):
             webbrowser.open(url)
             WoxAPI.change_query("")
    
     if __name__=='__main__':
         NJlib()

至此,一个南京图书馆书籍查询插件就完成了,可以在执行python脚本的时候添加"{\"method\":\"query\",\"parameters\":[\"传递给脚本的参数\"]}"参数来测试脚本的可用性,效果如下:

<岛上书屋>书籍查询
>>python main.py "{\"method\":\"query\",\"parameters\":[\"岛上书屋\"]}"
{"result": [{"JsonRPCAction": {"parameters": ["http://opac.jslib.org.cn/F/-"], "dontHideAfterAction": false, "method": "openUrl"}, "SubTitle": "\u53ef
"Images/opac.png", "Title": "\u672a\u627e\u5230\u76f8\u5173\u4e66\u7c4d"}]}

<白夜行>书籍查询
>python main.py "{\"method\":\"query\",\"parameters\":[\"白夜行\"]}"
{"result": [{"SubTitle": "\u9986\u85cf\u590d\u672c:    17\uff0c\u5df2\u51fa\u501f\u590d\u672c:    14", "Title": "\u767d\u591c\u884c", "JsonRPCAction": {"dontHideAfterAction": false, "parameters": ["ht
tp://opac.jslib.org.cn:80/F/HM1GG6VEDEKMQG9TYPLKE2XSD6YT4PFRX65Y8F6XTVUPA64NQM-30347?func=full-set-set&set_number=012885&set_entry=000001&format=999"], "method": "openUrl"}, "IcoPath": "Images/opac.pn
g"}, {"SubTitle": "\u9986\u85cf\u590d\u672c:     3\uff0c\u5df2\u51fa\u501f\u590d\u672c:     0", "Title": "\u591c\u884c\u5217\u8f66", "JsonRPCAction": {"dontHideAfterAction": false, "parameters": ["htt
p://opac.jslib.org.cn:80/F/HM1GG6VEDEKMQG9TYPLKE2XSD6YT4PFRX65Y8F6XTVUPA64NQM-30356?func=full-set-set&set_number=012885&set_entry=000002&format=999"], "method": "openUrl"}, "IcoPath": "Images/opac.png
"}, {"SubTitle": "\u9986\u85cf\u590d\u672c:     1\uff0c\u5df2\u51fa\u501f\u590d\u672c:     0", "Title": "\u767d\u591c\u884c", "JsonRPCAction": {"dontHideAfterAction": false, "parameters": ["http://opa
c.jslib.org.cn:80/F/HM1GG6VEDEKMQG9TYPLKE2XSD6YT4PFRX65Y8F6XTVUPA64NQM-30363?func=full-set-set&set_number=012885&set_entry=000003&format=999"], "method": "openUrl"}, "IcoPath": "Images/opac.png"}]}

创建完插件之后,你可以将插件拷贝到\Plugins\并重启Wox,同时你也可以将插件上传到Wox Plugin库, 这样其他用户就行安装你写的插件了。

相关参考地址:
wox官方帮助文档:http://doc.getwox.com/zh/
https://eason-yang.com/2016/06/19/use-python-to-build-a-wox-plugin/

发表评论

电子邮件地址不会被公开。 必填项已用*标注