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 相关文章推荐
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
Python随机生成带特殊字符的密码
Mar 02 Python
python中zip()方法应用实例分析
Apr 16 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
python数据结构之列表和元组的详解
Sep 23 Python
Python_LDA实现方法详解
Oct 25 Python
Python中IP地址处理IPy模块的方法
Aug 16 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
python基于opencv实现人脸识别
Jan 04 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简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
python 判断是否为正小数和正整数的实例
2017/07/23 Python
python2和python3哪个使用率高
2020/06/23 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
物业电工岗位职责
2013/11/20 职场文书
物业经理自我鉴定
2014/03/03 职场文书
大型会议策划方案
2014/05/17 职场文书
学校节能减排方案
2014/06/13 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
python 网络编程要点总结
2021/06/18 Python