3

Google IP 可用性检测脚本

 3 years ago
source link: https://blog.lilydjwg.me/2014/6/17/check-google-ip.48761.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Google IP 可用性检测脚本

本文来自依云's Blog,转载请注明。

需要 Python 3.4+,一个参数用来选择测试搜索服务还是 GAE 服务。测试 GAE 服务的话需要先修改开头的两个变量。从标准输入读取 IP 地址或者 IP 段(形如 192.168.0.0/16)列表,每行一个。可用 IP 输出到标准输出。实时测试结果输出到标准错误。50 线程并发。

checkgoogleip
#!/usr/bin/env python3
import sys
from ipaddress import IPv4Network
import http.client as client
from concurrent.futures import ThreadPoolExecutor
import argparse
import ssl
import socket
# 先按自己的情况修改以下几行
APP_ID = 'your_id_here'
APP_PATH = '/fetch.py'
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations('/etc/ssl/certs/ca-certificates.crt')
class HTTPSConnection(client.HTTPSConnection):
def __init__(self, *args, hostname=None, **kwargs):
self._hostname = hostname
super().__init__(*args, **kwargs)
def connect(self):
super(client.HTTPSConnection, self).connect()
if self._tunnel_host:
server_hostname = self._tunnel_host
else:
server_hostname = self._hostname or self.host
sni_hostname = server_hostname if ssl.HAS_SNI else None
self.sock = self._context.wrap_socket(self.sock,
server_hostname=sni_hostname)
if not self._context.check_hostname and self._check_hostname:
try:
ssl.match_hostname(self.sock.getpeercert(), server_hostname)
except Exception:
self.sock.shutdown(socket.SHUT_RDWR)
self.sock.close()
raise
def check_ip_p(ip, func):
if func(ip):
print(ip, flush=True)
def check_for_gae(ip):
return _check(APP_ID + '.appspot.com', APP_PATH, ip)
def check_for_search(ip):
return _check('www.google.com', '/', ip)
def _check(host, path, ip):
for chance in range(1,-1,-1):
try:
conn = HTTPSConnection(
ip, timeout = 5,
context = context,
hostname = host,
)
conn.request('GET', path, headers = {
'Host': host,
})
response = conn.getresponse()
if response.status < 400:
print('GOOD:', ip, file=sys.stderr)
else:
raise Exception('HTTP Error %s %s' % (
response.status, response.reason))
return True
except KeyboardInterrupt:
raise
except Exception as e:
if isinstance(e, ssl.CertificateError):
print('WARN: %s is not Google\'s!' % ip, file=sys.stderr)
chance = 0
if chance == 0:
print('BAD :', ip, e, file=sys.stderr)
return False
else:
print('RE  :', ip, e, file=sys.stderr)
def main():
parser = argparse.ArgumentParser(description='Check Google IPs')
parser.add_argument('service', choices=['search', 'gae'],
help='service to check')
args = parser.parse_args()
func = globals()['check_for_' + args.service]
count = 0
with ThreadPoolExecutor(max_workers=50) as executor:
for l in sys.stdin:
l = l.strip()
if '/' in l:
for ip in IPv4Network(l).hosts():
executor.submit(check_ip_p, str(ip), func)
count += 1
else:
executor.submit(check_ip_p, l, func)
count += 1
print('%d IP checked.' % count)
if __name__ == '__main__':
main()

脚本下载地址


2014年9月3日重要更新:由于失误,之前的脚本没有检查 SSL/TLS 证书,所以将错误的 IP 认为是可用的。现已更新。

发送到 Kindle

Category: python | Tags: python google 网络 中国特色 | Read Count: 12572

评论 (3)
StarBrilliant 说:
7 年前

看看这个喵 https://code.google.com/p/goagent/issues/detail?id=14620

jackchen 说:
6 年前

我刚接触pythons,windows下运行这个程序,提示找不到/etc/ssl/certs/ca-certificates.crt这个文件,请问这个文件哪里有?谢谢!

依云 说:
6 年前

Windows 就用那个什么 GoGo Tester 吧。
这个证书文件是 openssl 包里的,里边都是被信任的 CA 证书。Windows 的证书管理方法不一样的。

[取消回复评论]

昵称 登录 E-mail: *
Web:
Twitter:
当有新评论通过 E-mail 通知我

loading captcha image...
(输入验证码)

or Ctrl+Enter


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK