赞
踩
由于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信息获取对应的依赖包详细信息。
既然思路清晰了,那就开始备菜做饭(敲代码调试)吧~
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)
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)
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接口已经有相关的时间输出了

但是由于各种原因没法进行升级操作,只好出此下策进行爬取信息,希望能帮助到有需要的人吧~
感谢看到最后~拜拜~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。