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数组条件过滤filter函数使用示例
Jul 22 Python
Python 自动补全(vim)
Nov 30 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
Python和C/C++交互的几种方法总结
May 11 Python
Windows下python3.7安装教程
Jul 31 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
详解django中Template语言
Feb 22 Python
jenkins+python自动化测试持续集成教程
May 12 Python
序列化Python对象的方法
Aug 01 Python
django使用channels实现通信的示例
Oct 19 Python
Pytorch 实现变量类型转换
May 17 Python
python使用BeautifulSoup 解析HTML
Apr 24 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
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python的时间模块datetime详解
2017/04/17 Python
python Flask实现restful api service
2017/12/04 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
如何基于python实现不邻接植花
2020/05/01 Python
FC-Moto西班牙:摩托车手最大的购物场所之一
2019/04/11 全球购物
会议开场欢迎词
2014/01/15 职场文书
标准自荐信范文
2014/01/29 职场文书
教师一帮一活动总结
2014/07/08 职场文书
乒乓球比赛通知
2015/04/27 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL
Linux中文件的基本属性介绍
2022/06/01 Servers