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实现根据主机名字获得所有ip地址的方法
Jun 28 Python
Python验证码识别处理实例
Dec 28 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
CentOS7下python3.7.0安装教程
Jul 30 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
Django接收自定义http header过程详解
Aug 23 Python
jupyter notebook 重装教程
Apr 16 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
基于PyQT实现区分左键双击和单击
May 19 Python
Python flask框架实现查询数据库并显示数据
Jun 04 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php 阴历-农历-转换类代码
2012/01/16 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
Python MD5文件生成码
2009/01/12 Python
理解Python中函数的参数
2015/04/27 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
YUV转为jpg图像的实现
2019/12/09 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
交通事故检查书范文
2014/01/30 职场文书
毕业生就业协议书
2014/04/11 职场文书
先进员工获奖感言
2014/08/14 职场文书
业务员岗位职责
2015/02/03 职场文书
教师考核鉴定意见
2015/06/05 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL