• GitLab获取人员参与项目-贡献项目列表


    前言

    最近在做的统计报表项目包含人员代码提交量。
    要获取人员代码提交量首先要知道人员参与的项目。GitLab个人页面中有Contributed projects页面,如下图:

    遗憾的是GitLab api里没有相应的API接口。
    目前的做法只能通过页面爬取。做法是使用接口登录,然后访问该页面接口,然后解析数据。

    获取token

    GitLab登录页面是有csrf_token保护的,因此要先从signin页面抓取authenticity_token。页面中有多个authenticity_token,不过都是一样的。

    import requests
    import lxml
    
    signin_url = 'http://gitlab服务地址/users/sign_in'
    session = requests.session() 
    res = session.get(signin_url)
    html = etree.HTML(res.text)
    token, = html.xpath('//form[@id="new_ldap_user"]//input[@name="authenticity_token"]//@value') or ['']
    

    使用session是为了保持登录状态,这里使用lxml解析并获取token,首先要使用pip install lxml安装。也可以使用正则或者bs4进行解析。

    登录

    然后使用authenticity_token及用户名密码进行登录。

    # ldap登录
    login_url = 'http://gitlab服务地址/users/auth/ldapmain/callback'
    data = {'utf8': '✓', 'authenticity_token': token, 'username': '登录用户名', 'password': '登录密码'}
    session.post(login_url, data=data)
    

    我们这里是使用ldap登录的,使用普通方式登录的也一样,换下login_url即可。

    获取用户参与项目

    url = f'http://gitlab服务地址/users/{username}/contributed.json'
    res = session.get(url)
    html = etree.HTML(res.json()['html'])
    _projects = html.xpath('//span[@class="project-full-name"]')
    projects = [project.xpath('string(.)').replace('
    ', '').replace(' ', '') for project in _projects]
    

    这里面不是直接请求的用户贡献项目页面,而是加了.json的AJAX请求地址。使用XPath的strings()函数获取当前节点下的所有文本,并替换掉换行、空格。
    projects便是解析出的用户参与项目列表。

    完整代码

    import requests
    import lxml
    
    GITLAB_BASE_URL = 'gitlab服务地址'
    
    def gitlab_login(username, password):
        """登录gitlab返回登录后的session"""
        # 从页面获取csrf_token
        signin_url = 'GITLAB_BASE_URL/users/sign_in'
        session = requests.session()
        res = session.get(signin_url)
        html = etree.HTML(res.text)
        token, = html.xpath('//form[@id="new_ldap_user"]//input[@name="authenticity_token"]//@value') or ['']
        # ldap登录
        login_url = 'GITLAB_BASE_URL/users/auth/ldapmain/callback'
        data = {'utf8': '✓', 'authenticity_token': token, 'username': username, 'password': password}
        session.post(login_url, data=data)
        return session
    
    def get_user_contributed(username):
        """从Gitlab获取人员贡献项目"""
        session = gitlab_login('登录用户名', '登录密码')
        url = f'GITLAB_BASE_URL/users/{username}/contributed.json'
        res = session.get(url)
        html = etree.HTML(res.json()['html'])
        _projects = html.xpath('//span[@class="project-full-name"]')
        projects = [project.xpath('string(.)').replace('
    ', '').replace(' ', '') for project in _projects]
        print(projects)
        return projects
    
    if __name__ == '__main__':
        get_user_contributed('GitLab用户名')
    
    
  • 相关阅读:
    oracle基础~ash报告管理
    django基础-bootstarp
    django基础~admin入门
    django基础~jquery交互
    oracle基础~RAC-grid搭建
    Oracle基础~RAC搭建准备二
    oracle基础~RAC搭建准备一
    oracle基础~补丁安装
    环境准备、框架认识、新建maven项目和配置tomcat
    python线程问题、深浅拷贝、属性动态设置
  • 原文地址:https://www.cnblogs.com/superhin/p/11731404.html
Copyright © 2020-2023  润新知