web-dev-qa-db-ja.com

GitHub API:寄稿されたリポジトリ

GitHub APIを介して、GitHubプロファイルページの「寄付されたリポジトリ」モジュールのデータにアクセスする方法はありますか?理想的には、トップ5だけではなく、リスト全体がWeb上で明らかに入手できるすべてです。

60
outoftime

Google BigQueryGitHub Archive と組み合わせて使用​​して、プルリクエストを作成したすべてのリポジトリをプルしました。

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;

違いはactor_attributes_loginIssue Events API から来ています。

また、問題やPRが自分で提出していない可能性がある独自のリポジトリをキャプチャすることもできます。

30
Kyle Kelley

GraphQL API v4 を使用すると、次のコマンドを使用して、これらの寄付されたリポジトリを取得できます。

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

エクスプローラーで試してください

ソース

100を超えるレポジトリ(自分のものを含む)がある場合は、次のリクエストのためにrepositoriesContributedToafter: "END_CURSOR_VALUE"を指定してページ分割を行う必要があります。

18
Bertrand Martel

私はこのようなものをGithubサマライザ用に少し前に実装してみました ...ユーザーが提供したリポジトリを取得するための私の手順は次のとおりです(自分のリポジトリを使用します)例としてユーザー):

  • 検索 ユーザーが送信した最後の100個のクローズされたプルリクエスト。もちろん、最初のページが満杯の場合、2つ目のページをリクエストして、さらに古いPRSを取得することもできます。

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

  • 次に、これらの各 repos contributors を要求します。問題のユーザーが寄稿者リストに含まれている場合は、リストにリポジトリを追加します。例えば:

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

  • ユーザーがいずれかのリポジトリの寄稿者としてリストされている場合、そのリポジトリにリストを追加します(上記と同じ手順)

これは、ユーザーがプルリクエストを送信していないが、コントリビューターとして追加されているリポジトリを欠落しています。検索することで、これらのリポジトリを見つける確率を上げることができます。

1)開かれた問題(プルされたプルリクエストだけではない)
2)ユーザーがスターを付けたリポジトリ

明らかに、これは私たちがしたいよりもはるかに多くの要求を必要としますが、彼らがあなたに機能をごまかすようにさせるとき、あなたは何ができますか\ o /

14
megawac

GitHub APIが提供する検索 を使用できます。クエリは次のようになります。

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

forkパラメータをtrueに設定すると、forkを含めて、すべてのユーザーのリポジトリを照会できます。

ただし、ユーザーがリポジトリをフォークしただけでなく、それに貢献したことを確認したい場合は、「検索」リクエストで取得したすべてのリポジトリを反復処理し、ユーザーがその中にいるかどうかを確認する必要があります。 githubが貢献者を100人しか返さず、そのための解決策がないため、これはかなり厄介です...

3
koscielna

私は問題に来ました。 ( GithubAPI:ユーザーがこれまでにコミットしたリポジトリを取得する

私が見つけた実際のハックの1つは、 http://www.githubarchive.org/ というプロジェクトがあることです。2011年以降、すべてのパブリックイベントを記録します。理想的ではありませんが、役立つ場合があります。

したがって、たとえば、あなたの場合:

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、データスキーマはここにあります: https://github.com/igrigorik/githubarchive.org/blob/master/bigquery/schema.js

2
nix

私はセレンを書いたpythonこれを行うためのスクリプト

"""
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ブラウザでgithubにログインし、投稿ページに移動して、毎日クリックし、投稿からリポジトリ名を取得します。 。このページには1年間のアクティビティのみが表示されるため、このスクリプトで取得できるのはそれだけです。

2
jjj

すべての貢献をリストすることを主張する新しいプロジェクトがあります:

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

また、サービスをサポートして、より詳細なユーザープロファイルを作成します。

https://ghuser.io/

2

APIでそれを行う方法はありませんでした。私が見つけることができる最も近いものは、パブリックユーザーから最新の300イベントを取得することでした(残念ながら、300が上限です)。他のリポジトリへの貢献のためにそれらを並べ替えることができます。

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

これをGithubにAPIに実装するよう依頼する必要があります。

0
RichLitt