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实现apahce网站日志分析示例
Apr 02 Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 Python
老生常谈python的私有公有属性(必看篇)
Jun 09 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
Python版中国省市经纬度
Feb 11 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
Python如何输出警告信息
Jul 30 Python
Python可视化工具如何实现动态图表
Oct 23 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
详解Scrapy Redis入门实战
Nov 18 Python
python绘制简单直方图(质量分布图)的方法
Apr 21 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中基本HTTP认证技巧分析
2015/03/16 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
php中strtotime函数性能分析
2016/11/20 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
图片完美缩放
2006/09/07 Javascript
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
python图像处理之镜像实现方法
2015/05/30 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
python获取本机所有IP地址的方法
2018/12/26 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
python FTP编程基础入门
2021/02/27 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
关于建议书的格式范文
2014/05/20 职场文书
销售顾问工作计划书
2014/08/15 职场文书
财务负责人岗位职责
2015/02/03 职场文书
物业保安辞职信
2015/05/12 职场文书
图书借阅制度范本
2015/08/06 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技
MySQL GTID复制的具体使用
2022/05/20 MySQL