前言

最近在做的统计报表项目包含人员代码提交量。

要获取人员代码提交量首先要知道人员参与的项目。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用户名')

GitLab获取人员参与项目-贡献项目列表的更多相关文章

  1. Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码

    前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...

  2. 转帖:向开源项目贡献源码(以 Orchard 为例)

    原文地址:http://yangw80.blog.163.com/blog/static/247518002201552692516908/ 在开源项目满天飞的时代,仅仅把开源项目拿来用是不够的,要适 ...

  3. 使用github参与到开源项目的维护

    参与到开源项目的维护工作一般分两种,一种是由项目建立者拉入到贡献者列表中,拥有对项目的读写权限,而普通用户对项目仅有读取权限,另一种是fork项目到自己仓库,然后把修改后的内容发送给项目管理者者请求合 ...

  4. Jenkins+Ansible+Gitlab自动发布/回滚Spring项目

    一.实现方法流程图 流程图如下:代码托管在本地GitLab上(为了复现整套流水线,我直接使用了GitHub,懒得再搭建GitLab),开发完成后提交代码到代码仓库,[自动]触发Jenkins进行持续集 ...

  5. 我参与 Seata 开源项目的一些感悟

    丁老师在他的知识星球邀请我回答以下一个问题: 我觉得这个问题非常有意思,姑且把它贴到公众号这里,与大家分享一下我对这个问题的一些感悟. 感谢丁老师的邀请问答: 在这里我就简单说下,我这段时间参与 Se ...

  6. 我给Apache顶级项目贡献了点源码。

    这是why技术的第 91 篇原创文章 这篇文章其实并没有什么技术性的分享,从我的角度而言,更多是记录和思考. 把我对于源码和之前写的部分文章反哺给我的一些东西,带来的一点点思考分享给大家. 一行源码 ...

  7. 花20分钟写的-大白话讲解如何给github上项目贡献代码

    原文地址:http://site.douban.com/196781/widget/notes/12161495/note/269163206/ 本文献给对git很迷茫的新手,注意是新手,但至少会点基 ...

  8. 怎样在Github参与一个开源项目

    转载:http://www.csdn.net/article/2014-04-14/2819293-Contributing-to-Open-Source-on-GitHub 最近一年开源项目特别的热 ...

  9. (转)大白话讲解如何给github上项目贡献代码

    转自:https://site.douban.com/196781/widget/notes/12161495/note/269163206/ 2013-03-30 22:53:55   本文献给对g ...

随机推荐

  1. VsCode开发Angular的必备插件

    1 概述 一般个人开发或者小公司开发都会使用破解版软件,除非比较尊重正版且不太缺钱的人才会用正版,但是大型公司有严格的规定,不允许员工使用盗版软件. 这时候我就不得不从WebStorm转向VsCode ...

  2. .NET调用腾讯云API实例

    最近项目有用到腾讯云的身份识别接口,话不多说,直接上代码: private void IDCardVerification(HttpContext context) { string imgStr = ...

  3. 我们为什么要通过python来入IT这一行

    我们为什么要通过python来入IT这一行 导语 ​ 这个问题,其实大部分在选择转行做IT,或者在行业内处于边缘化的非技术人员都会有这样的疑惑.毕竟,掌握一门技能,是需要花成本的.决策之前,做个前景判 ...

  4. TensorFlow实现自编码器及多层感知机

    1 自动编码机简介        传统机器学习任务在很大程度上依赖于好的特征工程,比如对数值型,日期时间型,种类型等特征的提取.特征工程往往是非常耗时耗力的,在图像,语音和视频中提取到有效的特征就更难 ...

  5. ubuntu下使用JNI Java调用C++的例子

    TestJNI.java public class TestJNI { static{ System.load("/home/buyizhiyou/workspace/JNI/src/lib ...

  6. LA服务可用性4个9是什么意思?怎么达到?

    SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...

  7. S5PV210 启动流程

    S3C6410启动流程 首先,看一下S3C6410启动流程 ① iROM supports initial boot up : initialize system clock, D-TCM, devi ...

  8. Excel导入+写入数据库

    1.引用服务 2.前端 <h2>这里是上传Excel功能页面</h2> <div> <form action="/Improve_Excel/get ...

  9. 用js刷剑指offer(字符串的排列)

    题目描述 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入 ...

  10. 9.1: 请每个小组在 cnblogs.com 上面创建团队博客,第一个博客把小组成员都介绍一下 #团队博客作业1------------------答题者:徐潇瑞

    大家好,我们这个团队的名字叫14组之家,之所以这么叫,因为我们是在章亦葵老师的现代软件工程课上成立为14组,而且我们每个组员在这个小家庭中都感受到温暖,我们互相协作,互相配合,来完成我们的任务. 首先 ...