301 redirect, Arduino

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
persika
EF Sponsor
Inlägg: 1349
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

301 redirect, Arduino

Inlägg av persika »

Jag har byggt med Arduino Mega och nätverksmodul W5100 så den hämtar hem elpriser från:
https://www.elprisetjustnu.se/api/v1/pr ... 1_SE4.json
Fick "elprisetjustnu" efter ett tips här på EF.
Det har funkat fint i ett parmånader nu, men plötsligt häromdan funkade det inte längre att ta hem elpriser.

När Arduinon går in på sidan:

Kod: Markera allt

https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json
Fås som svar:

Kod: Markera allt

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
När jag öppnar länken

Kod: Markera allt

https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json

med Firefox, då funkar det fint och man kommer till json-filen, den som Arduinon brukar läsa och sålla ut priserna ur.

Kod: Markera allt

[{"SEK_per_kWh":1.21747,"EUR_per_kWh":0.10659,"EXR":11.421985,"time_start":"2023-12-01T00:00:00+01:00","time_end":"2023-12-01T01:00:0.............
Alltså gör Firefox nåt "trolleritrick" och kommer till den rätta sidan, nåt som min Arduino inte gör.
Det är nog något med "nginx", men jag vet inte vad som ska göra, har googlat en hel del, men inte hittat nåt jag förstår hur jag ska göra.
Användarvisningsbild
ffredrik
Inlägg: 343
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: 301 redirect, Arduino

Inlägg av ffredrik »

Märkligt. Jag läser med node-red från samma site med samma url och har inga problem.
Användarvisningsbild
rvl
Inlägg: 5815
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: 301 redirect, Arduino

Inlägg av rvl »

Säker på att Arduinon har httpS i adressen?
Testede i powershell med curl.

Kod: Markera allt

> curl.exe http://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json -v
*   Trying 174.138.11.145:80...
* Connected to www.elprisetjustnu.se (174.138.11.145) port 80
> GET /api/v1/prices/2023/12-01_SE4.json HTTP/1.1
> Host: www.elprisetjustnu.se
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Thu, 30 Nov 2023 20:26:40 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json
<
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host www.elprisetjustnu.se left intact
Med https kommer önskat resultat, men arduinon gör tydligen inte redirecten automagiskt.

Kod: Markera allt

> curl.exe https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json -v
*   Trying 174.138.11.145:443...
* Connected to www.elprisetjustnu.se (174.138.11.145) port 443
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.1
> GET /api/v1/prices/2023/12-01_SE4.json HTTP/1.1
> Host: www.elprisetjustnu.se
> User-Agent: curl/8.4.0
> Accept: */*
>
* schannel: failed to decrypt data, need more data
< HTTP/1.1 200 OK
< Server: nginx
< Date: Thu, 30 Nov 2023 20:30:35 GMT
< Content-Type: application/json
< Content-Length: 3404
< Connection: keep-alive
< Vary: Accept-Encoding
< Last-Modified: Thu, 30 Nov 2023 12:01:25 GMT
< ETag: "d4c-60b5d693a1621"
< access-control-allow-origin: *
< access-control-expose-headers: *
< cache-control: public, max-age=604800
< cross-origin-resource-policy: cross-origin
< Age: 1736
< X-Cache: HIT
< Accept-Ranges: bytes
<
[{"SEK_per_kWh":1.21747,"EUR_per_kWh":0.10659,"EXR":11.421985,"time_start":"2023-12-01T00:00:00+01:00","time_end":"2023-12-01T01:00:00+01:00"},...
Användarvisningsbild
hawkan
Inlägg: 2636
Blev medlem: 14 augusti 2011, 10:27:40

Re: 301 redirect, Arduino

Inlägg av hawkan »

Så verkar det vara, alltså http isf https
Såhär blir det med wget -S

Kod: Markera allt

$ wget -S http://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json
--2023-12-01 00:00:15--  http://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json
Slår upp www.elprisetjustnu.se (www.elprisetjustnu.se)... 174.138.11.145
Ansluter till www.elprisetjustnu.se (www.elprisetjustnu.se)|174.138.11.145|:80... ansluten.
HTTP-begäran skickad, väntar på svar...
  HTTP/1.1 301 Moved Permanently
  Server: nginx
  Date: Thu, 30 Nov 2023 23:00:15 GMT
  Content-Type: text/html
  Content-Length: 162
  Connection: keep-alive
  Location: https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json
Adress: https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json [följer]
--2023-12-01 00:00:15--  https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json
Ansluter till www.elprisetjustnu.se (www.elprisetjustnu.se)|174.138.11.145|:443... ansluten.
HTTP-begäran skickad, väntar på svar...
  HTTP/1.1 200 OK
  Server: nginx
  Date: Thu, 30 Nov 2023 23:00:15 GMT
  Content-Type: application/json
  Content-Length: 3404
  Connection: keep-alive
  Vary: Accept-Encoding
  Last-Modified: Thu, 30 Nov 2023 12:01:25 GMT
  ETag: "d4c-60b5d693a1621"
  access-control-allow-origin: *
  access-control-expose-headers: *
  cache-control: public, max-age=604800
  cross-origin-resource-policy: cross-origin
  Age: 10716
  X-Cache: HIT
  Accept-Ranges: bytes
Längd: 3404 (3,3K) [application/json]
Sparar till: "12-01_SE4.json.1"

12-01_SE4.json.1                      100%[========================================================================>]   3,32K  --.-KB/s    om 0s

2023-12-01 00:00:15 (28,8 MB/s) - "12-01_SE4.json.1" sparades [3404/3404]

webbläsare verkar automatiskt ansluta till den utpekade adressen. Det är nog något steg som inte visas ovan men men.
persika
EF Sponsor
Inlägg: 1349
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: 301 redirect, Arduino

Inlägg av persika »

Nu har jag testat utan "s". Det blev precis samma svar:

Kod: Markera allt

http://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json


<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
Så nu vet jag inte hur jag ska göra för att komma åt json-filen ?
Användarvisningsbild
rvl
Inlägg: 5815
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: 301 redirect, Arduino

Inlägg av rvl »

Ja, med http utan s, så blir det garanterat så, med s ska det inte bli. (Du printar inte ut headerinformationen, där
Location:
säger vart man ska redirecta.)
Du måste hitta ett bibliotek som stöder https med kryptering och hela faderullan. Kontakten ska gå till port 443, inte 80.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: 301 redirect, Arduino

Inlägg av sodjan »

Kanske lista vilka verktyg som har använts för att bygga Arduino lösningen.
Eller kolla själv i deras dokumentation om de stöder redirect och krypterad trafik.
Har den ens stöd för SSL och krypterad trafik?
Och frågan som du inte har svarat på: "Säker på att Arduinon har httpS i adressen?".

Se vidare om "301 Moved Permanently": https://en.wikipedia.org/wiki/HTTP_301
Användarvisningsbild
rvl
Inlägg: 5815
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: 301 redirect, Arduino

Inlägg av rvl »

Arduinon ser ut att vara Mega, så då borde åtminstone minnet räcka till. Hade det varit UNO, så tror jag det är tveksammare att hitta SSLClientbibliotek som får plats.
persika
EF Sponsor
Inlägg: 1349
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: 301 redirect, Arduino

Inlägg av persika »

Här är källkoden Arduino Mega och W5100.

Kod: Markera allt


#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

char ServerStr[] = "www.elprisetjustnu.se";    

IPAddress ip(192, 168, 0, 150);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;


void setup() 
{
Serial.begin(9600);
Serial.println("Start");

Ethernet.begin(mac, ip);
// give the Ethernet shield a second to initialize:
delay(1000);

Serial.print("connecting to ");
Serial.print(ServerStr);
Serial.println("...");

// if you get a connection, report back via serial:
if (client.connect(ServerStr, 80)) 
  {
  Serial.print("connected to ");
  Serial.println(client.remoteIP());
  Serial.println();
  // Make a HTTP request:
  client.println("GET https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json HTTP/1.1");
  client.println("Host: www.elprisetjustnu.se");
  client.println("Connection: close");
  client.println();
  } 
else 
  // if you didn't get a connection to the server:
  Serial.println("connection failed");
  
delay(200);

while (client.available()) 
  {
  char c;
  c = client.read();
  Serial.print(c);
  }
  
client.stop();  
}


void loop() 
{
}


Och här är utskrift från serie-porten:

Kod: Markera allt

Start
connecting to www.elprisetjustnu.se...
connected to 174.138.11.145

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Fri, 01 Dec 2023 19:47:34 GMT
Content-Type: text/html
Content-Length: 162
Connection: close
Location: https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

persika
EF Sponsor
Inlägg: 1349
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: 301 redirect, Arduino

Inlägg av persika »

Var hittar man info om den nya adressen? borde ju finnas eftersom det är "redirect" .
agehall
Inlägg: 427
Blev medlem: 12 augusti 2020, 19:27:54

Re: 301 redirect, Arduino

Inlägg av agehall »

Ingenstans i din kod ser du ut att hantera SSL/TLS. Du ansluter direkt till serverns IP på TCP port 80 vilket är HTTP, inte HTTPS.

Med andra ord, implementera HTTPS så löser sig allt. Du lär behöva använda något bibliotek för detta (och troligen hela HTTP-hanteringen)
Användarvisningsbild
rvl
Inlägg: 5815
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: 301 redirect, Arduino

Inlägg av rvl »

persika skrev: 1 december 2023, 21:04:37 Var hittar man info om den nya adressen? borde ju finnas eftersom det är "redirect" .
Som tidigare nämnt finns detta bland headerinfofrmationen (i Location).

Kod: Markera allt

>
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Thu, 30 Nov 2023 20:26:40 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: https://www.elprisetjustnu.se/api/v1/prices/2023/12-01_SE4.json
<
Men ditt nuvarande bibliotek verkar inte kunna visa detta och än mindre reagera därefter. Men grundproblemet är som sagt avsaknaden av möjlighet till krypterad förbindelse.

Finns det nåt annat motsvarande API, som ännu inte kräver https?
Användarvisningsbild
hawkan
Inlägg: 2636
Blev medlem: 14 augusti 2011, 10:27:40

Re: 301 redirect, Arduino

Inlägg av hawkan »

Eftersom jag är så otroligt bra på att googla så delar jag med mej av länken här
https://www.circuits-diy.com/https-requ ... -tutorial/

Och om du inte har sjunkit för djupt in i atmegan föreslår jag att du byter till esp8266 eller esp32, de är mycket bättre på nätverkning och fungerar utmärkt i Arduino-miljö.
Användarvisningsbild
rvl
Inlägg: 5815
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: 301 redirect, Arduino

Inlägg av rvl »

Ja, kanske inte så dumt att fundera på ESP32, om det inte lätt går att hitta ett fungerande bibliotek.

Verkar som om lösningen ovan är starkt beroende av en nyare ethernetskjöld, som i sig är dyrare än en ESP...
Användarvisningsbild
hawkan
Inlägg: 2636
Blev medlem: 14 augusti 2011, 10:27:40

Re: 301 redirect, Arduino

Inlägg av hawkan »

Här är en kopia på BasicHttpsClient från esp32 exemplen. Man måste blanda in certifikat som är lite utanför vad jag kan men som sköts av webb-läsare automatiskt.
Den här koden fungerar för mej. måste såklart ställa in SSID och PASSWORD. Så lite mer komplicerat än en http get.

Kod: Markera allt

/**
   BasicHTTPSClient.ino

    Created on: 14.10.2018

*/

#include <Arduino.h>

#include <WiFi.h>
#include <WiFiMulti.h>

#include <HTTPClient.h>

#include <WiFiClientSecure.h>

// This is GandiStandardSSLCA2.pem, the root Certificate Authority that signed 
// the server certifcate for the demo server https://jigsaw.w3.org in this
// example. This certificate is valid until Sep 11 23:59:59 2024 GMT
const char* rootCACertificate = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIF6TCCA9GgAwIBAgIQBeTcO5Q4qzuFl8umoZhQ4zANBgkqhkiG9w0BAQwFADCB\n" \
"iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n" \
"cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n" \
"BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQw\n" \
"OTEyMDAwMDAwWhcNMjQwOTExMjM1OTU5WjBfMQswCQYDVQQGEwJGUjEOMAwGA1UE\n" \
"CBMFUGFyaXMxDjAMBgNVBAcTBVBhcmlzMQ4wDAYDVQQKEwVHYW5kaTEgMB4GA1UE\n" \
"AxMXR2FuZGkgU3RhbmRhcmQgU1NMIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n" \
"DwAwggEKAoIBAQCUBC2meZV0/9UAPPWu2JSxKXzAjwsLibmCg5duNyj1ohrP0pIL\n" \
"m6jTh5RzhBCf3DXLwi2SrCG5yzv8QMHBgyHwv/j2nPqcghDA0I5O5Q1MsJFckLSk\n" \
"QFEW2uSEEi0FXKEfFxkkUap66uEHG4aNAXLy59SDIzme4OFMH2sio7QQZrDtgpbX\n" \
"bmq08j+1QvzdirWrui0dOnWbMdw+naxb00ENbLAb9Tr1eeohovj0M1JLJC0epJmx\n" \
"bUi8uBL+cnB89/sCdfSN3tbawKAyGlLfOGsuRTg/PwSWAP2h9KK71RfWJ3wbWFmV\n" \
"XooS/ZyrgT5SKEhRhWvzkbKGPym1bgNi7tYFAgMBAAGjggF1MIIBcTAfBgNVHSME\n" \
"GDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUs5Cn2MmvTs1hPJ98\n" \
"rV1/Qf1pMOowDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD\n" \
"VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCIGA1UdIAQbMBkwDQYLKwYBBAGy\n" \
"MQECAhowCAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNl\n" \
"cnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNy\n" \
"bDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRy\n" \
"dXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZ\n" \
"aHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAWGf9\n" \
"crJq13xhlhl+2UNG0SZ9yFP6ZrBrLafTqlb3OojQO3LJUP33WbKqaPWMcwO7lWUX\n" \
"zi8c3ZgTopHJ7qFAbjyY1lzzsiI8Le4bpOHeICQW8owRc5E69vrOJAKHypPstLbI\n" \
"FhfFcvwnQPYT/pOmnVHvPCvYd1ebjGU6NSU2t7WKY28HJ5OxYI2A25bUeo8tqxyI\n" \
"yW5+1mUfr13KFj8oRtygNeX56eXVlogMT8a3d2dIhCe2H7Bo26y/d7CQuKLJHDJd\n" \
"ArolQ4FCR7vY4Y8MDEZf7kYzawMUgtN+zY+vkNaOJH1AQrRqahfGlZfh8jjNp+20\n" \
"J0CT33KpuMZmYzc4ZCIwojvxuch7yPspOqsactIGEk72gtQjbz7Dk+XYtsDe3CMW\n" \
"1hMwt6CaDixVBgBwAc/qOR2A24j3pSC4W/0xJmmPLQphgzpHphNULB7j7UTKvGof\n" \
"KA5R2d4On3XNDgOVyvnFqSot/kGkoUeuDcL5OWYzSlvhhChZbH2UF3bkRYKtcCD9\n" \
"0m9jqNf6oDP6N8v3smWe2lBvP+Sn845dWDKXcCMu5/3EFZucJ48y7RetWIExKREa\n" \
"m9T8bJUox04FB6b9HbwZ4ui3uRGKLXASUoWNjDNKD/yZkuBjcNqllEdjB+dYxzFf\n" \
"BT02Vf6Dsuimrdfp5gJ0iHRc2jTbkNJtUQoj1iM=\n" \
"-----END CERTIFICATE-----\n";

// Not sure if WiFiClientSecure checks the validity date of the certificate. 
// Setting clock just to be sure...
void setClock() {
  configTime(0, 0, "pool.ntp.org");

  Serial.print(F("Waiting for NTP time sync: "));
  time_t nowSecs = time(nullptr);
  while (nowSecs < 8 * 3600 * 2) {
    delay(500);
    Serial.print(F("."));
    yield();
    nowSecs = time(nullptr);
  }

  Serial.println();
  struct tm timeinfo;
  gmtime_r(&nowSecs, &timeinfo);
  Serial.print(F("Current time: "));
  Serial.print(asctime(&timeinfo));
}


WiFiMulti WiFiMulti;

void setup() {

  Serial.begin(115200);
  // Serial.setDebugOutput(true);

  Serial.println();
  Serial.println();
  Serial.println();

  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP("SSID", "PASSWORD");

  // wait for WiFi connection
  Serial.print("Waiting for WiFi to connect...");
  while ((WiFiMulti.run() != WL_CONNECTED)) {
    Serial.print(".");
  }
  Serial.println(" connected");

  setClock();  
}

void loop() {
  WiFiClientSecure *client = new WiFiClientSecure;
  if(client) {
    client -> setCACert(rootCACertificate);

    {
      // Add a scoping block for HTTPClient https to make sure it is destroyed before WiFiClientSecure *client is 
      HTTPClient https;
  
      Serial.print("[HTTPS] begin...\n");
      if (https.begin(*client, "https://jigsaw.w3.org/HTTP/connection.html")) {  // HTTPS
        Serial.print("[HTTPS] GET...\n");
        // start connection and send HTTP header
        int httpCode = https.GET();
  
        // httpCode will be negative on error
        if (httpCode > 0) {
          // HTTP header has been send and Server response header has been handled
          Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
  
          // file found at server
          if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
            String payload = https.getString();
            Serial.println(payload);
          }
        } else {
          Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
        }
  
        https.end();
      } else {
        Serial.printf("[HTTPS] Unable to connect\n");
      }

      // End extra scoping block
    }
  
    delete client;
  } else {
    Serial.println("Unable to create client");
  }

  Serial.println();
  Serial.println("Waiting 10s before the next round...");
  delay(10000);
}
Skriv svar