接上文 信息搜集:网络空间搜索引擎语法及API的应用(一)https://developer.aliyun.com/article/1618340
- 搜索引擎API的应用
ZoomEye除了以上介绍的智能检索功能以外,还提供了强大的Result API功能,用户通过它能够更好地与平台连接,调用平台各类资源。现利用Python程序调用ZoomEye的API接口实现自动化信息搜集。ZoomEye—API被分为两种验证方式,API-KEY和登录验证(Login verification)。
运 行 环 境:
OS: macOS Monterey Version 12.3.1(英文版)
IDE:PyCharm 2020.1
Python: Version 3.9.9
1) 登录验证(Login verification)
平台主要使用的是Json Web Token的登录验证方式,用户进行登录,并获取access_token 就可以直接调用API功能,使用host方法查询开放6379端口的服务器IP地址,并输出检索到的IP地址和端口号,示例代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :4/18/22 7:03 PM
# 文件 :Zoomeye_host_token.py
# IDE :PyCharm
import requests
import json
import zoomeye.sdk as zoomeye
# 定义一个函数获取access_token
def get_access_token(username, password):
# 实例化一个zm对象
zm = zoomeye.ZoomEye()
# 账号赋值给对象的账号属性,账号密码赋值给账号密码属性
zm.username = username
zm.password = password
return zm.login()
# 定义主函数
def main():
# 输入zoomeye账号和密码
username = input('请输入账号: ')
password = input('请输入账号密码:')
# headers里的Authorization值必须JWT前缀加空格
headers = {
"Authorization":"JWT " + get_access_token(username=username, password=password)}
# 赋值给url
url = 'https://api.zoomeye.org/host/search?query=port:6379&page=1&facets=app,os'
# 请求信息赋值给info
info = requests.get(url=url, headers=headers)
# 转换为json数据
r_decoded = json.loads(info.text)
# 遍历匹配项列表,输出IP地址和端口号
for line in r_decoded['matches']:
print(line['ip'] + ': ' + str(line['portinfo']['port']))
# 启动主程序
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('interrupted by user, killing all threads....')
运行结果如下:
备注:headers头部Authorization必须包含JWT 前缀
2)API-KEY 验证
对于每个账户,在它的个人资料页的底部会找到一串API-KEY字符串,将这个字符串添加到ZoomEye-API字段。本人的个人资料的字符串如下图:
备注:API-KEY与账号绑定而且可以被重置
示例代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :4/18/22 4:11 PM
# 文件 :ZoomEye_host.py
# IDE :PyCharm
# 导入相关模块
import requests
import json
# 定义主函数
def main():
# 定义头部headers
headers = {
"API-KEY":"E4b729d3-5730-D778B-87f2-408604aedbd"}
# 赋值url
url = 'https://api.zoomeye.org/host/search?query=port:6379&page=1&facets=app,os'
# 请求信息赋值给info
info = requests.get(url=url, headers=headers)
# 转换为json数据
r_decoded = json.loads(info.text)
# 遍历匹配项列表,输出IP地址和端口号
for line in r_decoded['matches']:
print(line['ip'] + ': ' + str(line['portinfo']['port']))
# 运行主程序
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('interrupted by user, killing all threads....')
运行结果如下图:
希望此文对您有所帮助和启发,欢迎点赞收藏和转发加关注!谢谢!