查找 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 库来进行爬数据以及解析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 上。