前言
因为 nexus 库自带 API 没有输入依赖包对应的创立工夫(blobCreated)、上传工夫(blobUpdated),为方便管理依赖包只好从页面返回的数据进行爬取(可能应用 nexus-cli 能够获取,然而没有细究这个办法)
思路
我这边应用的 nexus 库版本为 3.19.1-01,上面是在 nexus 库 API 接口信息中能够查问到对于依赖包信息的接口 /v1/components
该版本输入的信息中只蕴含个别的 group、name、downloadUrl、repository 等音讯,没有上传工夫相干的信息,然而在 Browse 中能够查问到相干的信息
通过浏览器开发工具能够查问到,该信息来自
/service/extdirect 这个申请地址
依据接口申请负载能够看到,该接口须要传入两个参数
别离是 repo 地址以及一个 id 参数,认真钻研之后发现该 id 与 nexus 自带 API(/v1/components)输入的 id 并非一样,而是来自同一个申请地址不同 action 的 id 名为 assetId
而这个申请须要传入的参数别离是 repo 地址以及 node 信息,node 信息能够通过 ’group’+’name’+’version’ 信息获取。
那么查问到这一步思路就造成闭环了,整体思路如下:
通过 nexus 库自带 API 接口别离获取:’group’+’name’+’version’ 信息,组合成 node 信息,进而获取到 assetId 信息,通过 assetId 信息获取对应的依赖包详细信息。
既然思路清晰了,那就开始备菜做饭(敲代码调试)吧~
实现
获取 node 节点信息 AKA ‘group’+’name’+’version’ 信息
nexus_url = 'http://192.168.1.1:8081/' #nexus 库地址
nexus_username = 'admin' #nexus 账号
nexus_password = 'admin123' #nexus 明码
repository = ['aliyun','maven-releases'] #nexus 库 repo 地址
names = []
groups = []
versions = []
downloadUrls = [] #这里顺便获取下载地址,没太大用处能够疏忽
asset_ids = []
def components_api(repository): #申请 components 接口获取依赖包包根本信息
print('running components_api\t'+repository)
#申请参数
query_params = {
'repository' : repository, #传入的 repo 信息
'extension' : 'jar' #依赖包类型
}
#申请 API 接口
response = requests.get(
nexus_url + '/service/rest/v1/components',
params=query_params,
auth=(nexus_username, nexus_password) #API 接口须要鉴权
)
#判断接口状态
if response.status_code != 200:
print('获取依赖项信息失败,状态码:{}'.format(response.status_code))
print(response.content)
exit()
#将接口返回数据转化为 json 格局用于解决
response_data = response.json()
# print(response_data)
global name,group,version,downloadUrl
for items in response_data['items']:
name = format(items['name'])
group = format(items['group'])
version = format(items['version'])
names.append(name)
groups.append(group)
versions.append(version)
for asset in items['assets']:
if asset['path'].endswith('.jar'):
downloadUrl = format(asset['downloadUrl'])
downloadUrls.append(downloadUrl)
#执行工夫
end = datetime.datetime.now()
print('components_api totally time is' , end - start)
依据 node 信息获取 assetId
headers = { #申请头信息 nexus 库,cookie 信息及 token 信息依据 nexus 库账号获取
'X-Requested-With': 'XMLHttpRequest',
'X-Nexus-UI': 'true',
'NX-ANTI-CSRF-TOKEN': '0.1427667210133794',
'Content-Type': 'application/json',
'Origin': nexus_url,
'Referer': nexus_url,
'Cookie': 'NX-ANTI-CSRF-TOKEN=0.1427667210133794; NXSESSIONID=9b2057c6-a456-4f94-85d7-90dcb07eb9e6'
}
random_number = random.randint(50, 120) #增加一个随机数用于接口操作的 tid
def get_nodeinfo(repository): #依据 components_api 获取的信息拼接取得 node 门路及 asset_id
print('get_nodeinfo\t'+repository)
api_url = nexus_url + "/service/extdirect"
for i in range(len(names)):
Groups = [group.replace('.', '/') for group in groups] #将 groups 中的‘.’转换为‘/’node = Groups[i]+'/'+names[i]+'/'+versions[i]
payload = json.dumps({
"action": "coreui_Browse",
"method": "read",
"data": [{
"repositoryName" : repository,
"node": str(node)
}],
"type": "rpc",
"tid": random_number
})
response = requests.request("POST", api_url, headers=headers, data=payload)
if response.status_code != 200: #判断接口状态
print('获取依赖项信息失败,状态码:{}'.format(response.status_code))
print(response.content)
exit()
response_data = response.json()
global asset_ids
for item in response_data['result']['data']: #依据接口返回数据获取 assetid
if item['text'].endswith('.jar'):
asset_ids.append(item['assetId']) #将 API 数据中的 assetId 存入变量 asset_ids
#执行工夫
end = datetime.datetime.now()
print('get_nodeinfo totally time is' , end - start)
依据 assetId 获取依赖包详细信息
INFO_NAME = []
INFO_REPO = []
INFO_CTIME = []
INFO_UTIME = []
INFO_DURL = []
INFO_GID = []
INFO_AID = []
INFO_VERSION = []
def get_assetid_info(repository): #通过 assetid 获取 jar 具体信息包含上传工夫及创立工夫
api_url = nexus_url + "/service/extdirect"
for i in range(len(asset_ids)):
aid = asset_ids[i]
payload = json.dumps({
"action": "coreui_Component",
"method": "readAsset",
"data": [
aid,
repository
],
"type": "rpc",
"tid": random_number
})
response = requests.request("POST", api_url, headers=headers, data=payload)
global INFO_NAME,INFO_REPO,INFO_CTIME,INFO_UTIME,INFO_DURL,INFO_GID,INFO_AID,INFO_VERSION
response_data = response.json()
if response.status_code != 200:
print('get_assetid_info 获取依赖项信息失败,状态码:{}'.format(response.status_code))
if response_data['result']['success'] != True:
print('get_assetid_info 获取依赖项信息失败,状态码:{}'.format(response.status_code))
else:
item = response_data['result']['data']
durls = nexus_url+'/repository/'+repository+'/'+item['name']
#输入信息
print('包名:'+item['name'],'\n'+ '所在 repo:',item['repositoryName'],'\n'+'创立工夫:',item['blobCreated'],'\n'+'更新工夫:',item['blobUpdated'],'\n'+'下载地址:',durls)
#将信息增加到汇合用于后续解决入库
INFO_NAME.append(item['name'])
INFO_REPO.append(item['repositoryName'])
INFO_CTIME.append(item['blobCreated'])
INFO_UTIME.append(item['blobUpdated'])
INFO_DURL.append(durls)
INFO_GID.append(item['attributes']['maven2']['groupId'])
INFO_AID.append(item['attributes']['maven2']['artifactId'])
INFO_VERSION.append(item['attributes']['maven2']['version'])
#执行工夫
end = datetime.datetime.now()
print('get_assetid_info totally time is' ,end - start)
成果
执行成果:
结尾
起初发现 nexus 库在 3.37.3-02 往后的版本 (或者略微往前的版本也有) 中 API 接口曾经有相干的工夫输入了
然而因为各种起因没法进行降级操作,只好出此下策进行爬取信息,心愿能帮忙到有须要的人吧~
感激看到最初~拜拜~