GitHub API:存储库贡献

有没有办法通过GitHub API访问GitHubconfiguration文件页面上的“Repositories contribute to”模块中的数据? 理想情况下,整个列表,不只是前五名,这些都是你可以在网上看到的。

使用Google BigQuery和GitHub存档 ,我把所有的存储库都提交给了我:

SELECT repository_url FROM [githubarchive:github.timeline] WHERE payload_pull_request_user_login ='rgbkrk' GROUP BY repository_url; 

您可以使用类似的语义来提取您所贡献的存储库的数量以及它们所在的语言:

 SELECT COUNT(DISTINCT repository_url) AS count_repositories_contributed_to, COUNT(DISTINCT repository_language) AS count_languages_in FROM [githubarchive:github.timeline] WHERE payload_pull_request_user_login ='rgbkrk'; 

如果你正在寻找整体的贡献,其中包括报告使用的问题

 SELECT COUNT(DISTINCT repository_url) AS count_repositories_contributed_to, COUNT(DISTINCT repository_language) AS count_languages_in FROM [githubarchive:github.timeline] WHERE actor_attributes_login = 'rgbkrk' GROUP BY repository_url; 

这里的差异是来自Issue Events API的 actor_attributes_login

您可能还想要获取自己的回购协议,这些回购协议可能没有您自己提交的问题或PR。

我试着用Github总结器来实现类似这样的操作 …我的步骤来获得用户所贡献的,他们没有拥有的版本库如下(以我自己的用户为例):

  • search用户提交的最近100次closures拉取请求。 当然你可以申请第二页,如果第一页是满的,以获得更旧的prs

https://api.github.com/search/issues?q=type:pr+state:closed+author:megawac&per_page=100&page=1

  • 接下来,我会要求每个这些回购贡献者 。 如果有问题的用户在贡献者列表中,我们将回购添加到列表中。 例如:

https://api.github.com/repos/jashkenas/underscore/contributors

  • 我们也可以尝试检查用户正在观看的所有回购。 我们再次检查每个回购repos/:owner/:repo/contributors

https://api.github.com/users/megawac/subscriptions

  • 另外,我将遍历用户所在组织的所有回购

https://api.github.com/users/megawac/orgs
https://api.github.com/orgs/jsdelivr/repos

  • 如果用户被列为任何回购的贡献者,那么我们将回购添加到列表(与上述相同的步骤)

这错过了用户没有提交请求但是被添加为贡献者的回购站。 我们可以通过search来增加find这些回购的可能性

1)任何问题打开(不只是closures拉请求)
2)用户已经出演的回购

很显然,这需要比我们想要的更多的请求,但是当他们使你变得更有特色时,你可以做些什么\ o /

您可以使用GitHub API提供的search 。 你的查询应该是这样的:

https://api.github.com/search/repositories?q=%20+fork:true+user:username

fork参数设置为true可以确保查询所有用户的回购,包括分叉。

但是,如果您想确保用户不仅派生了存储库,而且对其作出了贡献,您应该遍历通过“search”请求得到的每个回购,并检查用户是否在其中。 这非常糟糕,因为github只返回100个贡献者,并且没有解决scheme…

我遇到了这个问题。 ( GithubAPI:获取用户曾经承诺的存储库 )

我发现的一个实际的攻击是有一个名为http://www.githubarchive.org/的项目。他们从2011年开始logging所有的公共活动。不理想,但可以帮助。;

所以,例如,在你的情况下:

 SELECT payload_pull_request_head_repo_clone_url FROM [githubarchive:github.timeline] WHERE payload_pull_request_base_user_login='outoftime' GROUP BY payload_pull_request_head_repo_clone_url; 

如果我没有弄错,给出你要求的回购清单:

 https://github.com/jreidthompson/noaa.git https://github.com/kkrol89/sunspot.git https://github.com/rterbush/sunspot.git https://github.com/ottbot/cassandra-cql.git https://github.com/insoul/cequel.git https://github.com/mcordell/noaa.git https://github.com/hackhands/sunspot_rails.git https://github.com/lgierth/eager_record.git https://github.com/jnicklas/sunspot.git https://github.com/klclee/sunspot.git https://github.com/outoftime/cequel.git 

你可以在这里玩bigquery:bigquery.cloud.google.com,数据模式可以在这里find: https : //github.com/igrigorik/githubarchive.org/blob/master/bigquery/schema.js

我没有看到在API中的任何方式。 我能find的最接近的是从公共用户那里获得最新的300个事件(不幸的是,这个限制是300),然后你可以把这些事件sorting到其他仓库。

https://developer.github.com/v3/activity/events/#list-public-events-performed-by-a-user

我们需要让Github在他们的API中实现这一点。

我写了一个seleniumpython脚本来做到这一点

 """ Get all your repos contributed to for the past year. This uses Selenium and Chrome to login to github as your user, go through your contributions page, and grab the repo from each day's contribution page. Requires python3, selenium, and Chrome with chromedriver installed. Change the username variable, and run like this: GITHUB_PASS="mypassword" python3 github_contributions.py """ import os import sys import time from pprint import pprint as pp from urllib.parse import urlsplit from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC username = 'jessejoe' password = os.environ['GITHUB_PASS'] repos = [] driver = webdriver.Chrome() driver.get('https://github.com/login') driver.find_element_by_id('login_field').send_keys(username) password_elem = driver.find_element_by_id('password') password_elem.send_keys(password) password_elem.submit() # Wait indefinitely for 2-factor code if 'two-factor' in driver.current_url: print('2-factor code required, go enter it') while 'two-factor' in driver.current_url: time.sleep(1) driver.get('https://github.com/{}'.format(username)) # Get all days that aren't colored gray (no contributions) contrib_days = driver.find_elements_by_xpath( "//*[@class='day' and @fill!='#eeeeee']") for day in contrib_days: day.click() # Wait until done loading WebDriverWait(driver, 10).until( lambda driver: 'loading' not in driver.find_element_by_css_selector('.contribution-activity').get_attribute('class')) # Get all contribution URLs contribs = driver.find_elements_by_css_selector('.contribution-activity a') for contrib in contribs: url = contrib.get_attribute('href') # Only care about repo owner and name from URL repo_path = urlsplit(url).path repo = '/'.join(repo_path.split('/')[0:3]) if repo not in repos: repos.append(repo) # Have to click something else to remove pop-up on current day driver.find_element_by_css_selector('.vcard-fullname').click() driver.quit() pp(repos) 

它使用python和selenium来自动化Chrome浏览器logingithub,进入你的贡献页面,每天点击并从任何贡献中获取回购名称。 由于这个页面只显示1年的活动价值,所以你可以用这个脚本得到。

这是一个很好的工具,它完全符合你的要求,但是没有直接的API调用GitHub:

它使用来自GitHubArchive.org和Google的BigQuery的数据。