前言

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

要获取人员代码提交量首先要知道人员参与的项目。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. 将netcore网站部署到docker容器中

    一.背景 最近一直在看docker的教程,基础知识看的差不多了.理论总要运用于实践,所以下面我们就来把最简单的一个netcore网站托管到docker容器中. 环境:1.docker for wind ...

  2. PDA无线移动开单智能新生活,省时、省心、省力

    纯手工4个小时 VS移动PDA开单10分钟 无论你是营业办公还是需要上门接货,开单都是一件重要且繁琐的事情.我们了解到传统物流业务运营都是通过手抄单.表格.补录运单来重复操作每一笔业务,手动填写纸质单 ...

  3. R_数据操作_高级_04

    数学函数: abs(x) 绝对值     sqrt(x) 平方根   ceiling(x) 放回不小于x的最小整数 floor(x) 不小于x的最大整数   trunc(x) 先0方向截取x的整数部分 ...

  4. H5 - 简学

    什么是HTML? HTML 是用来描述网页的一种语言. 0.HTML 指的是超文本标记语言 1.HTML 不是一种编程语言,而是一种标记语言 2.标记语言是一套标记标签 3.HTML 使用标记标签来描 ...

  5. java读取文件的几种方式性能比较

    //普通输入流读取文件内容 public static long checksumInputStream(Path filename) { try(InputStream in= Files.newI ...

  6. 【日语】日语单词N3_N4_N5

    日语单词N3_N4_N5 单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. ...

  7. reinterpret

    reinterpret意为“重新解释” reinterpret_cast是C++中与C风格类型转换最接近的类型转换运算符.它让程序员能够将一种对象类型转换为另一种,不管它们是否相关. reinterp ...

  8. rabbitmq笔记(一)rabbitmq简介及基础

    一.消息组件 如果从消息组件来讲主要划分位两类: 1.JMS组件:ActiveMQ(慢): 2.AMQP组件(协议):性能是最高的, 而AMQP有两个主要的开源: 1)RabbitMQ:使用最广泛,速 ...

  9. LearnOpenGL学习笔记(二)纹理

    开始学习OpenGL,参考的是著名的LearnOpenGL这个网站,在这里做一些总结性的记录,只是方便自己日后查找或者记录自己的一些拓展思考,关于OpenGL的具体内容请移步: https://lea ...

  10. 使用Ultra Librarian工具生成Altium封装和原理图符号的方法

    最近在项目中用到了TI的单通道SPDT 模拟开关TS5A3160芯片,Altium官方的库中没有该元件的封装库,所以需要自己画.Ti在官网的产品介绍中提供了生成原理图符号和 PCB 布局封装的方法. ...