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调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 Python
简介Django中内置的一些中间件
Jul 24 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
python操作excel的方法(xlsxwriter包的使用)
Jun 11 Python
python读取目录下最新的文件夹方法
Dec 24 Python
Python3.5内置模块之random模块用法实例分析
Apr 26 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
浅谈Python数学建模之整数规划
Jun 23 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
一段php加密解密的代码
2006/10/09 PHP
通过文字传递创建的图形按钮
2006/10/09 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
php框架知识点的整理和补充
2021/03/01 PHP
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
JavaScript function函数种类详解
2016/02/22 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
美国性感内衣店:Yandy
2018/06/12 全球购物
Java如何支持I18N?
2016/10/31 面试题
电话销售经理岗位职责
2013/12/07 职场文书
公司节能减排倡议书
2014/05/14 职场文书
心得体会的写法
2014/09/05 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
写给老师的保证书
2015/05/09 职场文书
一个独生女的故事观后感
2015/06/04 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
Python中字符串对象语法分享
2022/02/24 Python
python处理json数据文件
2022/04/11 Python