Using the Statuscake API with Powershell
2015, May 12
Having set up a few URL monitors with Statuscake, I needed to get the data out to start playing with it in Microsoft Excel/PowerQuery.
There are 3 sets of data that i’m extracting with the script below.
Location data
Test definition data
Test Performance data
On top of the basic API calls to Statuscake I wanted to enrich their Location data with actual Geo data that could be used in a BI visualisation. For this i’m using FreeGeoIP.
#Statuscake
$baseurl = "https://www.statuscake.com/API"
$testurl = "$baseurl/Tests/"
$locationsurl="$baseurl/Locations/json"
$username ="yourUsername"
$accesskey ="yourApiAccessKey"
$authHeaders = @{"Username"="$username";"API"="$accesskey"}
$outFolder = "C:statuscake"
$dateStr = get-date -Format "yyyyMMdd-HHmm"
#Get location data
Write-Host "Fetching remote location data"
$lResponse = Invoke-WebRequest $locationsurl -Headers $authHeaders
$rawLocations = $lResponse.content | ConvertFrom-Json
$locations = $rawLocations | gm -MemberType NoteProperty | ForEach-Object { $rawLocations."$($_.Name)" }
#Resolve geo-location info from IP address
Write-Host "Fetching geo-location data for Statuscake servers"
$locations | Add-Member -MemberType NoteProperty -Name "CountryCode" -Value ""
$locations | Add-Member -MemberType NoteProperty -Name "CountryName" -Value ""
$locations | Add-Member -MemberType NoteProperty -Name "RegionCode" -Value ""
$locations | Add-Member -MemberType NoteProperty -Name "RegionName" -Value ""
$locations | Add-Member -MemberType NoteProperty -Name "City" -Value ""
$locations | Add-Member -MemberType NoteProperty -Name "Zipcode" -Value ""
$locations | Add-Member -MemberType NoteProperty -Name "Latitude" -Value 0.0
$locations | Add-Member -MemberType NoteProperty -Name "Longitude" -Value 0.0
foreach($location in $locations) {
$geoUrl="http://freegeoip.net/xml/" + $location.ip
$geoResponse = Invoke-WebRequest $geoUrl -UseBasicParsing
$geoData = ([xml]$geoResponse.Content).Response
$location.CountryCode= $geoData.CountryCode
$location.CountryName= $geoData.CountryName
$location.RegionCode= $geoData.RegionCode
$location.RegionName= $geoData.RegionName
$location.City= $geoData.City
$location.Zipcode= $geoData.Zipcode
$location.Latitude= $geoData.Latitude
$location.Longitude= $geoData.Longitude
}
$locations | Export-Csv "$outFolderlocations.csv" -NoTypeInformation -force
#Get all tests
Write-Host "Fetching test definitions"
$hResponse = Invoke-WebRequest "$testurl$paramstring" -Headers $authHeaders
$allTests = $hResponse.content | ConvertFrom-Json
$allTests | Export-Csv "$outFolderalltests-$dateStr.csv" -NoTypeInformation
#Get perf data
foreach ($test in $allTests) {
Write-Host "Fetching perf data for: " $test.WebsiteName
$specificTestUrl = $testUrl + "Checks?TestID=" + $test.TestID + "&Fields=status,location,time,performance";
$hResponse = Invoke-WebRequest $specificTestUrl -Headers $authHeaders
$rawData = $hResponse.content | ConvertFrom-Json
$perfdata = $rawData | gm -MemberType NoteProperty | ForEach-Object { $rawData."$($_.Name)" }
$perfdata | Add-member -MemberType NoteProperty -Name "TestId" -Value $test.TestID
$perfdata | Add-member -MemberType NoteProperty -Name "DateTime" -value ""
$perfdata | Add-Member -MemberType NoteProperty -Name "LocationIP" -Value ""
foreach($perfItem in $perfdata) {
$perfItem.LocationIP = ($locations | Where-Object{$_.Servercode -eq $perfItem.Location} | Select-Object ip).ip
$perfItem.DateTime = [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($perfItem.Time))
}
$test | Add-Member -MemberType NoteProperty -Name "PerfData" -Value $perfdata
}
#output to csv
$alltests | Select-Object -ExpandProperty PerfData | Export-Csv "$outFolderperfdata-$dateStr.csv" -NoTypeInformation