Hacker Public Radio

HPR3472: consuming an AQI API


Listen Later

AQI
Air Quality Index - measures particles in the air
Ozone
good at high altitudes
bad on the earth surface https://en.wikipedia.org/wiki/Ozone#Low_level_ozone
PM2.5
Particulate Matter, 2.5 micrometers https://en.wikipedia.org/wiki/Particulates#Size,_shape_and_solubility_matter
https://en.wikipedia.org/wiki/Particulates#Wildfire_smoke_risk
Getting AQI data
Determining air quality in my area is as simple as visiting https://www.airnow.gov and entering my zip code. Although my zip code covers 139.56 square miles, the result is accurate enough for my needs. When my zip code was submitted, the web page did not refresh. This means that the client interface made an API call to the backend server.
It sure would be nice if the AQI status was emailed to my phone every hour, if the AQI was above a certain threshold.
In order to get the data from the API, it is necessary to emulate the request made by the client to the API. This can be accomplished using Firefox.
open Firefox
go to https://www.airnow.gov
open the Firefox developer tools, either through the menu or with CTRL+SHIFT+i
in the dev tools, select the Network tab
enter the zip code in the form and submit
watch the Network tab for a POST request to https://airnowgovapi.com/reportingarea/get
click on the request in the network tab
Another set of tabs are now available to display various bits of information regarding the request. From this data, it is possible to recreate the query.
However, I took an even easier route, and right-clicked on the query in the Network tab, and selected Copy > Copy as cURL to get the request as a curl command complete with all necessary arguments prefilled. Since I didn't want to write my entire AQI fetching script in bash, I copied the curl command into a text file and ported the request to Ruby.
The Finished Script
#!/usr/bin/env ruby
require 'net/http'
require 'uri'
require 'json'
uri ="https://airnowgovapi.com/reportingarea/get"
parsed_uri = URI.parse(uri)
payload={latitude:39.88,longitude:-120.76,stateCode:'CA',maxDistance:50}
response = Net::HTTP.post_form(parsed_uri, payload)
data = JSON.parse(response.body)[0]
aqi=data["aqi"].to_i
category=data['category']
parameter=data['parameter']
output= "#{parameter}: #{aqi} - #{category}"
puts output
/opt/textjezra "#{output}"` if aqi > 70
...more
View all episodesView all episodes
Download on the App Store

Hacker Public RadioBy Hacker Public Radio

  • 4.2
  • 4.2
  • 4.2
  • 4.2
  • 4.2

4.2

34 ratings


More shows like Hacker Public Radio

View all
The Changelog: Software Development, Open Source by Changelog Media

The Changelog: Software Development, Open Source

290 Listeners

Defensive Security Podcast - Malware, Hacking, Cyber Security & Infosec by Jerry Bell and Andrew Kalat

Defensive Security Podcast - Malware, Hacking, Cyber Security & Infosec

372 Listeners

LINUX Unplugged by Jupiter Broadcasting

LINUX Unplugged

268 Listeners

SANS Internet Stormcenter Daily Cyber Security Podcast (Stormcast) by Johannes B. Ullrich

SANS Internet Stormcenter Daily Cyber Security Podcast (Stormcast)

651 Listeners

Curious Cases by BBC Radio 4

Curious Cases

822 Listeners

The Strong Towns Podcast by Strong Towns

The Strong Towns Podcast

423 Listeners

Late Night Linux by The Late Night Linux Family

Late Night Linux

164 Listeners

Darknet Diaries by Jack Rhysider

Darknet Diaries

8,061 Listeners

Cybersecurity Today by Jim Love

Cybersecurity Today

179 Listeners

CISO Series Podcast by David Spark, Mike Johnson, and Andy Ellis

CISO Series Podcast

189 Listeners

TechCrunch Daily Crunch by TechCrunch

TechCrunch Daily Crunch

42 Listeners

Strict Scrutiny by Crooked Media

Strict Scrutiny

5,797 Listeners

2.5 Admins by The Late Night Linux Family

2.5 Admins

98 Listeners

Cyber Security Headlines by CISO Series

Cyber Security Headlines

139 Listeners

What the Hack? by DeleteMe

What the Hack?

228 Listeners