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

目录

前言

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

遗憾的是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('\n', '').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('\n', '').replace(' ', '') for project in _projects]
    print(projects)
    return projects

if __name__ == '__main__':
    get_user_contributed('GitLab用户名')

相关推荐