查找 IP 归属地的 Alfred Workflow

作者 Shilei Tian 日期 2016-11-16
查找 IP 归属地的 Alfred Workflow

大家都知道,国内连接 Apple 的一些服务,会出现这样那样的问题,究其原因,还是 Apple 在国内的 CDN 做的太差劲。因此我一般采取的方式是从墙外的 VPS 上获取指定域名对应的 IP 地址,然后手动设置(利用 Surge)。

现在需要一个能够查 IP 归属地的工具,Popclip 有一款 extension,但是它每次查找完了都将结果复制到黏贴版,这个我不喜欢,另外 Popclip 只有选中文字后才能触发,功能有限。

年初购买了 Alfred Powerpack 的 Mega 版本,所以得物尽其用才行。利用 Workflow 中可以运行 Python 脚本,再配合前几天刚学会的 Python 爬数据,因此就自己写了一个 workflow。

大家有可能会奇怪,我的 IP 数据库从哪里来。这就是为什么上面我提到的用 Python 爬数据。有一个免费网站是 www.ip.cn,你可以用它来查找 IP 归属地。另外,它不是通过 Request API 来查询的,因此不需要形如 ipip.net 的付费 token。所以,归属地的查询结果完全是解析页面得到的。

代码分析

代码其实很简单,利用 requests 以及 BeautifulSoup 库来进行爬数据以及解析。

import requests
import alfred
from bs4 import BeautifulSoup
session = requests.Session()
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/602.3.10 (KHTML, like Gecko) Version/10.0.2 Safari/602.3.10",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
}
query = '{query}'
url = "http://www.ip.cn/index.php?ip=" + query
req = session.get(url, headers = headers)
bsObj = BeautifulSoup(req.text, "html.parser")
location = bsObj.find("div", {"class": "well"}).findAll("code")[1].get_text()
company = bsObj.find("div", {"class": "well"}).findAll("p")[3].get_text()
res = alfred.Item({'uid': 1, 'arg': url}, location, company)
results = []
results.append(res)
xml = alfred.xml(results)
alfred.write(xml)

最开始的时候我没有设置 Header,运行程序后返回的结果是 503,我猜测这个跟用户代理有关,因为 Python 默认的用户代理就是 Python,网站为了防止爬数据,就过滤了 Python 的用户代理。所以就需要自定义一下 User-Agent。

代码很简单,我这里就不解析了,workflow 文件已经上传到 GitHub 上。