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('\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用户名')
相关推荐
cxin 2020-11-06
synshitou 2020-10-21
Topbeyond 2020-08-21
happyfreeangel 2020-07-27
白开水 2020-07-19
无风的雨 2020-07-08
贤时间 2020-07-06
wishli 2020-06-28
小信 2020-06-21
leehbhs 2020-06-20
happyfreeangel 2020-06-18
83284950 2020-06-17
冯冯领队 2020-06-16
就是那个胖子 2020-06-14
83284950 2020-06-14
LiHansiyuan 2020-06-14
fcds00 2020-06-11
就是那个胖子 2020-06-11