This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

Weather info yr.no new API
#1
Hi,

service yr.no now use new API and advice use .json format for weather data reading. .xml will not supported anymore from start of the next year.

Info here: https://developer.yr.no/doc/

May be some created script based on .json and new API?

I just tried to read data for me and receive error:

link to info with .json:          https://api.met.no/weatherapi/locationfo...ltitude=13


Script I tried to read data:
Code:
require('json')
https = require('ssl.https')
escape = require('socket.url').escape
url = 'https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=67.8596&lon=35.0904&altitude=13'
url = string.format(url)
res = https.request(url)
log(res)
data = json.pdecode(res)
log(data)
if type(data) ~= 'table' then
  alert('failed to load weather data')
  return
end

if data.error then
  log('error', data.error)
  return
end


I received such error:

* string: 403 Forbidden

User-Agent header LuaSocket 2.0.2 is not allowed, use a unique identifier

What is incorrect in my trying?

BR,

Alex
Reply
#2
i tried it got the same error, looking at the documents it say "that you must send a unique identifier in the User-Agent header. Any requests with a prohibited or missing User-Agent will receive a 403 Forbidden error."

i don't know how to pass the headers with socket.url but i tried it with http.request, like the below with the User-Agent header, it returns the data

Code:
function get_request(url)

  local http, ltn12, sink, res, err

  ltn12 = require('ltn12')
  http = require('socket.http')
 
  sink = {}

  res, err = http.request({
      url = url,
      method = 'GET',
      headers =
    {
      ["Accept"] = "*/*",
      ["User-Agent"] = "1234567897",  -- i think this can be any number?
    },
    sink = ltn12.sink.table(sink)
  })

  if sink then   
    return table.concat(sink)
  else
    return nil, err
  end
end

x = get_request('https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=67.8596&lon=35.0904&altitude=13')
log(x)
Reply
#3
You can override default user agent like this. This example uses LM MAC address to create a unique number for the user agent string.
Code:
json = require('json')
http = require('socket.http')
url = 'https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=67.8596&lon=35.0904&altitude=13'
mac = 0
io.readfile('/sys/class/net/eth0/address'):gsub('%x%x', function(v)
  mac = mac * 256 + tonumber(v, 16)
end)
http.USERAGENT = 'LM ' .. mac
res, err = http.request(url)
log(res, err)
Reply
#4
Super,

thank you Admin
Reply


Forum Jump: