Python实现的Google IP 可用性检测脚本


Posted in Python onApril 23, 2015

需要 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()
Python 相关文章推荐
python字符串的常用操作方法小结
May 21 Python
python设计模式大全
Jun 27 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
python线程中同步锁详解
Apr 27 Python
Python2包含中文报错的解决方法
Jul 09 Python
python3.5基于TCP实现文件传输
Mar 20 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
Oct 17 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
Python类和实例的属性机制原理详解
Mar 21 Python
Django多数据库配置及逆向生成model教程
Mar 28 Python
Python3.2中的字符串函数学习总结
Apr 23 #Python
Python与Redis的连接教程
Apr 22 #Python
Python实现的数据结构与算法之快速排序详解
Apr 22 #Python
利用Fn.py库在Python中进行函数式编程
Apr 22 #Python
Python实现的数据结构与算法之基本搜索详解
Apr 22 #Python
Python实现的数据结构与算法之链表详解
Apr 22 #Python
Python实现的数据结构与算法之双端队列详解
Apr 22 #Python
You might like
一个域名查询的程序
2006/10/09 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
全面理解Python中self的用法
2016/06/04 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
对python 命令的-u参数详解
2018/12/03 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
毕业生动漫设计求职信
2013/10/11 职场文书
办理护照介绍信
2014/01/16 职场文书
村庄绿化方案
2014/05/07 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
优秀员工事迹材料
2014/12/20 职场文书
入党积极分子群众意见
2015/06/01 职场文书
JavaScript前端面试组合函数
2022/06/21 Javascript