web-dev-qa-db-fra.com

API GitHub: Référentiels ayant contribué à

Existe-t-il un moyen d'accéder aux données du module «Référentiels auxquels contribuer» sur les pages de profil GitHub via l'API GitHub? Idéalement, la liste complète, et pas seulement les cinq premiers, est tout ce que vous pouvez obtenir sur le Web, apparemment.

55
outoftime

À l’aide de Google BigQuery avec l’archive GitHub Archive , j’ai extrait tous les référentiels pour lesquels j’ai demandé à extraire:

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

Vous pouvez utiliser une sémantique similaire pour extraire uniquement les quantités de référentiels auxquels vous avez contribué, ainsi que les langues dans lesquelles elles étaient:

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 vous recherchez des contributions globales, ce qui inclut les problèmes signalés d'utilisation

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 différence est actor_attributes_login qui provient de l’API Issue Events .

Vous pouvez également vouloir capturer vos propres pensions, qui peuvent ne pas avoir de problèmes ou de PR par vous-même.

28
Kyle Kelley

J'ai essayé de mettre en œuvre quelque chose comme ceci il y a quelque temps pour un synthétiseur Github ... Mes étapes pour obtenir les référentiels auxquels l'utilisateur a contribué, ce qui n'était pas leur propriété Exemple):

  • Recherche pour les 100 dernières demandes d'extraction fermées soumises par l'utilisateur. Bien sûr, vous pouvez demander la deuxième page si la première page est pleine pour obtenir encore plus vieux 

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

  • Ensuite, je demanderais à chacun de ces contributeurs au repos . Si l'utilisateur en question est dans la liste des contributeurs, nous ajoutons le rapport à la liste. Par exemple:

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

  • Nous pourrions également essayer de vérifier toutes les mises en pension que l'utilisateur regarde. Encore une fois, nous vérifions chaque repos repos/:owner/:repo/contributors 

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

  • De plus, j'itérerais toutes les mises en pension des organisations dans lesquelles l'utilisateur se trouve.

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

  • Si l'utilisateur est répertorié en tant que contributeur à l'un des dépôts, nous ajoutons le rapport à la liste (même étape que ci-dessus)

Cela manque les dépôts lorsque l'utilisateur n'a soumis aucune demande d'extraction mais a été ajouté en tant que contributeur. Nous pouvons augmenter nos chances de trouver ces pensions en cherchant

1) tout problème ouvert (pas seulement les demandes de tirage fermées)
2) repositionner l'utilisateur a joué

Il est clair que cela nécessite beaucoup plus de demandes que nous ne voudrions en faire, mais que pouvez-vous faire quand ils vous rendent fudge les fonctionnalités\o /

14
megawac

Avec GraphQL API v4 , vous pouvez maintenant obtenir ces dépôts avec: 

{
  viewer {
    repositoriesContributedTo(first: 100, contributionTypes: [COMMIT, ISSUE, PULL_REQUEST, REPOSITORY]) {
      totalCount
      nodes {
        nameWithOwner
      }
      pageInfo {
        endCursor
        hasNextPage
      }
    }
  }
}

Essayez-le dans l'explorateur

La source

Si vous avez contribué à plus de 100 pensions (y compris la vôtre), vous devrez passer à la pagination en spécifiant after: "END_CURSOR_VALUE" dans repositoriesContributedTo pour la prochaine demande.

14
Bertrand Martel

Vous pouvez utiliser Recherche fournie par l'API GitHub . Votre requête devrait ressembler à ceci:

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

le paramètre fork défini sur true garantit que vous interrogez tous les dépôts de l'utilisateur, inclus.

Cependant, si vous voulez vous assurer que l'utilisateur non seulement a référencé un fichier, mais qu'il y a contribué, vous devez parcourir chaque rapport que vous avez obtenu avec la requête 'recherche' et vérifier si l'utilisateur s'y trouve. Ce qui est vraiment nul, car github ne renvoie que 100 contributeurs et il n'y a pas de solution pour cela ...

3
koscielna

Je suis venu au problème. ( GithubAPI: Obtenir les référentiels dans lesquels un utilisateur s'est déjà engagé )

Un hack que j'ai découvert, c'est qu'il existe un projet appelé http://www.githubarchive.org/ Ils enregistrent tous les événements publics à partir de 2011. Ce n'est pas idéal, mais cela peut être utile.

Donc, par exemple, dans votre cas:

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;

Donne, si je ne me trompe pas, la liste des pensions que vous avez extraites a demandé de:

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

Vous pouvez jouer avec bigquery ici: bigquery.cloud.google.com, le schéma de données peut être trouvé ici: https://github.com/igrigorik/githubarchive.org/blob/master/bigquery/schema.js

2
nix

J'ai écrit un script Selenium python pour le faire

"""
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)

Il utilise python et Selenium pour automatiser un navigateur Chrome afin de se connecter à github, aller à la page des contributions, cliquer chaque jour et récupérer le nom du référentiel dans les contributions. Comme cette page ne montre que 1 an d'activité, c'est tout ce que vous pouvez obtenir avec ce script.

2
jjj

Je n'ai vu aucun moyen de le faire dans l'API. Le plus proche que j'ai pu trouver était d'obtenir les 300 derniers événements d'un utilisateur public (300, malheureusement, la limite), et vous pouvez ensuite les trier pour les contributions vers les dépôts d'autres utilisateurs. 

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

Nous devons demander à Github d’implémenter cela dans leur API. 

0
RichLitt

Il y a un nouveau projet qui prétend lister toutes les contributions:

https://github.com/AurelienLourot/github-contribs

Il soutient également un service pour produire des profils d'utilisateurs plus détaillés:

https://ghuser.io/

0
Joachim Breitner