头图

前言

由于nexus库自带API没有输出依赖包对应的创建时间(blobCreated)、上传时间(blobUpdated),为方便管理依赖包只好从页面返回的数据进行爬取(可能使用nexus-cli可以获取,但是没有细究这个方法)

思路

我这边使用的nexus库版本为 3.19.1-01,下面是在nexus库API接口信息中可以查询到关于依赖包信息的接口 /v1/components
image.png
该版本输出的信息中只包含一般的 group、name、downloadUrl、repository等消息,没有上传时间相关的信息,但是在Browse 中可以查询到相关的信息
image.png
通过浏览器开发工具可以查询到,该信息来自
/service/extdirect 这个请求地址
image.png
image.png

根据接口请求负载可以看到,该接口需要传入两个参数
image.png
分别是repo地址以及一个id参数,仔细研究之后发现该id与nexus 自带API(/v1/components)输出的id并非一样,而是来自同一个请求地址不同action的id名为 assetId
image.png
image.png
而这个请求需要传入的参数分别是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)

效果

执行效果:
image.png

结尾

后来发现nexus库在 3.37.3-02 往后的版本(或许稍微往前的版本也有)中API接口已经有相关的时间输出了
image.png
但是由于各种原因没法进行升级操作,只好出此下策进行爬取信息,希望能帮助到有需要的人吧~
感谢看到最后~拜拜~


白马百度
0 声望0 粉丝