tag - GitHub API: Repositorios contribuidos a
git versioning (8)
¿Hay alguna forma de acceder a los datos en el módulo "Repositorios contribuidos" en las páginas de perfil de GitHub a través de la API de GitHub? Idealmente, la lista completa, no solo los cinco primeros, que son todo lo que puedes obtener aparentemente en la web.
A partir de ahora GitHub API v3, no proporciona una forma de obtener la racha actual del usuario.
Puedes usar esto para calcular la racha actual.
https://github.com/users/<username>/contributions.json
Con GraphQL API v4 , ahora puede obtener estos repo contribuidos usando:
{
viewer {
repositoriesContributedTo(first: 100, contributionTypes: [COMMIT, ISSUE, PULL_REQUEST, REPOSITORY]) {
totalCount
nodes {
nameWithOwner
}
}
}
}
Si tiene más de 100 repositorio contribuido (incluido el suyo), tendrá que pasar por la paginación especificando after: "END_CURSOR_VALUE"
en repositoriesContributedTo
para la siguiente solicitud
Escribí un script python de selenio para hacer esto
"""
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)
Utiliza python y selenio para automatizar un navegador Chrome para iniciar sesión en github, vaya a su página de contribuciones, haga clic en cada día y tome el nombre del repositorio de cualquier contribución. Como esta página solo muestra el valor de 1 año de actividad, eso es todo lo que puede obtener con este script.
Llegué al problema. ( GithubAPI: obtenga repositorios que un usuario haya cometido alguna vez )
Un truco real que he encontrado es que hay un proyecto llamado githubarchive.org Registran todos los eventos públicos a partir de 2011. No es ideal, pero puede ser útil.
Entonces, por ejemplo, en tu caso:
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;
Da, si no me equivoco, la lista de repos que solicitaste:
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
Puede jugar con bigquery aquí: bigquery.cloud.google.com, el esquema de datos se puede encontrar aquí: https://github.com/igrigorik/githubarchive.org/blob/master/bigquery/schema.js
No vi ninguna forma de hacerlo en la API. Lo más parecido que pude encontrar fue obtener los últimos 300 eventos de un usuario público (el límite es 300, lamentablemente), y luego puede ordenarlos para las contribuciones a los repositorios de otros.
https://developer.github.com/v3/activity/events/#list-public-events-performed-by-a-user
Necesitamos pedirle a Github que implemente esto en su API.
Puede usar la búsqueda provista por la API de GitHub . Su consulta debería verse más o menos así:
https://api.github.com/search/repositories?q=%20+fork:true+user:username
El parámetro de horquilla establecido en verdadero garantiza que consulte todos los repos del usuario, incluidos los horquillas.
Sin embargo, si quiere asegurarse de que el usuario no solo bifurcó el repositorio, sino que también contribuyó a él, debe recorrer cada repositorio que recibió con la solicitud de "búsqueda" y verificar si el usuario está dentro de él. Lo cual es una mierda, porque github devuelve solo 100 colaboradores y no hay solución para eso ...
Utilizando Google BigQuery con el githubarchive.org , seleccioné todos los repositorios a los que hice una solicitud de extracción utilizando:
SELECT repository_url
FROM [githubarchive:github.timeline]
WHERE payload_pull_request_user_login =''rgbkrk''
GROUP BY repository_url;
Puede usar semántica similar para extraer solo las cantidades de repositorios a los que contribuyó, así como los idiomas en los que se encontraban:
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'';
Si busca contribuciones globales, que incluyen los problemas informados de uso
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;
La diferencia es actor_attributes_login
que proviene de la API Issue Events .
Es posible que también desee capturar sus propios repositorios, que pueden no tener problemas o archivos de reserva archivados por usted mismo.
Intenté implementar algo como esto hace un tiempo para un resumen de Github ... Mis pasos para obtener los repositorios en los que el usuario contribuyó, que no eran de mi propiedad, fueron los siguientes (voy a usar mi propio usuario como ejemplo):
- Search últimas 100 solicitudes de extracción cerradas que el usuario envió. Por supuesto, puede solicitar la segunda página si la primera página está llena para obtener prs más antiguos
https://api.github.com/search/issues?q=type:pr+state:closed+author:megawac&per_page=100&page=1
- A continuación, solicitaría cada uno de estos contribuidores de repositorios . Si el usuario en cuestión está en la lista de contribuyentes, agregaremos el repositorio a la lista. P.ej:
https://api.github.com/repos/jashkenas/underscore/contributors
- También podríamos intentar verificar todos los repos que está viendo el usuario. Nuevamente verificamos cada repos
repos/:owner/:repo/contributors
https://api.github.com/users/megawac/subscriptions
- Además, iteraría todos los repos de las organizaciones en las que el usuario está
https://api.github.com/users/megawac/orgs
https://api.github.com/orgs/jsdelivr/repos
- Si el usuario figura como colaborador de cualquiera de los repos, agregamos el repositorio a la lista (el mismo paso que el anterior)
Esto falla cuando el usuario no ha enviado solicitudes de extracción pero se ha agregado como colaborador. Podemos aumentar nuestras probabilidades de encontrar estos reposes buscando
1) cualquier problema abierto (no solo solicitudes de extracción cerradas)
2) repos que el usuario ha destacado
Claramente, esto requiere muchas más solicitudes de las que nos gustaría hacer, pero ¿qué puedes hacer cuando te hacen cambiar las características?