2016-11-20 5 views
3

профилей пользователей на GitHub отображения количества вкладов пользователь сделал в прошлом году:Получить количество ежегодных взносов пользователей GitHub

Я хотел бы, чтобы отобразить эту информацию на моем сайте, предпочтительно без необходимости вводить какие-либо бэкэнд. Я искал его в нескольких местах. Ничто не указано в /users/(me)/. Если вы не очистите источник страницы, есть ли способ получить эту информацию? Я не вижу ничего документированного ...

ответ

1

Я решил проанализировать HTML-страницу моего профиля с помощью PHP. Я начинаю загрузку HTML для моей страницы профиля:

$githubProfile = file_get_contents('https://github.com/controversial'); 

рядом я нахожу положение фразы contributions in the last year на этой странице. Пробелы странны между contributions и in the last year, поэтому я использую регулярное выражение для соответствия любому пространству.

$contributionsIndex = preg_match(
    '/contributions\s+in the last year/', 
    $githubProfile, 
    $matches, 
    PREG_OFFSET_CAPTURE 
); 
$index = $matches[0][1]; 

Наконец, я итерацию назад с этого момента, пока я не наткнулся на символ, который не является ни числом или запятой в числе. Как только это условие становится ложным, я знаю, что я нашел начало номера:

$endIndex = $index; 

while (is_numeric($githubProfile[$index-2]) || $githubProfile[$index-2] == ',') 
    $index--; 

$contributionsCount = substr($githubProfile, $index-1, $endIndex-$index); 

Наконец, я эхо числа из (без запятых)

echo(str_replace(',', '', $contributionsCount)); 

Наконец, я использую вызов AJAX с моей страницы JavaScript, чтобы получить значение из скрипта PHP.

function get(url, callback) { 
    /* eslint-disable no-console */ 
    const xhr = new XMLHttpRequest(); 
    xhr.open('GET', url); 
    xhr.onload = e => (callback || console.log)(e.target.responseText); 
    xhr.onerror =() => console.log('error'); 
    xhr.send(); 
    /* eslint-enable no-console */ 
} 

// Fill in GitHub contributions count 
get('contributions-count.php', (resp) => { 
    document.getElementById('gh-contributions-count').innerText = resp; 
}); 

Я уверен, что это будет выполнимо более чисто в будущем с GraphQL API GitHub, но это все еще в стадии предварительного просмотра.

1

Вы видели GithubAPI? Используя его, вы можете запустить запрос из своего js-файла без использования каких-либо бэкэнд.

Для вашей цели, я думаю, вы могли бы использовать следующий запрос https://api.github.com/users/yourUserName/events. Это дает вам результат, список событий, связанных с youUserName.

например

[ 
     { 
     "id": "xxxxxxx", 
     "type": "PushEvent", 
     "actor": {.......}, 
     "repo": {......}, 
     "payload": {.......}, 
     "public": true, 
     "created_at": "2016-11-17T21:33:15Z" 
     }, 
     ..... 
    ] 

Вы должны пройти через список и выбирать тип = PushEvent и created_at = Lastyear.

Надеюсь, это может вам помочь!


Update: эта услуга просто дает результаты в течение последних 3-х месяцев, так что другая возможность заключается в том, чтобы проверить (пользователи/имя пользователя/репо) и после этого проверить совершающее над ними (РЕПО/имя пользователя/repoName/commits)

+0

К сожалению, первый страница возвращается всего около 9 дней, а для анализа все, начиная с последней страницы, будет намного превышать лимиты скорости GitHub API. –

+1

Вы правы, это даст вам фиксации за последние 90 дней, я не видел ограничений в документации. Вы пытались получить свои репозитории (пользователи/имя пользователя/репозитории) и после этого проверить коммиты над ними (repos/username/repoName/commits)? – Alan

+0

Я мог бы попробовать это. Спасибо @Alan. –

1

Также можно проанализировать данные календаря svg с помощью анализатора xml и затем суммировать все записи data-count.Чтобы избежать CORS проблемы, вы можете использовать прокси-сервер, как urlreq жизни на http://urlreq.appspot.com/req:

const user = 'controversial'; 
 

 
fetch('https://urlreq.appspot.com/req?method=GET&url=https://github.com/users/' + user + '/contributions') 
 
    .then(function(response) { 
 
    return response.text(); 
 
    }) 
 
    .then(function(text) { 
 
    xmlDoc = new DOMParser().parseFromString(text, 'text/xml'); 
 
    var nodes = xmlDoc.getElementsByTagName('rect'); 
 
    var count = 0; 
 
    for (var i = 0; i < nodes.length; i++) { 
 
     count += parseInt(nodes[i].getAttribute('data-count')); 
 
    } 
 
    console.log('contributions count : ' + count); 
 
    }) 
 
    .catch(function(error) { 
 
    console.log('Request failed', error) 
 
    });

Другой пример использования командной строки с & можно найти here

 Смежные вопросы

  • Нет связанных вопросов^_^