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中内置的日志模块logging用法详解
Jul 12 Python
python编程羊车门问题代码示例
Oct 25 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Django自定义用户认证示例详解
Mar 14 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
python绘制封闭多边形教程
Feb 18 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
python使用turtle库绘制奥运五环
Feb 24 Python
Python多线程多进程实例对比解析
Mar 12 Python
基于Python绘制个人足迹地图
Jun 01 Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
PHP编写daemon process 实例详解
2016/11/13 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
python进阶_浅谈面向对象进阶
2017/08/17 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
Python网页解析器使用实例详解
2020/05/30 Python
python中线程和进程有何区别
2020/06/17 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
2013年保送生自荐信格式
2013/11/20 职场文书
学前班语言教学计划
2015/01/20 职场文书
高考1977观后感
2015/06/04 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang