with tag tab practices create commits best github github-api

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 } } } }

Pruébalo en el explorador

Source

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



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?