diff --git a/config/api.py b/config/api.py index 0d2b20c..b2b1edb 100644 --- a/config/api.py +++ b/config/api.py @@ -88,4 +88,7 @@ fullhunt_api_key = '' quake_api_key = '' #https://www.racent.com/ctlog F2>Network抓包获取Token -racent_api_token = '' \ No newline at end of file +racent_api_token = '' + +# https://windvane.lichoin.com/ +windvane_api_token = '' diff --git a/config/default.py b/config/default.py index 0cbf843..a6ed423 100644 --- a/config/default.py +++ b/config/default.py @@ -250,3 +250,6 @@ hunter_api_key = '' # https://api-docs.fullhunt.io/ fullhunt_api_key = '' + +# https://windvane.lichoin.com/ +windvane_api_token = '' diff --git a/modules/datasets/windvane.py b/modules/datasets/windvane.py new file mode 100644 index 0000000..81c852f --- /dev/null +++ b/modules/datasets/windvane.py @@ -0,0 +1,92 @@ +from config import settings +from common.query import Query + + +class Windvane(Query): + def __init__(self, domain): + Query.__init__(self) + self.domain = domain + self.module = 'Dataset' + self.source = "WindvaneQuery" + self.addr = 'https://windvane.lichoin.com/trpc.backendhub.public.WindvaneService/ListSubDomain' + self.api_key = settings.windvane_api_token + self.page_size = 1000 + + def query(self): + """ + 向接口查询子域并做子域匹配 + """ + self.header = self.get_header() + self.header.update({ + 'Content-Type': 'application/json', + 'Referer': 'https://windvane.lichoin.com' + }) + + if self.api_key: + self.header.update({'X-Api-Key': self.api_key}) + + self.proxy = self.get_proxy(self.source) + + page = 1 + total_pages = 1 + all_subdomains = [] + + while page <= total_pages: + data = { + "domain": self.domain, + "page_request": { + "page": page, + "count": self.page_size + } + } + + resp = self.post(self.addr, json=data) + if not resp: + break + + try: + result = resp.json() + + if result.get('code') != 0: + break + + data_section = result.get('data', {}) + + subdomains = self.match_subdomains(resp) + if not subdomains: + break + self.subdomains.update(subdomains) + + page_info = data_section.get('page_response', {}) + total_pages = int(page_info.get('total_page', 1)) + + page += 1 + + except: + break + + + def run(self): + """ + 类执行入口 + """ + self.begin() + self.query() + self.finish() + self.save_json() + self.gen_result() + self.save_db() + + +def run(domain): + """ + 类统一调用入口 + + :param str domain: 域名 + """ + query = Windvane(domain) + query.run() + + +if __name__ == '__main__': + run('baidu.com')