我目前正在开发一个 dns-enumeration 项目,该项目向各种 API 发送请求。 每个 API 都在它自己的类中处理,所以现在我有 22 个类,它们都提供一个“.query(string: domain, boolean: dnsprobe)”函数,它处理对 API 的请求和处理它收到的数据。
例如,这就是“alienvault”的“.query()”函数的样子(所有函数都继承自“Source”,这是我构建的一个类,可以在需要时传递 config_obj):>
class Alienvault(Source):
@staticmethod
def query(domain, dnsprobe):
url = 'https://otx.alienvault.com/api/v1/indicators/domain/' + domain + '/passive_dns'
fqdns = []
start = timer()
try:
req = urllib.request.Request(url)
response = urllib.request.urlopen(req)
data = response.read()
json_data = json.loads(data)
passive_dns = json_data['passive_dns']
for item in passive_dns:
if item['hostname'] not in fqdns:
if item['hostname'].endswith(domain):
fqdns.append(item['hostname'])
except urllib.error.HTTPError as error:
print("[" + colored(u'\u0021', 'red') + "] AlienVault: " + str(error.code) + " " + error.reason)
end = timer()
exec_time = round((end - start), 3)
# check if domains still exist
probed_fqdns = []
if dnsprobe:
probed_fqdns = probe_fqdns(fqdns)
return Stats("AlienVault", domain, fqdns, probed_fqdns, exec_time)
所有的类都遵循相同的模式,但每个 API 都需要不同的处理方式,例如查询功能不同。
在我的主文件中,我现在想为每个类创建一个实例,并在每个创建的对象上调用该函数以将所有 API 数据存储在一个列表中。
我想有比我目前正在做的更好的方法:
check_alienvault = True
check_Binaryedge = True
check_Bufferover = True
...
domain = 'hackertarget.com'
dnsprobe = False
if check_Alienvault:
Alienvault_obj = sources.Alienvault()
ret = Alienvault_obj.query(domain, dnsprobe)
return_values.append(ret)
if Binaryedge:
Binaryedge_obj = sources.Binaryedge()
ret = Binaryedge_obj.query(domain, dnsprobe)
return_values.append(ret)
if Bufferover:
...
因为我需要分别为所有 22 个 API 执行此操作,这会导致大量样板代码?
由于我在 Python 编程方面不如我希望的那么好,我正在努力自己解决这个问题,并感谢您提供任何先进的输入。