Skip to content

Instantly share code, notes, and snippets.

@altrive
Last active November 12, 2019 16:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save altrive/6400978 to your computer and use it in GitHub Desktop.
Save altrive/6400978 to your computer and use it in GitHub Desktop.
List GitHub PowerShell repositories using GitHub Search API.
function Main
{
#Execute Query(Note:Github Search API return up to 1000 results for each search.)
$results = Find-GitHubRepository -Filter "language:powershell+created:>=2013-12-01&sort=stars" -Verbose
#Show Results
Write-Host ("Total Repositry Count : {0}" -f $results.total_count)
Write-Host ("Returned Repository Count: {0}" -f $results.items.Count)
$selectedItems = $results.items | select name, description, html_url, fork | Out-GridView -OutputMode Multiple
foreach ($item in $selectedItems){
[Diagnostics.Process]::Start($item.html_url) > $null
sleep 1
}
}
function Find-GitHubRepository
{
[CmdletBinding()]
param (
[string] $Filter
)
$ErrorActionPreference = "Stop"
$requestUrl = "https://api.github.com/search/repositories?q={0}&page=1&per_page=100" -f $Filter #Max per_page value is 100
:while while ($true)
{
$request = [Net.WebRequest]::CreateHttp($requestUrl)
$request.Method = "Get"
$request.UserAgent = "Find-GitHubRepository-App" #Required for Github REST API <http://developer.github.com/v3/#user-agent-required>
$request.Accept = "application/vnd.github.v3+json" #Required for Preview API
try {
try {
Write-Verbose ("QueryUrl: {0}" -f [Uri]::UnescapeDataString($requestUrl))
$response = [Net.HttpWebResponse] $request.GetResponse()
}
catch [Net.WebException]{
$response = $_.Exception.Response
}
switch ([int] $response.StatusCode)
{
"200"{
$stream = $response.GetResponseStream()
$sr = New-Object IO.StreamReader($stream)
$resultText = $sr.ReadToEnd()
$result = ConvertFrom-Json $resultText
$result | Write-Output
#TODO: handle "X-RateLimit-Reset" response appropriately
if ($response.Headers["X-RateLimit-Remaining"] -eq "0"){
Write-Verbose "X-RateLimit-Remaining is 0. wait 60 seconds"
sleep 60
}
if(($response.Headers -ne $null) -and ($response.Headers["Link"] -ne $null))
{
#Check next page URL
$links = $response.Headers["Link"].Split(",")
foreach ($link in $links)
{
if ($link.Trim() -match '^<(.*)>; rel="next"$')
{
$requestUrl = $matches[1]
continue while
}
}
}
break while #no nextpage
}
"403"{ #For unauthenticated requests, up to 5 requests per minute.
Write-Verbose "Exceed GitHub API RateLimit. wait 10 seconds"
sleep 10
continue
}
"404"{
break while;
}
"422"{
Write-Warning "Unexpected HttpResponseCode(422 Unprocessable Entity) returned, stop enumerate repository"
break while;
}
default{
throw "Unexpected HttpResponseCode:" + $response.StatusCode
}
}
}
finally {
if ($response -ne $null){
$response.Dispose()
}
if ($stream -ne $null){
$stream.Dispose()
}
if ($sr -ne $null){
$sr.Dispose()
}
}
} #while
}
. Main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment