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访问sqlserver示例
Feb 10 Python
python发布模块的步骤分享
Feb 21 Python
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
在Python程序员面试中被问的最多的10道题
Dec 05 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
django云端留言板实例详解
Jul 22 Python
python else语句在循环中的运用详解
Jul 06 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
Python 读取位于包中的数据文件
Aug 07 Python
Python unittest装饰器实现原理及代码
Sep 08 Python
Python命令行参数定义及需要注意的地方
Nov 30 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
Smarty模板快速入门
2007/01/04 PHP
php算法实例分享
2015/07/14 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
Python中的高级函数map/reduce使用实例
2015/04/13 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
C#和SQL Server的面试题
2016/08/12 面试题
C#面试题问题集
2016/04/02 面试题
社区矫正工作方案
2014/06/04 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书
vue3获取当前路由地址
2022/02/18 Vue.js
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android