WoX is a launcher for Windows that simply works. It’s an alternative to Alfred and Launchy. You can call it Windows omni-eXecutor if you want a long name.
这是 WoX 官网的简介,作为一个 Windows 下开源的快速启动工具,虽然没有 Launchy 成熟稳定,但是可以方便地写插件这点还是挺值得一试的。到这里获取 WoX :getWoxGithub
WoX 的插件开发支持 C# 和 Python 3 ,本文以 Python 为基础开发几款小插件。
IPIP
WoX 有一个提供 ip138 的 ip 地址查询的插件,然而在我这似乎并不奏效,索性就借助 ipip.net 的免费 API 来重新开发一个用来快速查询IP信息的小插件。(P.S. ipip 的免费API仅支持每天1000次查询,不过对个人用户来说绝对够用了,此外这个免费 API 貌似不支持 IPV6 和域名查询,所以本插件对这两者也就不做考虑)
首先要定义一个 plugin.json 用来储存插件的相关信息和配置:
1 2 3 4 5 6 7 8 9 10 11 12
{ "ID":"92p6d94f-4e10-4dw4-b650-8c8aba1d7ace", "ActionKeyword":"ipi", "Name":"IPIP", "Description":"Get IP info from ipip.net", "Author":"Eason Yang", "Version":"0.0.1", "Language":"python", "Website":"https://easonyang.com", "ExecuteFileName":"ipip.py", "IcoPath":"Images\\icon.png" }
data = "Result:" url = "http://freeapi.ipip.net/" + query result = requests.get(url) for item in result.json(): data += " " + item
但是这个插件在实际使用中会在日志中报错,原因就在于 WoX 在匹配到用户输入的关键字后,就会调用对应的插件处理此后用户的每个输入,所以这些不完整 IP 格式的就造成了插件报错,所以加入正则改进一下(P.S. 鉴于目的并不真的要判断 IP 地址格式是否正确,所以就不写那个一长串的匹配 IP 的正则表达式了):
import requests import re import subprocess from wox import Wox, WoxAPI
classIpInfo(Wox): defquery(self, query): ifnot query: return"" ip = self.regex(query, '(\d{1,3}\.){3}\d') ifnot ip: return"" data = "Result:" url = "http://freeapi.ipip.net/" + ip result = requests.get(url) for item in result.json(): data += " " + item result = [{ "Title": "IPIP", "SubTitle": data, "IcoPath": "Image/app.png", "JsonRPCAction": {"method": "detail", "parameters": ["http://www.ipip.net/ip.html"], "dontHideAfterAction": False} }] if self.regex(query, "ping [\d\.]+"): ping = self.ping(ip) iflen(ping) != 0: for item in ping: result.append({ "Title": "Ping Result", "SubTitle": item, "IcoPath": "Images/app.png", "JsonRPCAction": {"method": "detail", "parameters": ["http://ping.chinaz.com"], "dontHideAfterAction": False} }) return result
defregex(self, query, condition): pattern = re.compile(condition) result = re.search(pattern, query) if result: return result.group() else: return""
defdetail(self, url): webbrowser.open(url)
defping(self, ip): ping = subprocess.Popen(["ping", ip], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) result = [] line_to_print = [1, 2, 3, 4, 5, 8, 10] for line_number, line inenumerate(ping.stdout.readlines()): if line_number in line_to_print: result.append(line.strip().decode('utf-8')) return result
if __name__ == "__main__": IpInfo()
这样就能输入 ipip+ip 来查询 IP 信息,也可以通过 ipip+ping+ip 来同时显示 IP 信息和 ping 的结果。
踩坑记录
缺少 requests 模块
1 2 3 4
2016-06-18 17:49:24.7948|ERROR|Wox.Core.Plugin.JsonRPCPlugin.Execute|Traceback (most recent call last): File "C:\Users\Eason Yang\AppData\Local\Wox\app-1.3.67\Plugins\Wox.Plugin.Ipip\ipip.py", line 8, in <module> import requests ImportError: No module named 'requests'
2016-06-18 19:01:47.7101|ERROR|Wox.Core.Plugin.JsonRPCPlugin.Execute|Traceback (most recent call last): File "C:\Users\Eason Yang\AppData\Roaming\Wox\Plugins\Hacker News-36f26938-4a86-4a14-b105-68124c769c99\main.py", line 6, in <module> from wox import Wox,WoxAPI ImportError: No module named 'wox'