Подтвердить что ты не робот

API GitHub: репозитории, внесенные в

Есть ли способ получить доступ к данным в модуле "Хранилища, внесенные в" на страницах профиля GitHub через API GitHub? В идеале весь список, а не только пятерка лучших, которые вы можете получить в Интернете, видимо.

4b9b3361

Ответ 1

Используя Google BigQuery с архивом GitHub, я вытащил все репозитории, которые я сделал запрос на pull с помощью:

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_login, которая исходит из API событий выпуска.

Вы также можете захотеть захватить свои собственные репозитории, у которых могут не возникнуть проблемы или PR, поданные вами сами.

Ответ 2

Я попытался реализовать что-то вроде этого некоторое время назад для компилятора Github... Мои шаги, чтобы получить репозитории, внесенные пользователем, которые у них не были, был следующим (в качестве примера воспользуюсь моим собственным пользователем):

  • Search за последние 100 запросов на закрытие, которые пользователь отправил. Конечно, вы могли бы запросить вторую страницу, если первая страница заполнена, чтобы получить еще более старый 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

  • Если пользователь указан как вкладчик в любой из репозиториев, мы добавляем репо в список (тот же шаг, что и выше).

Это пропускает репозиции, в которых пользователь не отправил запросы на pull, но был добавлен в качестве вкладчика. Мы можем увеличить наши шансы найти эти репозитории, ища

1) открыта любая проблема (не только закрытые запросы на тягу)
 2) репозиции, в которых пользователь отмечен

Ясно, что для этого требуется гораздо больше запросов, чем мы хотели бы сделать, но что вы можете сделать, когда они заставят вас вымывать функции\o/

Ответ 3

Вы можете использовать Поиск, предоставленный API GitHub. Ваш запрос должен выглядеть примерно так:

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

Параметр fork, установленный в true, гарантирует, что вы запрашиваете все пользовательские репозитории, включая forked.

Однако, если вы хотите, чтобы пользователь не только разветвлял репозиторий, но и помогал ему, вы должны перебирать все репо, которое вы получили с запросом "поиска", и проверить, находится ли пользователь в них. Что довольно отстой, потому что github возвращает только 100 участников, и для этого нет решения...

Ответ 4

Я пришел к проблеме. (GithubAPI: получить репозитории, которые пользователь когда-либо совершал)

Один фактический взлом, который я нашел, - это проект под названием 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 p >

Ответ 5

Я не видел никакого способа сделать это в API. Самое близкое, что я мог найти, - это получить последние 300 событий от общего пользователя (300 - это предел, к сожалению), а затем вы можете сортировать их для вкладов в другие репозитории.

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

Нам нужно попросить Github реализовать это в своем API.

Ответ 6

Я написал selenium python script, чтобы сделать это

"""
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 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 год активности, все, что вы можете получить с помощью этого script.

Ответ 7

С GraphQL API v4 теперь вы можете получить это предоставленное репо, используя:

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

Попробуйте в проводнике

Источник

Если у вас более 100 предоставленных репо (включая ваши), вам придется пройти через разбивку на страницы, указав after: "END_CURSOR_VALUE" в repositoriesContributedTo для следующего запроса

Ответ 8

В настоящее время GitHub API v3 не предоставляет способ получить текущую полосу пользователя.

Вы можете использовать это, чтобы рассчитать текущую полосу.

https://github.com/users/<username>/contributions.json