boce api检测域名脚本
2023-05-09 14:25
163 人阅读

1.待检测域名文件,格式如下 cat domain_map
05-06 projectA https://domain1 说明 05-06 projectB https://domain2 说明
2.用shell脚本检测,生成对应结果文件,以及将上面文件,生成另一个domain文件,给python脚本调用
#!/bin/bash >domain cd /data/shell/boce if [ -s ./domain_map ];then cat domain_map | while read line do url_list=$line create_date=`echo $url_list|awk '{print $1}'` project=`echo $url_list|awk '{print $2}'` url_long=`echo $url_list|awk '{print $3}'` item=`echo $url_list|awk '{print $4}'` url=`echo $url_long|awk -F'//' '{print $2}'|awk -F'/' '{print $1}'` echo $url $create_date $project $item >> domain SEND=$(curl "https://api.boce.com/v3/task/create/curl?key=a98ed2bcdfcbfd61a6356154e959&node_ids=6,7,8,12,13,14,19,20,24,25,26,30,31,32,36,37,38,42,43,49,54,55,60,61,62,66,67,72,73,74,79,80,84,85,86,90,91,92,96,97,98,102,103,104,108,110,114,115,116,120,121,122,126,127,128,132,133,134,138,139,144,145,146,150,151,152,156,157,162,163,164,168,169,174,180,181,186&host=${url_long}" |cut -d '"' -f 12) sleep 60 curl "https://api.boce.com/v3/task/curl/$SEND?key=a98ed2bcdfcbfd61a6356154e959" > $url done fi
cat domain
05-06 projectA domain1 说明 05-06 projectB domain2 说明
3.python脚本调用上面文件,分析该域名对应的结果文件,然后生成总结文件
#!/usr/bin/python # -*- coding:utf-8 -* import ssl import timeab_code import json import sys import os import requests import time import smtplib import subprocess from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header from bs4 import BeautifulSoup domain_file = 'domain' curtime=time.strftime("%m%d%H%M", time.localtime()) result_filename='result_'+curtime+'.csv' ip_file='iplist' ip_list=[] summary_domain_dict={} def write_to_file(filename,domain_result): f = open(filename, 'a',newline='', encoding='utf-8-sig') f.write(f'"{domain_result}",') f.closed def write_n_file(filename): f = open(filename, 'a',newline='', encoding='utf-8-sig') f.write(f'\n') f.closed def write_jiechi_ip(ipaddress): with open("jiechi","a") as file: file.write(ipaddress+"\n") def write_noresult(domain): with open("noresult_domain)","a") as file: file.write(domain+"\n") #读取文件,以列表的形式返回,这里读取域名文件,和IP文件会调用这个 def get_domain_list(filename): furllist = [] with open(filename) as f: url_list = f.readlines() f.close() for url in url_list: url = url.replace('\n', '') if url != None: furllist.append(url) return furllist #传入域名名命的文件,然后读取获得列表,再保存到全局字典中 def get_domain_result_dict(domain,create_date,project,item): domain_result_list=[] ab_code=0 ab_re=0 ip_list=get_domain_list(ip_file) domain_resut_dict = json.load(open(domain)) time.sleep(3) if 'list' not in domain_resut_dict.keys(): write_noresult(domain) print("分析失败:"+domain) return 1 if not domain_resut_dict['list']: print("分析失败:"+domain) write_noresult(domain) return 1 domain_node_list=domain_resut_dict['list'] total_node=len(domain_node_list) for node in domain_node_list: if node['error_code'] == 0: if len(node['remote_ip']) == 0: ab_code=ab_code+1 domain_result="打不开"+"\n"+node['node_name']+"\n"+node['remote_ip']+"\n"+str(node['http_code']) domain_result_list.append(domain_result) elif "cloudflare" not in node['ip_region'] and "amazon" not in node['ip_region'] and node['remote_ip'] not in ip_list: ab_re=ab_re+1 domain_result="被劫持"+"\n"+node['node_name']+"\n"+node['remote_ip']+"\n"+str(node['http_code']) domain_result_list.insert(0,domain_result) write_jiechi_ip(node['remote_ip']) elif node['http_code'] == 200: pass #domain_result="正常"+"\n"+node['node_name']+"\n"+node['remote_ip']+"\n"+str(node['http_code']) #domain_result_list.append(domain_result) else: ab_code=ab_code+1 domain_result="打不开"+"\n"+node['node_name']+"\n"+node['remote_ip']+"\n"+str(node['http_code']) domain_result_list.append(domain_result) elif node['error_code'] == 1: print("鉴权失败") elif node['error_code'] == 2: print("参数错误") elif node['error_code'] == 3: print("波点不足或波点未配置") else: print("生成任务id失败或任务id失效") domain_summary="检测点:"+str(total_node)+"\n被劫持:"+str(ab_re)+"\n打不开:"+str(ab_code) domain_result_list.insert(0,domain_summary) domain_result_list.insert(0,item) domain_result_list.insert(0,project) domain_result_list.insert(0,create_date) domain_result_list.insert(0,domain) domain_result_list.insert(0,ab_code) domain_result_list.insert(0,ab_re) #每个insert,相当于插入一个单元格的内容 if ab_code > 0 or ab_re > 0: #如果结果解析和code都正常,就不用放到表里面 summary_domain_dict[domain_result_list[2]]=domain_result_list if __name__ == '__main__': domain_list=get_domain_list(domain_file) for domain_li in domain_list: domain=domain_li.split()[0] create_date=domain_li.split()[1] project=domain_li.split()[2] item=domain_li.split()[3] get_domain_result_dict(domain,create_date,project,item) result_tup_list=sorted(summary_domain_dict.items(),key=lambda x:(x[1][0],x[1][1]),reverse=True) #result_tup_list相当于所有域名文件的结果列表该列表格式[[domian,[每行单元格列表]],[domain2,[每行单元格列表]]] #x相当于[[domian,[每行单元格列表]],x[1][0]相当于每行的第一个,即ab_re,x[1][1]即ab_code, #表示先根据ab_re排序,再根据ab_code排序,然后用result_tup_list保存结果 for result_tup in result_tup_list: for domain_resu in result_tup[1][2:]: #result_tup相当于一行,包括ab_re,ab_code #result_tup[1][2:],相当于该列表去掉ab_re,ab_code,从第三个domain起开始写入文件 #domain_resu相当于一个单元格 write_to_file(result_filename,domain_resu) write_n_file(result_filename)
和博主交个朋友吧
