PHP / buienradar JSON

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ElMacaroni
  • Registratie: November 2012
  • Laatst online: 12-08 12:01

ElMacaroni

Laat de zon maar komen!

Topicstarter
Sinds een week werkt het mbv JSON uitlezen van de actuele buienradar data niet meer.
Ik kan niet vinden waar het aan ligt.
...

Gebruikte code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php

//  Initiate curl session
$handle = curl_init();
// Set the url
curl_setopt($handle, CURLOPT_URL,"https://data.buienradar.nl/2.0/feed/json");

// Will return the response, if false it prints the response
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);

// Execute the session and store the contents in $result
$result=curl_exec($handle);

// Closing the session
curl_close($handle);

var_dump(json_decode($result));

// echo "${result}";
$parsed_json = json_decode($result);

echo "<p>"; 

 switch (json_last_error()) {
        case JSON_ERROR_NONE:
//            echo ' - No errors';
        break;
        case JSON_ERROR_DEPTH:
            echo ' - Maximum stack depth exceeded';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Underflow or the modes mismatch';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Unexpected control character found';
        break;
        case JSON_ERROR_SYNTAX:
            echo ' - Syntax error, malformed JSON';
        break;
        case JSON_ERROR_UTF8:
            echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
        default:
            echo ' - Unknown error';
        break;
    }

echo "</p>"; 

//Index wisselt nog wel eens...

$index = 40;

$timestamp = $parsed_json->actual->stationmeasurements[$index]->timestamp;
$station = $parsed_json->actual->stationmeasurements[$index]->stationname;
$airpressure = $parsed_json->actual->stationmeasurements[$index]->airpressure;
$temperature = $parsed_json->actual->stationmeasurements[$index]->temperature;
$humidity = $parsed_json->actual->stationmeasurements[$index]->humidity;

// phpinfo();

?>


Resulteert nu in: - Syntax error, malformed JSON

...

Kale JSON string in jsonlint gestopt: "Valid JSON" ??

SE2200+14xSF170S & SE1500M+4xTSM-375

Beste antwoord (via ElMacaroni op 15-12-2020 00:19)


  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Oke, versie 2 met HTTP response code en SSL/TLS certificate chain.

debug-buienradar-v2.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php

// Output as plain text
header('Content-Type: text/plain; charset=UTF-8');

echo 'BUIENRADAR TEST SCRIPT' . PHP_EOL . PHP_EOL;

if ( extension_loaded('curl') === FALSE ) {
  echo '[error] curl extension is not available to PHP' . PHP_EOL;
  exit;
}

//  cURL handle
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL,"https://data.buienradar.nl/2.0/feed/json");
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_CERTINFO, true);
$result = curl_exec($handle);
curl_close($handle);

if ($result === FALSE) {
  echo '[error] curl was unable to retrieve the given URL' . PHP_EOL;
  echo 'cURL error message:' . PHP_EOL;
  echo curl_error($handle) . PHP_EOL;
  exit;
}

if ( extension_loaded('json') === FALSE ) {
  echo '[error] json extension is not available to PHP' . PHP_EOL;
  exit;
}

$parsed_json = json_decode($result);

if ( ($error_code = json_last_error()) !== JSON_ERROR_NONE ) {
  echo '[error] parsing JSON failed' . PHP_EOL;
  echo 'JSON extension error message:' . PHP_EOL;

  switch ($error_code) {
    case JSON_ERROR_DEPTH:
      echo 'The maximum stack depth has been exceeded' . PHP_EOL;
      break;
    case JSON_ERROR_STATE_MISMATCH:
      echo 'Invalid or malformed JSON' . PHP_EOL;
      break;
    case JSON_ERROR_CTRL_CHAR:
      echo 'Control character error, possibly incorrectly encoded' . PHP_EOL;
      break;
    case JSON_ERROR_SYNTAX:
      echo 'Syntax error' . PHP_EOL;
      break;
    case JSON_ERROR_UTF8:
      echo 'Malformed UTF-8 characters, possibly incorrectly encoded' . PHP_EOL;
      break;
    case JSON_ERROR_RECURSION:
      echo 'One or more recursive references in the value to be encoded' . PHP_EOL;
      break;
    case JSON_ERROR_INF_OR_NAN:
      echo 'One or more NAN or INF values in the value to be encoded' . PHP_EOL;
      break;
    case JSON_ERROR_UNSUPPORTED_TYPE:
      echo 'A value of a type that cannot be encoded was given' . PHP_EOL;
      break;
    case JSON_ERROR_INVALID_PROPERTY_NAME:
      echo 'A property name that cannot be encoded was given' . PHP_EOL;
      break;
    case JSON_ERROR_UTF16:
      echo 'Malformed UTF-16 characters, possibly incorrectly encoded' . PHP_EOL;
      break;
  }

  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] SSL/TLS certificate chain: ' . PHP_EOL;
  print_r(curl_getinfo($handle, CURLINFO_CERTINFO));
  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] cURL HTTP response code: ' . curl_getinfo($handle, CURLINFO_HTTP_CODE) . PHP_EOL;
  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] Below this line is the output from cURL, this was the input for JSON that failed:' . PHP_EOL;
  echo $result;
  exit;
}

// Index 40 geeft hetvolgende aan in de JSON data set
// 40
//   $id              "44"
//   stationid      6290
//   stationname      "Meetstation Twente"
//   lat              52.27
//   lon              6.9
// Het is logischer (omdat de index niet altijd naar Twente hoeft te wijzen)
// om de $id === "44" als test te gebruiken in een loop

$seek_meetstation_id = "44";
$meetstation = FALSE;
foreach ($parsed_json->actual->stationmeasurements as $meetstation_item) {
  if ($meetstation_item->{'$id'} === $seek_meetstation_id) {
    // found, write to variable
    $meetstation = $meetstation_item;
    break;
  }
}

if ( $meetstation === FALSE ) {
  echo '[error] station with $id ' . $seek_meetstation_id . ' not found in JSON data set' . PHP_EOL;
  exit;
}

// Als we hier zijn aangekomen is alles goed gegaan...
echo '[info] All test are OK; grab a coffee' . PHP_EOL;
echo 'vardump of $meetstation' . PHP_EOL;
var_dump($meetstation);

echo PHP_EOL . PHP_EOL;
echo 'the properties you want' . PHP_EOL;
$timestamp = $meetstation->timestamp;
$station = $meetstation->stationname;
$airpressure = $meetstation->airpressure;
$temperature = $meetstation->temperature;
$humidity = $meetstation->humidity;
echo 'Tijdstip: ' . $timestamp . PHP_EOL;
echo 'Meetstation: ' . $station . PHP_EOL;
echo 'Luchtdruk: ' . $airpressure . PHP_EOL;
echo 'Temperatuur: ' . $temperature . PHP_EOL;
echo 'Luchtvochtigheid: ' . $humidity . PHP_EOL;


En dan de gewenste output (chain + response code), het BEGIN/END CERTIFICATE gedeelte heb ik ingekort. Je kunt aan die paar regels ook wel zien of ie anders is of niet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
[info] SSL/TLS certificate chain: 
Array
(
    [0] => Array
        (
            [Subject] => C = NL, ST = Noord-Holland, L = Hilversum, O = RTL Nederland B.V., OU = Weer en Verkeer, CN = www.buienradar.nl
            [Issuer] => C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
            [Version] => 2
            [Serial Number] => 0bcc07475a3c6b6ddfd7e51643d70ffe
            [Signature Algorithm] => sha256WithRSAEncryption
            [Public Key Algorithm] => rsaEncryption
            [X509v3 Authority Key Identifier] => keyid:0F:80:61:1C:82:31:61:D5:2F:28:E7:8D:46:38:B4:2C:E1:C6:D9:E2
            [X509v3 Subject Key Identifier] => 19:CC:45:9E:A3:04:60:A5:A6:A4:6F:4C:E0:BB:82:CC:9D:DE:19:74
            [X509v3 Subject Alternative Name] => DNS:www.buienradar.nl,DNS:buienradar.nl,DNS:*.buienradar.be,DNS:*.buienradar.nl,DNS:buienradar.be
            [X509v3 Key Usage] => DigitalSignature,KeyEncipherment
            [X509v3 Extended Key Usage] => TLSWebServerAuthentication,TLSWebClientAuthentication
            [X509v3 CRL Distribution Points] => , FullName:, URI:http://crl3.digicert.com/ssca-sha2-g6.crl, 
FullName:, URI:http://crl4.digicert.com/ssca-sha2-g6.crl
            [X509v3 Certificate Policies] => Policy:2.16.840.1.114412.1.1, CPS:https://www.digicert.com/CPS, Policy:2.23.140.1.2.2
            [Authority Information Access] => OCSP-URI:http://ocsp.digicert.com, CAIssuers-URI:http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
            [X509v3 Basic Constraints] => CA:FALSE
            [CT Precertificate SCTs] => SignedCertificateTimestamp:, Version:v1(0x0), LogID:EE:4B:BD:B7:75:CE:60:BA:E1:42:69:1F:AB:E1:9E:66:, A3:0F:7E:5F:B0:72:D8:83:00:C4:7B:89:7A:A8:FD:CB, Timestamp:Jan1015:41:45.4112020GMT, Extensions:none, Signature:ecdsa-with-SHA256, 30:44:02:20:13:37:09:D4:11:B5:BA:C5:11:36:93:2E:, 93:80:5C:AD:80:CA:9F:B5:62:78:E5:0D:79:F5:67:C1:, 1D:FE:94:92:02:20:5B:F3:B9:A7:DE:9A:4F:97:48:65:, 25:8C:F0:0C:4D:12:9C:04:31:23:1D:AA:EA:C8:C2:28:, 47:98:AF:37:FD:5D, SignedCertificateTimestamp:, Version:v1(0x0), LogID:87:75:B
            [Start date] => Jan 10 00:00:00 2020 GMT
            [Expire date] => Mar 10 12:00:00 2021 GMT
            [RSA Public Key] => 2048
            [rsa(n)] => B0310E5AF3AC77139ACD4D62D27A6D669207998534888D569EE86C698CBCD248A00A1FEBE0D921C0FFA0248B55B6AAFA842A3125F1DABEFAF3BA5E765F5212DDEA71936B481618CC30EC90606DE6ED6DF45D567AAE7BD24A38DF1BCE4B6DA99A7680462A801DFFAC98FE1694F5B21D87F41BD7C0E41D1668ED95E981FCAB421977F09ACEEF6FEA7D70CE7B4413174FA1E724BC44293CE3FE62824F45B5EF063FB4795FBA121CB7BF6CDF0ADC62DF245DD961A7021DC5998D7CEAD1B4E790C6AA0341F3AF6CC75BCE7F4857F345499EFE5E35DEE53E3A872E51D171C697DCFD0A1179360F12E1ABED867757F5701624C30E781FB3DFEB4009249DFEAA9881C643
            [rsa(e)] => 10001
            [Signature] => 16:69:d8:95:95:e9:4b:55:0f:05:6d:54:dd:3f:f7:f0:eb:c2:e5:81:87:53:d0:e1:50:c4:ee:19:4c:58:2a:5d:bf:b8:83:3a:df:ea:1f:bc:54:79:a2:f6:f4:ce:46:ec:2f:4d:0d:74:fd:4c:86:0f:5b:41:1a:41:d9:85:68:eb:41:7e:fb:27:cd:cb:78:cd:ff:7e:b1:d2:1e:e1:2d:82:7f:13:e2:95:5a:4f:6a:31:66:5c:20:7c:b5:2f:e0:e7:22:0e:da:d5:42:b1:34:64:9b:b4:2f:da:0c:34:45:c0:2c:42:97:ae:25:1a:22:5e:61:50:18:11:61:d8:99:90:2d:d3:11:ec:b0:e0:cb:58:4d:d9:4e:7a:de:57:f6:ec:d5:57:79:16:f2:d0:36:79:b7:12:25:72:f2:f0:39:00:0d:da:71:33:07:45:05:17:75:7a:e6:c2:56:d5:37:8a:a2:b3:87:b8:a5:95:21:b4:9a:2c:4d:40:81:d6:33:2d:18:e1:2f:0f:d9:32:e0:4a:b0:e2:29:39:6f:02:2d:e5:75:c1:0e:af:56:93:b4:01:e6:26:a0:2e:3c:06:0a:61:a5:84:08:4b:19:3c:4e:5d:a4:64:04:a1:e9:8a:33:03:0d:c6:3a:3b:dc:13:bb:5f:5e:86:5d:85:4f:85:b0:1a:
            [Cert] => -----BEGIN CERTIFICATE-----
MIIGgzCCBWugAwIBAgIQC8wHR1o8a23f1+UWQ9cP/jANBgkqhkiG9w0BAQsFADBN
...
JqAuPAYKYaWECEsZPE5dpGQEoemKMwMNxjo73BO7X16GXYVPhbAa
-----END CERTIFICATE-----

        )

    [1] => Array
        (
            [Subject] => C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
            [Issuer] => C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
            [Version] => 2
            [Serial Number] => 01fda3eb6eca75c888438b724bcfbc91
            [Signature Algorithm] => sha256WithRSAEncryption
            [Public Key Algorithm] => rsaEncryption
            [X509v3 Basic Constraints] => CA:TRUE,pathlen:0
            [X509v3 Key Usage] => DigitalSignature,CertificateSign,CRLSign
            [Authority Information Access] => OCSP-URI:http://ocsp.digicert.com
            [X509v3 CRL Distribution Points] => , FullName:, URI:http://crl3.digicert.com/DigiCertGlobalRootCA.crl, 
FullName:, URI:http://crl4.digicert.com/DigiCertGlobalRootCA.crl
            [X509v3 Certificate Policies] => Policy:X509v3AnyPolicy, CPS:https://www.digicert.com/CPS
            [X509v3 Subject Key Identifier] => 0F:80:61:1C:82:31:61:D5:2F:28:E7:8D:46:38:B4:2C:E1:C6:D9:E2
            [X509v3 Authority Key Identifier] => keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55
            [Start date] => Mar  8 12:00:00 2013 GMT
            [Expire date] => Mar  8 12:00:00 2023 GMT
            [RSA Public Key] => 2048
            [rsa(n)] => DCAE58904DC1C4301590355B6E3C8215F52C5CBDE3DBFF7143FA642580D4EE18A24DF066D00A736E1198361764AF379DFDFA4184AFC7AF8CFE1A734DCF339790A2968753832BB9A675482D1D56377BDA31321AD7ACAB06F4AA5D4BB74746DD2A93C3902E798080EF13046A143BB59B92BEC207654EFCDAFCFF7AAEDC5C7E55310CE83907A4D7BE2FD30B6AD2B1DF5FFE5774533B3580DDAE8E4498B39F0ED3DAE0D7F46B29AB44A74B58846D924B81C3DA738B129748900445751ADD37319792E8CD540D3BE4C13F395E2EB8F35C7E108E8641008D456647B0A165CEA0AA29094EF397EBE82EAB0F72A7300EFAC7F4FD1477C3A45B2857C2B3F982FDB745589B
            [rsa(e)] => 10001
            [Signature] => 23:3e:df:4b:d2:31:42:a5:b6:7e:42:5c:1a:44:cc:69:d1:68:b4:5d:4b:e0:04:21:6c:4b:e2:6d:cc:b1:e0:97:8f:a6:53:09:cd:aa:2a:65:e5:39:4f:1e:83:a5:6e:5c:98:a2:24:26:e6:fb:a1:ed:93:c7:2e:02:c6:4d:4a:bf:b0:42:df:78:da:b3:a8:f9:6d:ff:21:85:53:36:60:4c:76:ce:ec:38:dc:d6:51:80:f0:c5:d6:e5:d4:4d:27:64:ab:9b:c7:3e:71:fb:48:97:b8:33:6d:c9:13:07:ee:96:a2:1b:18:15:f6:5c:4c:40:ed:b3:c2:ec:ff:71:c1:e3:47:ff:d4:b9:00:b4:37:42:da:20:c9:ea:6e:8a:ee:14:06:ae:7d:a2:59:98:88:a8:1b:6f:2d:f4:f2:c9:14:5f:26:cf:2c:8d:7e:ed:37:c0:a9:d5:39:b9:82:bf:19:0c:ea:34:af:00:21:68:f8:ad:73:e2:c9:32:da:38:25:0b:55:d3:9a:1d:f0:68:86:ed:2e:41:34:ef:7c:a5:50:1d:bf:3a:f9:d3:c1:08:0c:e6:ed:1e:8a:58:25:e4:b8:77:ad:2d:6e:f5:52:dd:b4:74:8f:ab:49:2e:9d:3b:93:34:28:1f:78:ce:94:ea:c7:bd:d3:c9:6d:1c:de:5c:32:f3:
            [Cert] => -----BEGIN CERTIFICATE-----
MIIElDCCA3ygAwIBAgIQAf2j627KdciIQ4tyS8+8kTANBgkqhkiG9w0BAQsFADBh
...
c+LJMto4JQtV05od8GiG7S5BNO98pVAdvzr508EIDObtHopYJeS4d60tbvVS3bR0
j6tJLp07kzQoH3jOlOrHvdPJbRzeXDLz
-----END CERTIFICATE-----

        )

)

[info] cURL HTTP response code: 200

[ Voor 61% gewijzigd door Mr. HTTP op 14-12-2020 23:46 ]

Alle reacties


Acties:
  • +1 Henk 'm!

  • webfreakz.nl
  • Registratie: November 2003
  • Laatst online: 28-07 10:40

webfreakz.nl

el-nul-zet-é-er

Ik heb het volgende op jouw regel 60 (phpinfo) gezet en je var_dump (regel 17) van de hele JSON uitgeschakeld:

PHP:
1
var_dump($timestamp, $station, $airpressure, $temperature, $humidity);


Output:
user@host:/var/tmp/buienradar$ php orig.php
<p></p>/var/tmp/buienradar/orig.php:60:
string(19) "2020-12-13T18:10:00"
/var/tmp/buienradar/orig.php:60:
string(18) "Meetstation Twente"
/var/tmp/buienradar/orig.php:60:
double(1009.9)
/var/tmp/buienradar/orig.php:60:
double(5.8)
/var/tmp/buienradar/orig.php:60:
double(91)


Werkt hier wel? :)

"You smell that, son? What sir? Napalm, I love the smell of napalm in the mornin!" || Children of Bodom fan!


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 12-08 18:34

Matis

Rubber Rocket

In de browser werkt het ook "gewoon"
https://data.buienradar.nl/2.0/feed/json

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • ElMacaroni
  • Registratie: November 2012
  • Laatst online: 12-08 12:01

ElMacaroni

Laat de zon maar komen!

Topicstarter
webfreakz.nl schreef op zondag 13 december 2020 @ 18:39:
Ik heb het volgende op jouw regel 60 (phpinfo) gezet en je var_dump (regel 17) van de hele JSON uitgeschakeld:

PHP:
1
var_dump($timestamp, $station, $airpressure, $temperature, $humidity);


Output:
user@host:/var/tmp/buienradar$ php orig.php
<p></p>/var/tmp/buienradar/orig.php:60:
string(19) "2020-12-13T18:10:00"
/var/tmp/buienradar/orig.php:60:
string(18) "Meetstation Twente"
/var/tmp/buienradar/orig.php:60:
double(1009.9)
/var/tmp/buienradar/orig.php:60:
double(5.8)
/var/tmp/buienradar/orig.php:60:
double(91)


Werkt hier wel? :)
toon volledige bericht
Sja, hier niet... althans het werkt niet op 2 machines, (var_dump : NULL) maar wel vanaf mijn thuisPC.

Houdt Buienradar dat bij, als je (te vaak) de JSON opvraagt dat je dan ge-blacklist wordt?
Zo hebik 'm ook in JSONlint gemikt.

SE2200+14xSF170S & SE1500M+4xTSM-375


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ElMacaroni schreef op zondag 13 december 2020 @ 19:33:
[...]


Sja, hier niet... althans het werkt niet op 2 machines, (var_dump : NULL) maar wel vanaf mijn thuisPC.

Houdt Buienradar dat bij, als je (te vaak) de JSON opvraagt dat je dan ge-blacklist wordt?
Als je dan even goed logt wat voor response je krijgt, bijvoorbeeld een 403 forbidden, dan weet je dat je geblocked bent. Ieder geval zul je meer moeten kijken wat er mis gaat want "Het doet het niet" is wel erg summier ;)
Resulteert nu in: - Syntax error, malformed JSON
Zorg dan tenminste dat je de malformed JSON logt o.i.d.

[ Voor 10% gewijzigd door Woy op 13-12-2020 20:33 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • +1 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Ik heb een debug/test-script geschreven voor je zodat je kunt achterhalen waar het mis gaat.
Wellicht reikt je kennis van programmeren nog niet ver genoeg dus voor nu en in de toekomst;

Plaats het volgende script op je server (waar je het wil testen) en bezoek het via jouw browser
Voorbeeld; http://mijndomain.nl/pad/naar/debug-buienradar.php

debug-buienradar.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php

// Output as plain text
header('Content-Type: text/plain; charset=UTF-8');

echo 'BUIENRADAR TEST SCRIPT' . PHP_EOL . PHP_EOL;

if ( extension_loaded('curl') === FALSE ) {
  echo '[error] curl extension is not available to PHP' . PHP_EOL;
  exit;
}

//  cURL handle
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL,"https://data.buienradar.nl/2.0/feed/json");
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($handle);
curl_close($handle);

if ($result === FALSE) {
  echo '[error] curl was unable to retrieve the given URL' . PHP_EOL;
  echo 'cURL error message:' . PHP_EOL;
  echo curl_error($handle) . PHP_EOL;
  exit;
}

if ( extension_loaded('json') === FALSE ) {
  echo '[error] json extension is not available to PHP' . PHP_EOL;
  exit;
}

$parsed_json = json_decode($result);

if ( ($error_code = json_last_error()) !== JSON_ERROR_NONE ) {
  echo '[error] parsing JSON failed' . PHP_EOL;
  echo 'JSON extension error message:' . PHP_EOL;

  switch ($error_code) {
    case JSON_ERROR_DEPTH:
      echo 'The maximum stack depth has been exceeded' . PHP_EOL;
      break;
    case JSON_ERROR_STATE_MISMATCH:
      echo 'Invalid or malformed JSON' . PHP_EOL;
      break;
    case JSON_ERROR_CTRL_CHAR:
      echo 'Control character error, possibly incorrectly encoded' . PHP_EOL;
      break;
    case JSON_ERROR_SYNTAX:
      echo 'Syntax error' . PHP_EOL;
      break;
    case JSON_ERROR_UTF8:
      echo 'Malformed UTF-8 characters, possibly incorrectly encoded' . PHP_EOL;
      break;
    case JSON_ERROR_RECURSION:
      echo 'One or more recursive references in the value to be encoded' . PHP_EOL;
      break;
    case JSON_ERROR_INF_OR_NAN:
      echo 'One or more NAN or INF values in the value to be encoded' . PHP_EOL;
      break;
    case JSON_ERROR_UNSUPPORTED_TYPE:
      echo 'A value of a type that cannot be encoded was given' . PHP_EOL;
      break;
    case JSON_ERROR_INVALID_PROPERTY_NAME:
      echo 'A property name that cannot be encoded was given' . PHP_EOL;
      break;
    case JSON_ERROR_UTF16:
      echo 'Malformed UTF-16 characters, possibly incorrectly encoded' . PHP_EOL;
      break;
  }

  echo PHP_EOL;
  echo '[info] Below this line is the output from cURL, this was the input for JSON that failed:' . PHP_EOL;
  echo $result;
  exit;
}

// Index 40 geeft hetvolgende aan in de JSON data set
// 40
//   $id              "44"
//   stationid      6290
//   stationname      "Meetstation Twente"
//   lat              52.27
//   lon              6.9
// Het is logischer (omdat de index niet altijd naar Twente hoeft te wijzen)
// om de $id === "44" als test te gebruiken in een loop

$seek_meetstation_id = "44";
$meetstation = FALSE;
foreach ($parsed_json->actual->stationmeasurements as $meetstation_item) {
  if ($meetstation_item->{'$id'} === $seek_meetstation_id) {
    // found, write to variable
    $meetstation = $meetstation_item;
    break;
  }
}

if ( $meetstation === FALSE ) {
  echo '[error] station with $id ' . $seek_meetstation_id . ' not found in JSON data set' . PHP_EOL;
  exit;
}

// Als we hier zijn aangekomen is alles goed gegaan...
echo '[info] All test are OK; grab a coffee' . PHP_EOL;
echo 'vardump of $meetstation' . PHP_EOL;
var_dump($meetstation);

echo PHP_EOL . PHP_EOL;
echo 'the properties you want' . PHP_EOL;
$timestamp = $meetstation->timestamp;
$station = $meetstation->stationname;
$airpressure = $meetstation->airpressure;
$temperature = $meetstation->temperature;
$humidity = $meetstation->humidity;
echo 'Tijdstip: ' . $timestamp . PHP_EOL;
echo 'Meetstation: ' . $station . PHP_EOL;
echo 'Luchtdruk: ' . $airpressure . PHP_EOL;
echo 'Temperatuur: ' . $temperature . PHP_EOL;
echo 'Luchtvochtigheid: ' . $humidity . PHP_EOL;
?>

Acties:
  • 0 Henk 'm!

  • ElMacaroni
  • Registratie: November 2012
  • Laatst online: 12-08 12:01

ElMacaroni

Laat de zon maar komen!

Topicstarter
Helemaal geweldig!
Uitkomst:

<knip>

BUIENRADAR TEST SCRIPT

[error] parsing JSON failed
JSON extension error message:
Syntax error

[info] Below this line is the output from cURL, this was the input for JSON that failed:
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http://data.buienradar.nl/2.0/feed/json" on this server.<P>
Reference #18.7da1dd58.1607980250.6253e98f
</BODY>
</HTML>

</knip>

Nu de vraag, waarom?
Die zal ik aan Buienradar moeten stellen denk ik...

SE2200+14xSF170S & SE1500M+4xTSM-375


Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 13:11
Hoe vaak haal je de data bij ze op? Er zal een fair use policy op zitten lijkt mij. Elke minuut nieuwe data ophalen bijv. lijkt mij nogal overkill, elk kwartier is vaak zat met dergelijke gegevens.

Ik gebruik OpenWeatherMap, deze heeft een gratis API.

[ Voor 12% gewijzigd door ThinkPad op 14-12-2020 22:31 ]


Acties:
  • 0 Henk 'm!

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 12-08 11:36
Volgens https://www.buienradar.nl/overbuienradar/gratis-weerdata vinden ze 't fijn dat je wel aan een bronvermelding doet bij het gebruiken van de weerdata. Daar al aan gedacht?
Verder is de exacte reden van de 403 error enkel gissen, maar het kan bovenstaande zijn, al dan niet met een te hoge request rate. Daar zou je een berichtje aan kunnen wagen.

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 14:40

Nick_S

++?????++ Out of Cheese Error

code:
1
"Deze feed mag vrij worden gebruikt onder voorwaarde van bronvermelding buienradar.nl inclusief een hyperlink naar https://www.buienradar.nl. Aan de feed kunnen door gebruikers of andere personen geen rechten worden ontleend."

Niet alleen fijn, het is gewoon de gebruiksvoorwaarde.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 12-08 21:57
ElMacaroni schreef op maandag 14 december 2020 @ 22:22:
Helemaal geweldig!
Uitkomst:

<knip>

BUIENRADAR TEST SCRIPT

[error] parsing JSON failed
JSON extension error message:
Syntax error

[info] Below this line is the output from cURL, this was the input for JSON that failed:
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http://data.buienradar.nl/2.0/feed/json" on this server.<P>
Reference #18.7da1dd58.1607980250.6253e98f
</BODY>
</HTML>

</knip>

Nu de vraag, waarom?
Die zal ik aan Buienradar moeten stellen denk ik...
toon volledige bericht
Gezien de tekst zegt "on this server" vraag ik mij af of het wel buienradar is die je deze foutmelding geeft en er niet tussendoor een proxyserver/firewall zegt dat jij vanaf deze server niet naar buienradar mag. Zit er een partij tussen die de boel beheert en eventueel iets heeft dichtgegooid/blacklisted?

[ Voor 12% gewijzigd door Merethil op 14-12-2020 22:47 ]


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 15:51

AW_Bos

Liefhebber van nostalgie... 🕰️

(jarig!)
Mij lijkt dat een rate limit een error 429 zal uit moeten spugen, en geen 403 met een permission error.
Ik heb een vermoeden dat dit niet van Buienradar vandaan komt.

☀️ Goedemorgen zonneschijn! ☀️
☀️Ja, je maakt me zo gelukkig, en door jou voel ik me fijn! ☀️


Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
ElMacaroni schreef op maandag 14 december 2020 @ 22:22:
Nu de vraag, waarom?
Die zal ik aan Buienradar moeten stellen denk ik...
Het antwoord is omdat je na alle waarschijnlijkheid meer dan nodig de data hebt gedownload van hun servers.
Je moet sowieso contact met ze opnemen om de ban te laten opheffen en te vragen naar de reden (zodat je het kan verhelpen).

Op hun informatiepagina over de data kun je alles vinden;
https://www.buienradar.nl/overbuienradar/gratis-weerdata
https://www.buienradar.nl/overbuienradar/contact
https://www.buienradar.nl/overbuienradar/disclaimer
Gebruik van de content op de sites, al dan niet via de gadgets, is slechts toegestaan voor niet-commerciële doeleinden. Gebruik voor mobiele toepassingen of commerciële doeleinden vereist schriftelijke toestemming van Buienradar. Buienradar is te allen tijde gerechtigd om verleende toestemming in te trekken, alsmede om toegang van gebruikers tot de content te blokkeren
Normaal gesproken, als je zo'n script hebt als jij, voeg je daar nog een cache optie aan toe.
Zodat het script elke X minuten de download doet en in de tussentijd een opgeslagen versie gebruikt.

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 14:40

Nick_S

++?????++ Out of Cheese Error

AW_Bos schreef op maandag 14 december 2020 @ 22:50:
Mij lijkt dat een rate limit een error 429 zal uit moeten spugen, en geen 403 met een permission error.
Ik heb een vermoeden dat dit niet van Buienradar vandaan komt.
Als je je niet aan de gebruiksvoorwaarde houdt is een permission error toch prima? Wie zegt dat de feed te vaak is opgehaald?

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 15:51

AW_Bos

Liefhebber van nostalgie... 🕰️

(jarig!)
Nick_S schreef op maandag 14 december 2020 @ 22:54:
[...]

Als je je niet aan de gebruiksvoorwaarde houdt is een permission error toch prima? Wie zegt dat de feed te vaak is opgehaald?
Ik heb niet het idee dat Buienradar echt fanatiek staat te controleren op overtreders. Hun verdienen er toch niet hiermee aan.

[ Voor 5% gewijzigd door AW_Bos op 14-12-2020 22:57 ]

☀️ Goedemorgen zonneschijn! ☀️
☀️Ja, je maakt me zo gelukkig, en door jou voel ik me fijn! ☀️


Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Verder is de exacte reden van de 403 error enkel gissen, maar het kan bovenstaande zijn, al dan niet met een te hoge request rate.
Daar zou je een berichtje aan kunnen wagen.
Mij lijkt dat een rate limit een error 429 zal uit moeten spugen, en geen 403 met een permission error.
Ik heb een vermoeden dat dit niet van Buienradar vandaan komt.
Aan TS, laten we even de HTTP response code toevoegen want sommige denken dat dat alles gaat verklaren... ;)
(Terwijl ik denk dat Buienradar niet zo'n nette HTTP implementatie heeft 8) )

Dit
PHP:
1
2
3
4
echo PHP_EOL;
echo '[info] Below this line is the output from cURL, this was the input for JSON that failed:' . PHP_EOL;
echo $result;
exit;


Wordt
PHP:
1
2
3
4
5
6
echo PHP_EOL;
echo '[info] cURL HTTP response code: ' . curl_getinfo($handle, CURLINFO_HTTP_CODE) . PHP_EOL;
echo PHP_EOL;
echo '[info] Below this line is the output from cURL, this was the input for JSON that failed:' . PHP_EOL;
echo $result;
exit;

[ Voor 4% gewijzigd door Mr. HTTP op 14-12-2020 22:59 ]


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 14:40

Nick_S

++?????++ Out of Cheese Error

Mr. HTTP schreef op maandag 14 december 2020 @ 22:58:
Aan TS, laten we even de HTTP response code toevoegen want sommige denken dat dat alles gaat verklaren... ;)
(Terwijl ik denk dat Buienradar niet zo'n nette HTTP implementatie heeft 8) )
Misschien ook het SSL certificaat, zodat we weten dat de TS met de goede server babbelt ipv een MITM. ;-)

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
AW_Bos schreef op maandag 14 december 2020 @ 22:55:
[...]

Ik heb niet het idee dat Buienradar echt fanatiek staat te controleren op overtreders. Hun verdienen er toch niet hiermee aan.
Er kunnen andere redenen spelen;
Gebruik van de content op de sites, al dan niet via de gadgets, is slechts toegestaan voor niet-commerciële doeleinden. Gebruik voor mobiele toepassingen of commerciële doeleinden vereist schriftelijke toestemming van Buienradar. Buienradar is te allen tijde gerechtigd om verleende toestemming in te trekken, alsmede om toegang van gebruikers tot de content te blokkeren
Anyway ze zullen van mening zijn dat het gebruik van TS niet fair is als in fair use. Het is hun data, dus hun stellen de eisen. Heel het verdien argument is niet relevant.

Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 12-08 22:07
AW_Bos schreef op maandag 14 december 2020 @ 22:50:
Mij lijkt dat een rate limit een error 429 zal uit moeten spugen, en geen 403 met een permission error.
Ik heb een vermoeden dat dit niet van Buienradar vandaan komt.
Het is maar net waar de programmeur aan dacht op dat moment. 403 is ook niet onlogisch als ze gewoon zijn hele IP op webserver niveau hebben geblokkeerd.

Op basis van een 403 ipv 429 concluderen dat het geen rate limit is, is je op dun ijs begeven.

Acties:
  • +1 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 15:51

AW_Bos

Liefhebber van nostalgie... 🕰️

(jarig!)
Misschien moet @ElMacaroni het eens testen met een andere JSON-script van een server. Dan kan je al meer uitsluiten.

☀️ Goedemorgen zonneschijn! ☀️
☀️Ja, je maakt me zo gelukkig, en door jou voel ik me fijn! ☀️


Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Nick_S schreef op maandag 14 december 2020 @ 23:02:
[...]

Misschien ook het SSL certificaat, zodat we weten dat de TS met de goede server babbelt ipv een MITM. ;-)
Ik zat ook nog te denken aan de TCP round trip en SSL/TLS handshake meta data 8)7

Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Merethil schreef op maandag 14 december 2020 @ 22:44:
[...]


Gezien de tekst zegt "on this server" vraag ik mij af of het wel buienradar is die je deze foutmelding geeft en er niet tussendoor een proxyserver/firewall zegt dat jij vanaf deze server niet naar buienradar mag. Zit er een partij tussen die de boel beheert en eventueel iets heeft dichtgegooid/blacklisted?
Hoewel ik je beredenatie snap kan het ook gewoon een standaard pagina van hun eigen server zijn als de server IP van TS in hun deny-list staat.

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 14:40

Nick_S

++?????++ Out of Cheese Error

Mr. HTTP schreef op maandag 14 december 2020 @ 23:05:
[...]


Ik zat ook nog te denken aan de TCP round trip en SSL/TLS handshake meta data 8)7
Ik heb het niet over een MITM attack, maar of er mogelijk een proxyserver/firewall de boel in de war schopt.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Nick_S schreef op maandag 14 december 2020 @ 23:08:
Ik heb het niet over een MITM attack, maar of er mogelijk een proxyserver/firewall de boel in de war schopt.
Ik volg je, was wat aan het geinen.

Volgens de libcurl documentatie: https://curl.se/docs/sslcerts.html
libcurl performs peer SSL certificate verification by default.
Met andere woorden dan zou cURL al eerder een foutmelding geven in mijn testscript omdat de SSL verificatie mislukt of heb ik dat mis?

Verder waarom zou een proxyserver/firewall niet gewoon een redirect doen naar HTTP en daar de foutmelding tonen? Waarom een SSL inject doen, waarom zoveel moeite? Als je een praktijkvoorbeeld kan geven; teach me plz.

Het lijkt erop dat de snelste weg naar een antwoord een mailtje naar Buienradar is...

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 14:40

Nick_S

++?????++ Out of Cheese Error

Mr. HTTP schreef op maandag 14 december 2020 @ 23:28:
[...]
Verder waarom zou een proxyserver/firewall niet gewoon een redirect doen naar HTTP en daar de foutmelding tonen? Waarom een SSL inject doen, waarom zoveel moeite? Als je een praktijkvoorbeeld kan geven; teach me plz.
Het waarom ben ik nooit achter gekomen, maar heb wel eens mijn applicatie mogen deployen op een applicatieserver die binnen een netwerk hing die uitgaand verkeer ook aan deep packet inspectie onderwierp. Hiertoe hadden ze hun eigen certificaat op alle applicatieservers geinstalleerd en alleen van te voren aan gevraagd verkeer mocht naar buiten.

En dit natuurlijk alleen op productie..., zonder dat de applicatieserverbeheerders hiervan op de hoogte waren..., en waar je ook geen toegang kreeg tot de productieserver...

[ Voor 8% gewijzigd door Nick_S op 14-12-2020 23:36 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Oke, versie 2 met HTTP response code en SSL/TLS certificate chain.

debug-buienradar-v2.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php

// Output as plain text
header('Content-Type: text/plain; charset=UTF-8');

echo 'BUIENRADAR TEST SCRIPT' . PHP_EOL . PHP_EOL;

if ( extension_loaded('curl') === FALSE ) {
  echo '[error] curl extension is not available to PHP' . PHP_EOL;
  exit;
}

//  cURL handle
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL,"https://data.buienradar.nl/2.0/feed/json");
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_CERTINFO, true);
$result = curl_exec($handle);
curl_close($handle);

if ($result === FALSE) {
  echo '[error] curl was unable to retrieve the given URL' . PHP_EOL;
  echo 'cURL error message:' . PHP_EOL;
  echo curl_error($handle) . PHP_EOL;
  exit;
}

if ( extension_loaded('json') === FALSE ) {
  echo '[error] json extension is not available to PHP' . PHP_EOL;
  exit;
}

$parsed_json = json_decode($result);

if ( ($error_code = json_last_error()) !== JSON_ERROR_NONE ) {
  echo '[error] parsing JSON failed' . PHP_EOL;
  echo 'JSON extension error message:' . PHP_EOL;

  switch ($error_code) {
    case JSON_ERROR_DEPTH:
      echo 'The maximum stack depth has been exceeded' . PHP_EOL;
      break;
    case JSON_ERROR_STATE_MISMATCH:
      echo 'Invalid or malformed JSON' . PHP_EOL;
      break;
    case JSON_ERROR_CTRL_CHAR:
      echo 'Control character error, possibly incorrectly encoded' . PHP_EOL;
      break;
    case JSON_ERROR_SYNTAX:
      echo 'Syntax error' . PHP_EOL;
      break;
    case JSON_ERROR_UTF8:
      echo 'Malformed UTF-8 characters, possibly incorrectly encoded' . PHP_EOL;
      break;
    case JSON_ERROR_RECURSION:
      echo 'One or more recursive references in the value to be encoded' . PHP_EOL;
      break;
    case JSON_ERROR_INF_OR_NAN:
      echo 'One or more NAN or INF values in the value to be encoded' . PHP_EOL;
      break;
    case JSON_ERROR_UNSUPPORTED_TYPE:
      echo 'A value of a type that cannot be encoded was given' . PHP_EOL;
      break;
    case JSON_ERROR_INVALID_PROPERTY_NAME:
      echo 'A property name that cannot be encoded was given' . PHP_EOL;
      break;
    case JSON_ERROR_UTF16:
      echo 'Malformed UTF-16 characters, possibly incorrectly encoded' . PHP_EOL;
      break;
  }

  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] SSL/TLS certificate chain: ' . PHP_EOL;
  print_r(curl_getinfo($handle, CURLINFO_CERTINFO));
  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] cURL HTTP response code: ' . curl_getinfo($handle, CURLINFO_HTTP_CODE) . PHP_EOL;
  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] Below this line is the output from cURL, this was the input for JSON that failed:' . PHP_EOL;
  echo $result;
  exit;
}

// Index 40 geeft hetvolgende aan in de JSON data set
// 40
//   $id              "44"
//   stationid      6290
//   stationname      "Meetstation Twente"
//   lat              52.27
//   lon              6.9
// Het is logischer (omdat de index niet altijd naar Twente hoeft te wijzen)
// om de $id === "44" als test te gebruiken in een loop

$seek_meetstation_id = "44";
$meetstation = FALSE;
foreach ($parsed_json->actual->stationmeasurements as $meetstation_item) {
  if ($meetstation_item->{'$id'} === $seek_meetstation_id) {
    // found, write to variable
    $meetstation = $meetstation_item;
    break;
  }
}

if ( $meetstation === FALSE ) {
  echo '[error] station with $id ' . $seek_meetstation_id . ' not found in JSON data set' . PHP_EOL;
  exit;
}

// Als we hier zijn aangekomen is alles goed gegaan...
echo '[info] All test are OK; grab a coffee' . PHP_EOL;
echo 'vardump of $meetstation' . PHP_EOL;
var_dump($meetstation);

echo PHP_EOL . PHP_EOL;
echo 'the properties you want' . PHP_EOL;
$timestamp = $meetstation->timestamp;
$station = $meetstation->stationname;
$airpressure = $meetstation->airpressure;
$temperature = $meetstation->temperature;
$humidity = $meetstation->humidity;
echo 'Tijdstip: ' . $timestamp . PHP_EOL;
echo 'Meetstation: ' . $station . PHP_EOL;
echo 'Luchtdruk: ' . $airpressure . PHP_EOL;
echo 'Temperatuur: ' . $temperature . PHP_EOL;
echo 'Luchtvochtigheid: ' . $humidity . PHP_EOL;


En dan de gewenste output (chain + response code), het BEGIN/END CERTIFICATE gedeelte heb ik ingekort. Je kunt aan die paar regels ook wel zien of ie anders is of niet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
[info] SSL/TLS certificate chain: 
Array
(
    [0] => Array
        (
            [Subject] => C = NL, ST = Noord-Holland, L = Hilversum, O = RTL Nederland B.V., OU = Weer en Verkeer, CN = www.buienradar.nl
            [Issuer] => C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
            [Version] => 2
            [Serial Number] => 0bcc07475a3c6b6ddfd7e51643d70ffe
            [Signature Algorithm] => sha256WithRSAEncryption
            [Public Key Algorithm] => rsaEncryption
            [X509v3 Authority Key Identifier] => keyid:0F:80:61:1C:82:31:61:D5:2F:28:E7:8D:46:38:B4:2C:E1:C6:D9:E2
            [X509v3 Subject Key Identifier] => 19:CC:45:9E:A3:04:60:A5:A6:A4:6F:4C:E0:BB:82:CC:9D:DE:19:74
            [X509v3 Subject Alternative Name] => DNS:www.buienradar.nl,DNS:buienradar.nl,DNS:*.buienradar.be,DNS:*.buienradar.nl,DNS:buienradar.be
            [X509v3 Key Usage] => DigitalSignature,KeyEncipherment
            [X509v3 Extended Key Usage] => TLSWebServerAuthentication,TLSWebClientAuthentication
            [X509v3 CRL Distribution Points] => , FullName:, URI:http://crl3.digicert.com/ssca-sha2-g6.crl, 
FullName:, URI:http://crl4.digicert.com/ssca-sha2-g6.crl
            [X509v3 Certificate Policies] => Policy:2.16.840.1.114412.1.1, CPS:https://www.digicert.com/CPS, Policy:2.23.140.1.2.2
            [Authority Information Access] => OCSP-URI:http://ocsp.digicert.com, CAIssuers-URI:http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
            [X509v3 Basic Constraints] => CA:FALSE
            [CT Precertificate SCTs] => SignedCertificateTimestamp:, Version:v1(0x0), LogID:EE:4B:BD:B7:75:CE:60:BA:E1:42:69:1F:AB:E1:9E:66:, A3:0F:7E:5F:B0:72:D8:83:00:C4:7B:89:7A:A8:FD:CB, Timestamp:Jan1015:41:45.4112020GMT, Extensions:none, Signature:ecdsa-with-SHA256, 30:44:02:20:13:37:09:D4:11:B5:BA:C5:11:36:93:2E:, 93:80:5C:AD:80:CA:9F:B5:62:78:E5:0D:79:F5:67:C1:, 1D:FE:94:92:02:20:5B:F3:B9:A7:DE:9A:4F:97:48:65:, 25:8C:F0:0C:4D:12:9C:04:31:23:1D:AA:EA:C8:C2:28:, 47:98:AF:37:FD:5D, SignedCertificateTimestamp:, Version:v1(0x0), LogID:87:75:B
            [Start date] => Jan 10 00:00:00 2020 GMT
            [Expire date] => Mar 10 12:00:00 2021 GMT
            [RSA Public Key] => 2048
            [rsa(n)] => B0310E5AF3AC77139ACD4D62D27A6D669207998534888D569EE86C698CBCD248A00A1FEBE0D921C0FFA0248B55B6AAFA842A3125F1DABEFAF3BA5E765F5212DDEA71936B481618CC30EC90606DE6ED6DF45D567AAE7BD24A38DF1BCE4B6DA99A7680462A801DFFAC98FE1694F5B21D87F41BD7C0E41D1668ED95E981FCAB421977F09ACEEF6FEA7D70CE7B4413174FA1E724BC44293CE3FE62824F45B5EF063FB4795FBA121CB7BF6CDF0ADC62DF245DD961A7021DC5998D7CEAD1B4E790C6AA0341F3AF6CC75BCE7F4857F345499EFE5E35DEE53E3A872E51D171C697DCFD0A1179360F12E1ABED867757F5701624C30E781FB3DFEB4009249DFEAA9881C643
            [rsa(e)] => 10001
            [Signature] => 16:69:d8:95:95:e9:4b:55:0f:05:6d:54:dd:3f:f7:f0:eb:c2:e5:81:87:53:d0:e1:50:c4:ee:19:4c:58:2a:5d:bf:b8:83:3a:df:ea:1f:bc:54:79:a2:f6:f4:ce:46:ec:2f:4d:0d:74:fd:4c:86:0f:5b:41:1a:41:d9:85:68:eb:41:7e:fb:27:cd:cb:78:cd:ff:7e:b1:d2:1e:e1:2d:82:7f:13:e2:95:5a:4f:6a:31:66:5c:20:7c:b5:2f:e0:e7:22:0e:da:d5:42:b1:34:64:9b:b4:2f:da:0c:34:45:c0:2c:42:97:ae:25:1a:22:5e:61:50:18:11:61:d8:99:90:2d:d3:11:ec:b0:e0:cb:58:4d:d9:4e:7a:de:57:f6:ec:d5:57:79:16:f2:d0:36:79:b7:12:25:72:f2:f0:39:00:0d:da:71:33:07:45:05:17:75:7a:e6:c2:56:d5:37:8a:a2:b3:87:b8:a5:95:21:b4:9a:2c:4d:40:81:d6:33:2d:18:e1:2f:0f:d9:32:e0:4a:b0:e2:29:39:6f:02:2d:e5:75:c1:0e:af:56:93:b4:01:e6:26:a0:2e:3c:06:0a:61:a5:84:08:4b:19:3c:4e:5d:a4:64:04:a1:e9:8a:33:03:0d:c6:3a:3b:dc:13:bb:5f:5e:86:5d:85:4f:85:b0:1a:
            [Cert] => -----BEGIN CERTIFICATE-----
MIIGgzCCBWugAwIBAgIQC8wHR1o8a23f1+UWQ9cP/jANBgkqhkiG9w0BAQsFADBN
...
JqAuPAYKYaWECEsZPE5dpGQEoemKMwMNxjo73BO7X16GXYVPhbAa
-----END CERTIFICATE-----

        )

    [1] => Array
        (
            [Subject] => C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
            [Issuer] => C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
            [Version] => 2
            [Serial Number] => 01fda3eb6eca75c888438b724bcfbc91
            [Signature Algorithm] => sha256WithRSAEncryption
            [Public Key Algorithm] => rsaEncryption
            [X509v3 Basic Constraints] => CA:TRUE,pathlen:0
            [X509v3 Key Usage] => DigitalSignature,CertificateSign,CRLSign
            [Authority Information Access] => OCSP-URI:http://ocsp.digicert.com
            [X509v3 CRL Distribution Points] => , FullName:, URI:http://crl3.digicert.com/DigiCertGlobalRootCA.crl, 
FullName:, URI:http://crl4.digicert.com/DigiCertGlobalRootCA.crl
            [X509v3 Certificate Policies] => Policy:X509v3AnyPolicy, CPS:https://www.digicert.com/CPS
            [X509v3 Subject Key Identifier] => 0F:80:61:1C:82:31:61:D5:2F:28:E7:8D:46:38:B4:2C:E1:C6:D9:E2
            [X509v3 Authority Key Identifier] => keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55
            [Start date] => Mar  8 12:00:00 2013 GMT
            [Expire date] => Mar  8 12:00:00 2023 GMT
            [RSA Public Key] => 2048
            [rsa(n)] => DCAE58904DC1C4301590355B6E3C8215F52C5CBDE3DBFF7143FA642580D4EE18A24DF066D00A736E1198361764AF379DFDFA4184AFC7AF8CFE1A734DCF339790A2968753832BB9A675482D1D56377BDA31321AD7ACAB06F4AA5D4BB74746DD2A93C3902E798080EF13046A143BB59B92BEC207654EFCDAFCFF7AAEDC5C7E55310CE83907A4D7BE2FD30B6AD2B1DF5FFE5774533B3580DDAE8E4498B39F0ED3DAE0D7F46B29AB44A74B58846D924B81C3DA738B129748900445751ADD37319792E8CD540D3BE4C13F395E2EB8F35C7E108E8641008D456647B0A165CEA0AA29094EF397EBE82EAB0F72A7300EFAC7F4FD1477C3A45B2857C2B3F982FDB745589B
            [rsa(e)] => 10001
            [Signature] => 23:3e:df:4b:d2:31:42:a5:b6:7e:42:5c:1a:44:cc:69:d1:68:b4:5d:4b:e0:04:21:6c:4b:e2:6d:cc:b1:e0:97:8f:a6:53:09:cd:aa:2a:65:e5:39:4f:1e:83:a5:6e:5c:98:a2:24:26:e6:fb:a1:ed:93:c7:2e:02:c6:4d:4a:bf:b0:42:df:78:da:b3:a8:f9:6d:ff:21:85:53:36:60:4c:76:ce:ec:38:dc:d6:51:80:f0:c5:d6:e5:d4:4d:27:64:ab:9b:c7:3e:71:fb:48:97:b8:33:6d:c9:13:07:ee:96:a2:1b:18:15:f6:5c:4c:40:ed:b3:c2:ec:ff:71:c1:e3:47:ff:d4:b9:00:b4:37:42:da:20:c9:ea:6e:8a:ee:14:06:ae:7d:a2:59:98:88:a8:1b:6f:2d:f4:f2:c9:14:5f:26:cf:2c:8d:7e:ed:37:c0:a9:d5:39:b9:82:bf:19:0c:ea:34:af:00:21:68:f8:ad:73:e2:c9:32:da:38:25:0b:55:d3:9a:1d:f0:68:86:ed:2e:41:34:ef:7c:a5:50:1d:bf:3a:f9:d3:c1:08:0c:e6:ed:1e:8a:58:25:e4:b8:77:ad:2d:6e:f5:52:dd:b4:74:8f:ab:49:2e:9d:3b:93:34:28:1f:78:ce:94:ea:c7:bd:d3:c9:6d:1c:de:5c:32:f3:
            [Cert] => -----BEGIN CERTIFICATE-----
MIIElDCCA3ygAwIBAgIQAf2j627KdciIQ4tyS8+8kTANBgkqhkiG9w0BAQsFADBh
...
c+LJMto4JQtV05od8GiG7S5BNO98pVAdvzr508EIDObtHopYJeS4d60tbvVS3bR0
j6tJLp07kzQoH3jOlOrHvdPJbRzeXDLz
-----END CERTIFICATE-----

        )

)

[info] cURL HTTP response code: 200

[ Voor 61% gewijzigd door Mr. HTTP op 14-12-2020 23:46 ]


Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Nick_S schreef op maandag 14 december 2020 @ 23:35:
Het waarom ben ik nooit achter gekomen, maar heb wel eens mijn applicatie mogen deployen op een applicatieserver die binnen een netwerk hing die uitgaand verkeer ook aan deep packet inspectie onderwierp. Hiertoe hadden ze hun eigen certificaat op alle applicatieservers geinstalleerd en alleen van te voren aan gevraagd verkeer mocht naar buiten.

En dit natuurlijk alleen op productie..., zonder dat de applicatieserverbeheerders hiervan op de hoogte waren..., en waar je ook geen toegang kreeg tot de productieserver...
Thanks. Hierdoor herinnerde ik me ook de TS dit zeggen;
Sja, hier niet... althans het werkt niet op 2 machines, (var_dump : NULL) maar wel vanaf mijn thuisPC.
Het kan natuurlijk een dichtgetimmerd bedrijfsnetwerk zijn.

Acties:
  • 0 Henk 'm!

  • ElMacaroni
  • Registratie: November 2012
  • Laatst online: 12-08 12:01

ElMacaroni

Laat de zon maar komen!

Topicstarter
Wow, was even weg.

Voorgaande code erin:

Uitkomst:

BUIENRADAR TEST SCRIPT

[error] parsing JSON failed
JSON extension error message:
Syntax error

[info] SSL/TLS certificate chain:

[info] cURL HTTP response code:

[info] Below this line is the output from cURL, this was the input for JSON that failed:
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http://data.buienradar.nl/2.0/feed/json" on this server.<P>
Reference #18.77a1dd58.1607986225.3d5110fa
</BODY>
</HTML>

Ter verklaring, ik heb dit misbaksel van een php scriptje gebakken icm een extra externe js calculator rekentruuk (niet relevant) om de actuele luchtdichtheid te bekijken. Ben dan ook geen php-guru maar een luie mechanical engineer die niet elke keer alle getallen wil invoeren, beschik over marginale coding skills en weinig php-ervaring.

In de testfase zal ik vrij frequent op de F5 hebben geramd, dat kan de oorzaak zijn.

Iedereen bedankt voor de leerzame info!

SE2200+14xSF170S & SE1500M+4xTSM-375


Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Ter verklaring, ik heb dit misbaksel van een php scriptje gebakken icm een extra externe js calculator rekentruuk (niet relevant) om de actuele luchtdichtheid te bekijken. Ben dan ook geen php-guru maar een luie mechanical engineer die niet elke keer alle getallen wil invoeren, beschik over marginale coding skills en weinig php-ervaring.
Niet zo negatief over jezelf he, kom op! Al het begin is moeilijk. Als buienradar je geblokkeerd heeft omdat je te vaak hun servers benaderd dan kan ik jouw scriptje zo aanpassen dat het zich wel gedraagd. Kost mij echt geen moeite. ;)
In de testfase zal ik vrij frequent op de F5 hebben geramd, dat kan de oorzaak zijn.
Is een menselijke beginnersfout, mail Buienradar en als ze je echt geblokkeerd hebben en je vertelt dit krijg je vast een nieuwe kans! :)

Heb je wel goed gekopieert? Dit hoort namelijk niet leeg te zijn:
[info] SSL/TLS certificate chain:

[info] cURL HTTP response code:
Als dat echt leeg is dan heb je misschien een (te) oude versie van cURL draaien, die op een manier met de server van Buienradar wil communiceren die niet meer is toegestaan. (tech people: denk aan ouderwetse SSL/TLS, ciphers)

Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Wellicht kun je dit nog eens draaien voor wat extra insight voor hier;

curl-info.php
PHP:
1
2
3
4
5
6
7
8
<?php

header('Content-Type: text/plain; charset=UTF-8');
echo 'CURL INFO' . PHP_EOL . PHP_EOL;
print_r([
  'curl' => curl_version(),
  'php' => phpversion()
]);

Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Heb het script weer wat verbeterd vanwege de lege output bij 'SSL/TLS certificate chain' en 'cURL HTTP response code' aangezien er nog een kans bestaat dat je niet geblokkeerd bent maar het netwerk waarin je zit het niet toestaat.

- genoeg voor vandaag, welterusten! :z

debug-buienradar-v3.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<?php

// Output as plain text
header('Content-Type: text/plain; charset=UTF-8');

echo 'BUIENRADAR TEST SCRIPT' . PHP_EOL . PHP_EOL;

print_r([
  'curl' => curl_version(),
  'php' => phpversion()
]);

echo PHP_EOL . PHP_EOL;

if ( extension_loaded('curl') === FALSE ) {
  echo '[error] curl extension is not available to PHP' . PHP_EOL;
  exit;
}

//  cURL handle
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL,"https://data.buienradar.nl/2.0/feed/json");
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
// only for testing and in use with CURLOPT_CERTINFO
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
// only for testing and in use with CURLOPT_CERTINFO
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($handle, CURLOPT_CERTINFO, true);

$result = curl_exec($handle);
curl_close($handle);

if ($result === FALSE) {
  echo '[error] curl was unable to retrieve the given URL' . PHP_EOL;
  echo 'cURL error message:' . PHP_EOL;
  echo curl_error($handle) . PHP_EOL;
  exit;
}

if ( extension_loaded('json') === FALSE ) {
  echo '[error] json extension is not available to PHP' . PHP_EOL;
  exit;
}

$parsed_json = json_decode($result);

if ( ($error_code = json_last_error()) !== JSON_ERROR_NONE ) {
  echo '[error] parsing JSON failed' . PHP_EOL;
  echo 'JSON extension error message:' . PHP_EOL;

  switch ($error_code) {
    case JSON_ERROR_DEPTH:
      echo 'The maximum stack depth has been exceeded' . PHP_EOL;
      break;
    case JSON_ERROR_STATE_MISMATCH:
      echo 'Invalid or malformed JSON' . PHP_EOL;
      break;
    case JSON_ERROR_CTRL_CHAR:
      echo 'Control character error, possibly incorrectly encoded' . PHP_EOL;
      break;
    case JSON_ERROR_SYNTAX:
      echo 'Syntax error' . PHP_EOL;
      break;
    case JSON_ERROR_UTF8:
      echo 'Malformed UTF-8 characters, possibly incorrectly encoded' . PHP_EOL;
      break;
    case JSON_ERROR_RECURSION:
      echo 'One or more recursive references in the value to be encoded' . PHP_EOL;
      break;
    case JSON_ERROR_INF_OR_NAN:
      echo 'One or more NAN or INF values in the value to be encoded' . PHP_EOL;
      break;
    case JSON_ERROR_UNSUPPORTED_TYPE:
      echo 'A value of a type that cannot be encoded was given' . PHP_EOL;
      break;
    case JSON_ERROR_INVALID_PROPERTY_NAME:
      echo 'A property name that cannot be encoded was given' . PHP_EOL;
      break;
    case JSON_ERROR_UTF16:
      echo 'Malformed UTF-16 characters, possibly incorrectly encoded' . PHP_EOL;
      break;
  }

  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] SSL/TLS certificate chain: ' . PHP_EOL;
  $certs = curl_getinfo($handle, CURLINFO_CERTINFO);
  if (is_array($certs)) {
    print_r($certs);
  } else {
    // tell me what it is if not an array
    var_dump($certs);
  }

  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] cURL HTTP response code: ' . PHP_EOL;
  $code = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
  if (is_int($code)) {
    echo $code . PHP_EOL;
  } else {
    // tell me what it is if not an integer
    var_dump($code);
  }

  echo PHP_EOL;
  echo PHP_EOL;
  echo '[info] Below this line is the output from cURL, this was the input for JSON that failed:' . PHP_EOL;
  echo $result;
  exit;
}

// Index 40 geeft hetvolgende aan in de JSON data set
// 40
//   $id              "44"
//   stationid      6290
//   stationname      "Meetstation Twente"
//   lat              52.27
//   lon              6.9
// Het is logischer (omdat de index niet altijd naar Twente hoeft te wijzen)
// om de $id === "44" als test te gebruiken in een loop

$seek_meetstation_id = "44";
$meetstation = FALSE;
foreach ($parsed_json->actual->stationmeasurements as $meetstation_item) {
  if ($meetstation_item->{'$id'} === $seek_meetstation_id) {
    // found, write to variable
    $meetstation = $meetstation_item;
    break;
  }
}

if ( $meetstation === FALSE ) {
  echo '[error] station with $id ' . $seek_meetstation_id . ' not found in JSON data set' . PHP_EOL;
  exit;
}

// Als we hier zijn aangekomen is alles goed gegaan...
echo '[info] All test are OK; grab a coffee' . PHP_EOL;
echo 'vardump of $meetstation' . PHP_EOL;
var_dump($meetstation);

echo PHP_EOL . PHP_EOL;
echo 'the properties you want' . PHP_EOL;
$timestamp = $meetstation->timestamp;
$station = $meetstation->stationname;
$airpressure = $meetstation->airpressure;
$temperature = $meetstation->temperature;
$humidity = $meetstation->humidity;
echo 'Tijdstip: ' . $timestamp . PHP_EOL;
echo 'Meetstation: ' . $station . PHP_EOL;
echo 'Luchtdruk: ' . $airpressure . PHP_EOL;
echo 'Temperatuur: ' . $temperature . PHP_EOL;
echo 'Luchtvochtigheid: ' . $humidity . PHP_EOL;

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 12-08 21:57
Mr. HTTP schreef op maandag 14 december 2020 @ 23:06:
[...]

Hoewel ik je beredenatie snap kan het ook gewoon een standaard pagina van hun eigen server zijn als de server IP van TS in hun deny-list staat.
Klopt. Het was ook meer een gok gebaseerd op jarenlang werken in een omgeving waar uitgaand verkeer standaard geblokkeerd werd en waar dan zo goed als deze melding naar boven kwam.

In mijn geval was het dan een proxy die aangaf dat je met deze credentials via deze proxy niet vanaf die server naar dat adres mag. Toevallig ook in HTML.
Ik vraag me namelijk af of je van buienradar niet gewoon JSON met een foutmelding of alleen een header met een lege body zou krijgen bij fouten.

Hoe dan ook, iets om te testen; en jij wil het blijkbaar met je laatste testscript ook uitsluiten :+

Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Merethil schreef op dinsdag 15 december 2020 @ 06:37:
[...]
In mijn geval was het dan een proxy die aangaf dat je met deze credentials via deze proxy niet vanaf die server naar dat adres mag. Toevallig ook in HTML.
Ik vraag me namelijk af of je van buienradar niet gewoon JSON met een foutmelding of alleen een header met een lege body zou krijgen bij fouten.
Thanks voor je toelichting. @Nick_S had me al aan het twijfelen gebracht (zie mijn reactie daarop) en ook jouw reactie doet mij nu geloven dat het vaker voorkomt dan ik dacht. Vandaar de update van het script. :*)

Na een nachtje slapen realiseer ik me nu ook (als er iets tussenzit wat 't blokkeert) dat ik het script eigenlijk weer moet updaten met verdere output van het HTTP verkeer om te zien of HTTP headers iets verhullen of dat er een HTTP redirect plaatsvindt. Maar geen idee of @ElMacaroni nog zin heeft om meer te testen...

Acties:
  • 0 Henk 'm!

  • webfreakz.nl
  • Registratie: November 2003
  • Laatst online: 28-07 10:40

webfreakz.nl

el-nul-zet-é-er

Merethil schreef op dinsdag 15 december 2020 @ 06:37:
[...]
Ik vraag me namelijk af of je van buienradar niet gewoon JSON met een foutmelding of alleen een header met een lege body zou krijgen bij fouten.
Ik ken een systeem waar je HTTP-HEAD requests naartoe kan sturen om te zien of een groot XML bestand recent is gewijzigd. Op basis van dat antwoord kan je daarna een GET doen voor dezelfde resource d:)b

"You smell that, son? What sir? Napalm, I love the smell of napalm in the mornin!" || Children of Bodom fan!


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 12-08 21:57
webfreakz.nl schreef op dinsdag 15 december 2020 @ 18:09:
[...]


Ik ken een systeem waar je HTTP-HEAD requests naartoe kan sturen om te zien of een groot XML bestand recent is gewijzigd. Op basis van dat antwoord kan je daarna een GET doen voor dezelfde resource d:)b
Dat klinkt als een prima implementatie. Ik vind het vooral vreemd dat je op een API HTML zou gaan teruggegeven in het geval van een fout, terwijl je normaal JSON teruggeeft. HTML is namelijk helemaal niet lekker simpel bruikbaar voor het uitvogelen wat er misgegaan is op een HTTP-call.

Dat je in de header allemaal info teruggeeft is dan een stuk logischer, eventueel aangevuld met een JSON-body (of XML-body, naargelang wat je in je accept header hebt gezet) waar de error verder in wordt uitgelegd, meer info bevat over de velden die mis zijn e.d.

Acties:
  • 0 Henk 'm!

  • ElMacaroni
  • Registratie: November 2012
  • Laatst online: 12-08 12:01

ElMacaroni

Laat de zon maar komen!

Topicstarter
Mr. HTTP schreef op dinsdag 15 december 2020 @ 14:11:
Maar geen idee of @ElMacaroni nog zin heeft om meer te testen...
Here we are again!

BUIENRADAR TEST SCRIPT

Array
(
    [curl] => Array
        (
            [version_number] => 474369
            [age] => 4
            [features] => 12568477
            [ssl_version_number] => 0
            [version] => 7.61.1
            [host] => x86_64-redhat-linux-gnu
            [ssl_version] => OpenSSL/1.1.1i
            [libz_version] => 1.2.11
            [protocols] => Array
                (
                    [0] => dict
                    [1] => file
                    [2] => ftp
                    [3] => ftps
                    [4] => gopher
                    [5] => http
                    [6] => https
                    [7] => imap
                    [8] => imaps
                    [9] => ldap
                    [10] => ldaps
                    [11] => pop3
                    [12] => pop3s
                    [13] => rtsp
                    [14] => scp
                    [15] => sftp
                    [16] => smb
                    [17] => smbs
                    [18] => smtp
                    [19] => smtps
                    [20] => telnet
                    [21] => tftp
                )

            [ares] => 
            [ares_num] => 0
            [libidn] => 2.2.0
            [iconv_ver_num] => 0
            [libssh_version] => libssh/0.9.4/openssl/zlib
            [brotli_ver_num] => 16777222
            [brotli_version] => 1.0.6
        )

    [php] => 7.4.13
)


[error] parsing JSON failed
JSON extension error message:
Syntax error


[info] SSL/TLS certificate chain: 
bool(false)


[info] cURL HTTP response code: 
bool(false)


[info] Below this line is the output from cURL, this was the input for JSON that failed:
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
 
You don't have permission to access "http&#58;&#47;&#47;data&#46;buienradar&#46;nl&#47;2&#46;0&#47;feed&#47;json" on this server.<P>
Reference&#32;&#35;18&#46;3702655f&#46;1608057805&#46;26b2cddd
</BODY>
</HTML>

SE2200+14xSF170S & SE1500M+4xTSM-375


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 12-08 18:34

Matis

Rubber Rocket

Ik zou vanaf diezelfde PC eens middels wget of curl vanaf de command line de URL proberen binnen te halen.

Eventueel nog met traceroute, dig of nslookup kijken waar het IP adres van buienradar op uit komt.

Ik vind het sowieso vreemd dat een https:// request op een http:// endpoint uitkomt.

Het lijkt er op dat je actief geblokkeerd wordt, door je interne netwerk of buienradar.
Mogelijk zit het probleem zelfs lokaal door een foutief DNS record.

Mijn eerder genoemde tools zouden dat uit moeten wijzen.

Probleem zit denk ik niet in PHP maar in het netwerk (beheer) waar de pc op aangesloten zit.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
webfreakz.nl schreef op dinsdag 15 december 2020 @ 18:09:
Ik ken een systeem waar je HTTP-HEAD requests naartoe kan sturen om te zien of een groot XML bestand recent is gewijzigd. Op basis van dat antwoord kan je daarna een GET doen voor dezelfde resource d:)b
Bedoel je een speciaal systeem of gewoon de Hypertext Transfer Protocol (HTTP/1.1): Caching spec? Oftewel een HTTP HEAD request met If-Modified-Since header field (of een andere) op basis van een eerder bewaarde Last-Modified header field. Gevolgd door een GET indien er geen 304 (Not Modified) terugkomt op de HEAD request.

Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Op basis van je laatste output en nieuwe inzichten zal ik het scriptje nog een keer aanpassen (de laatste keer).
Daarmee moet het antwoord toch echt naar boven komen.

Omdat er geen SSL/TLS chain te zien is maar FALSE en ook bij de status code FALSE lijkt het netwerk waarin je zit de boosdoener. Er vindt een redirect plaats en met de update van het script zorg ik dat die ook inzichtelijk wordt.

Acties:
  • 0 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Matis schreef op dinsdag 15 december 2020 @ 21:06:
Ik zou vanaf diezelfde PC eens middels wget of curl vanaf de command line de URL proberen binnen te halen.

Eventueel nog met traceroute, dig of nslookup kijken waar het IP adres van buienradar op uit komt.

Ik vind het sowieso vreemd dat een https:// request op een http:// endpoint uitkomt.

Het lijkt er op dat je actief geblokkeerd wordt, door je interne netwerk of buienradar.
Mogelijk zit het probleem zelfs lokaal door een foutief DNS record.

Mijn eerder genoemde tools zouden dat uit moeten wijzen.

Probleem zit denk ik niet in PHP maar in het netwerk (beheer) waar de pc op aangesloten zit.
Ik ga het script aanpassen zodat deze informatie ook wordt weergegeven. In ieder geval genoeg om te zien of de response komt uit het LAN of het WAN. Dus of TS moet aankloppen bij Buienradar of bij de SysOps van zijn werk...

  • jerryhopper
  • Registratie: April 2019
  • Laatst online: 24-02-2021
Probeer eens deze functie, die laat je de redirects zien.

bron: https://stackoverflow.com/a/3233549

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function getWebPage($url, $redirectcallback = null){
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0");

    $html = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($http_code == 301 || $http_code == 302) {
        list($httpheader) = explode("\r\n\r\n", $html, 2);
        $matches = array();
        preg_match('/(Location:|URI:)(.*?)\n/', $httpheader, $matches);
        $nurl = trim(array_pop($matches));
        $url_parsed = parse_url($nurl);
        if (isset($url_parsed)) {
            if($redirectcallback){ // callback
                 $redirectcallback($nurl, $url);
            }
            $html = getWebPage($nurl, $redirectcallback);
        }
    }
    return $html;
}

function trackAllLocations($newUrl, $currentUrl){
    echo $currentUrl.' ---> '.$newUrl."\r\n";
}

getWebPage('http://data.buienradar.nl/2.0/feed/json', 'trackAllLocations');



Bovenstaand voorbeeld resulteert in dit ( http->https redirect ):
http://data.buienradar.nl/2.0/feed/json ---> https://data.buienradar.nl/2.0/feed/json

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Hierbij een iets ander script wat zich meer richt op het debuggen van HTTP I/O via cURL.
Toegevoegd is TCP source en destination, HTTP header trail en HTTP redirect trail.

debug-curl-v1.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php

define('EOL', PHP_EOL);

class CurlHandleWrapper {

  private $url;

  private $handle;

  private $http_response_header;
  private $http_response_body;

  public function __construct($url) {
    $this->url = $url;
    $this->resourcesInit();
    $this->curlInit();
  }

  private $error;

  private function resourcesInit() {
    $this->http_response_header = fopen('php://memory','r+');
  }

  private function curlInit() {
    $this->handle = curl_init();
    curl_setopt($this->handle , CURLOPT_URL, $this->url);
    curl_setopt($this->handle , CURLOPT_RETURNTRANSFER, true);
    // Only for testing and in use with CURLOPT_CERTINFO
    // cURL has the (expected) behaviour to not include any data that is
    // invalid, so to include (potential) invalid data, dont force validation...
    curl_setopt($this->handle , CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($this->handle , CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($this->handle , CURLOPT_CERTINFO, true);
    curl_setopt($this->handle,  CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($this->handle,  CURLINFO_HEADER_OUT, true);
    curl_setopt($this->handle,  CURLOPT_WRITEHEADER, $this->http_response_header);
  }

  public function makeRequest() {
    $this->http_response_body = curl_exec($this->handle);
    if ( $this->http_response_body === FALSE ) {
      $this->error = [
        'code' => curl_errno($this->handle),
        'message' => curl_error($this->handle),
      ];
    }
    $this->curlFinalize();
    $this->resourcesFinalize();
    return ($this->http_response_body === FALSE) ? FALSE : TRUE;
  }

  private function curlFinalize() {
    curl_close($this->handle);
  }

  private function resourcesFinalize() {
    rewind($this->http_response_header);
    $tmp = stream_get_contents($this->http_response_header);
    fclose($this->http_response_header);
    $this->http_response_header = $tmp;
    unset($tmp);
  }

  public function getError() { return $this->error; }

  private function getInfo($info_type) { return curl_getinfo($this->handle, $info_type); }

  // TCP
  public function getSourceIPAddress() { return $this->getInfo(CURLINFO_LOCAL_IP); }
  public function getSourcePort() { return $this->getInfo(CURLINFO_LOCAL_PORT); }
  public function getDestinationIPAddress() { return $this->getInfo(CURLINFO_PRIMARY_IP); }
  public function getDestinationPort() { return $this->getInfo(CURLINFO_PRIMARY_PORT); }
  public function getSource() { return $this->getSourceIPAddress() . ':' . $this->getSourcePort(); }
  public function getDestination() { return $this->getDestinationIPAddress() . ':' . $this->getDestinationPort(); }

  // SSL/TLS
  public function getSSLCertificateChain() { return $this->getInfo(CURLINFO_CERTINFO); }
  public function hasSSLCertificateChain() { return ( is_array($this->getSSLCertificateChain()) && !empty($this->getSSLCertificateChain()) ); }

  // HTTP request
  public function getHTTPRequestHeader() { return $this->getInfo(CURLINFO_HEADER_OUT); }

  // HTTP response
  public function getHTTPResponseCode() { return $this->getInfo(CURLINFO_RESPONSE_CODE); }
  public function getHTTPResponseHeader() { return $this->http_response_header; }
  public function getHTTPResponseBody() { return $this->http_response_body; }

  public function getRedirectURL() { return $this->getInfo(CURLINFO_REDIRECT_URL); }
  public function hasRedirectURL() { return (is_string($this->getRedirectURL()) && $this->getRedirectURL() !== ''); }

  // generic
  public function getURL() { return $this->url; }
  public function getEffectiveURL() { return $this->getInfo(CURLINFO_EFFECTIVE_URL); }

}

// #############################################################################

// Output as plain text
header('Content-Type: text/plain; charset=UTF-8');

$target_url = "https://data.buienradar.nl/2.0/feed/json";

while ( is_string($target_url) ) {

  $chw = new CurlHandleWrapper($target_url);
  if ( $chw->makeRequest() ) {

    echo str_repeat('#',64), EOL;
    echo '[URL]', EOL, $chw->getEffectiveURL(), EOL, EOL;
    echo '[TCP]', EOL, $chw->getSource(), ' => ', $chw->getDestination(),  EOL, EOL;

    if ($chw->hasSSLCertificateChain()) {
      echo '[SSL/TLS] ', print_r($chw->getSSLCertificateChain(), true),  EOL;
    }

    echo '[HTTP REQUEST HEADER]' . EOL, EOL;
    echo $chw->getHTTPRequestHeader();
    echo '[HTTP RESPONSE HEADER]' . EOL, EOL;
    echo $chw->getHTTPResponseHeader();

    echo '[HTTP RESPONSE BODY]' . EOL, EOL;
    echo $chw->getHTTPResponseBody();

    $target_url = FALSE;
    if ($chw->hasRedirectURL()) {
      $target_url = $chw->getRedirectURL();
    }

  } else {
    // tested by putting 127.0.0.1 data.buienradar.nl in /etc/hosts
    echo 'cURL error when addressing ', $target_url, ':', EOL;
    print_r( $chw->getError() );

    $target_url = FALSE;
  }
  unset($chw);

}


Om een idee te geven van de output (van HTTP naar HTTPS)
PHP:
1
2
3
<?php
$target_url = "http://data.buienradar.nl/2.0/feed/json";
?>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
################################################################
[URL]
http://data.buienradar.nl/2.0/feed/json

[TCP]
192.168.1.216:38610 => 23.202.229.27:80

[HTTP REQUEST HEADER]

GET /2.0/feed/json HTTP/1.1
Host: data.buienradar.nl
Accept: */*

[HTTP RESPONSE HEADER]

HTTP/1.1 301 Moved Permanently
Server: AkamaiGHost
Content-Length: 0
Location: https://data.buienradar.nl/2.0/feed/json
Date: Thu, 17 Dec 2020 16:25:32 GMT
Connection: keep-alive
Access-Control-Max-Age: 86400
Access-Control-Allow-Credentials: false
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept-Encoding
Access-Control-Allow-Methods: GET,POST,PUT
Access-Control-Allow-Origin: *

[HTTP RESPONSE BODY]

################################################################
[URL]
https://data.buienradar.nl/2.0/feed/json

[TCP]
192.168.1.216:38644 => 23.202.229.18:443

[SSL/TLS] Array
(
    [0] => Array
        (
            [Subject] => C = NL, ST = Noord-Holland, L = Hilversum, O = RTL Nederland B.V., OU = Weer en Verkeer, CN = www.buienradar.nl
            [Issuer] => C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
            [Version] => 2
            [Serial Number] => 0bcc07475a3c6b6ddfd7e51643d70ffe
            [Signature Algorithm] => sha256WithRSAEncryption
            [Public Key Algorithm] => rsaEncryption
            [X509v3 Authority Key Identifier] => keyid:0F:80:61:1C:82:31:61:D5:2F:28:E7:8D:46:38:B4:2C:E1:C6:D9:E2
            [X509v3 Subject Key Identifier] => 19:CC:45:9E:A3:04:60:A5:A6:A4:6F:4C:E0:BB:82:CC:9D:DE:19:74
            [X509v3 Subject Alternative Name] => DNS:www.buienradar.nl,DNS:buienradar.nl,DNS:*.buienradar.be,DNS:*.buienradar.nl,DNS:buienradar.be
            [X509v3 Key Usage] => DigitalSignature,KeyEncipherment
            [X509v3 Extended Key Usage] => TLSWebServerAuthentication,TLSWebClientAuthentication
            [X509v3 CRL Distribution Points] => , FullName:, URI:http://crl3.digicert.com/ssca-sha2-g6.crl, 
FullName:, URI:http://crl4.digicert.com/ssca-sha2-g6.crl
            [X509v3 Certificate Policies] => Policy:2.16.840.1.114412.1.1, CPS:https://www.digicert.com/CPS, Policy:2.23.140.1.2.2
            [Authority Information Access] => OCSP-URI:http://ocsp.digicert.com, CAIssuers-URI:http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
            [X509v3 Basic Constraints] => CA:FALSE
            [CT Precertificate SCTs] => SignedCertificateTimestamp:, Version:v1(0x0), LogID:EE:4B:BD:B7:75:CE:60:BA:E1:42:69:1F:AB:E1:9E:66:, A3:0F:7E:5F:B0:72:D8:83:00:C4:7B:89:7A:A8:FD:CB, Timestamp:Jan1015:41:45.4112020GMT, Extensions:none, Signature:ecdsa-with-SHA256, 30:44:02:20:13:37:09:D4:11:B5:BA:C5:11:36:93:2E:, 93:80:5C:AD:80:CA:9F:B5:62:78:E5:0D:79:F5:67:C1:, 1D:FE:94:92:02:20:5B:F3:B9:A7:DE:9A:4F:97:48:65:, 25:8C:F0:0C:4D:12:9C:04:31:23:1D:AA:EA:C8:C2:28:, 47:98:AF:37:FD:5D, SignedCertificateTimestamp:, Version:v1(0x0), LogID:87:75:B
            [Start date] => Jan 10 00:00:00 2020 GMT
            [Expire date] => Mar 10 12:00:00 2021 GMT
            [RSA Public Key] => 2048
            [rsa(n)] => B0310E5AF3AC77139ACD4D62D27A6D669207998534888D569EE86C698CBCD248A00A1FEBE0D921C0FFA0248B55B6AAFA842A3125F1DABEFAF3BA5E765F5212DDEA71936B481618CC30EC90606DE6ED6DF45D567AAE7BD24A38DF1BCE4B6DA99A7680462A801DFFAC98FE1694F5B21D87F41BD7C0E41D1668ED95E981FCAB421977F09ACEEF6FEA7D70CE7B4413174FA1E724BC44293CE3FE62824F45B5EF063FB4795FBA121CB7BF6CDF0ADC62DF245DD961A7021DC5998D7CEAD1B4E790C6AA0341F3AF6CC75BCE7F4857F345499EFE5E35DEE53E3A872E51D171C697DCFD0A1179360F12E1ABED867757F5701624C30E781FB3DFEB4009249DFEAA9881C643
            [rsa(e)] => 10001
            [Signature] => 16:69:d8:95:95:e9:4b:55:0f:05:6d:54:dd:3f:f7:f0:eb:c2:e5:81:87:53:d0:e1:50:c4:ee:19:4c:58:2a:5d:bf:b8:83:3a:df:ea:1f:bc:54:79:a2:f6:f4:ce:46:ec:2f:4d:0d:74:fd:4c:86:0f:5b:41:1a:41:d9:85:68:eb:41:7e:fb:27:cd:cb:78:cd:ff:7e:b1:d2:1e:e1:2d:82:7f:13:e2:95:5a:4f:6a:31:66:5c:20:7c:b5:2f:e0:e7:22:0e:da:d5:42:b1:34:64:9b:b4:2f:da:0c:34:45:c0:2c:42:97:ae:25:1a:22:5e:61:50:18:11:61:d8:99:90:2d:d3:11:ec:b0:e0:cb:58:4d:d9:4e:7a:de:57:f6:ec:d5:57:79:16:f2:d0:36:79:b7:12:25:72:f2:f0:39:00:0d:da:71:33:07:45:05:17:75:7a:e6:c2:56:d5:37:8a:a2:b3:87:b8:a5:95:21:b4:9a:2c:4d:40:81:d6:33:2d:18:e1:2f:0f:d9:32:e0:4a:b0:e2:29:39:6f:02:2d:e5:75:c1:0e:af:56:93:b4:01:e6:26:a0:2e:3c:06:0a:61:a5:84:08:4b:19:3c:4e:5d:a4:64:04:a1:e9:8a:33:03:0d:c6:3a:3b:dc:13:bb:5f:5e:86:5d:85:4f:85:b0:1a:
            [Cert] => -----BEGIN CERTIFICATE-----
MIIGgzCCBWugAwIBAgIQC8wHR1o8a23f1+UWQ9cP/jANBgkqhkiG9w0BAQsFADBN
**INGEKORT**
JqAuPAYKYaWECEsZPE5dpGQEoemKMwMNxjo73BO7X16GXYVPhbAa
-----END CERTIFICATE-----

        )

    [1] => Array
        (
            [Subject] => C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
            [Issuer] => C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
            [Version] => 2
            [Serial Number] => 01fda3eb6eca75c888438b724bcfbc91
            [Signature Algorithm] => sha256WithRSAEncryption
            [Public Key Algorithm] => rsaEncryption
            [X509v3 Basic Constraints] => CA:TRUE,pathlen:0
            [X509v3 Key Usage] => DigitalSignature,CertificateSign,CRLSign
            [Authority Information Access] => OCSP-URI:http://ocsp.digicert.com
            [X509v3 CRL Distribution Points] => , FullName:, URI:http://crl3.digicert.com/DigiCertGlobalRootCA.crl, 
FullName:, URI:http://crl4.digicert.com/DigiCertGlobalRootCA.crl
            [X509v3 Certificate Policies] => Policy:X509v3AnyPolicy, CPS:https://www.digicert.com/CPS
            [X509v3 Subject Key Identifier] => 0F:80:61:1C:82:31:61:D5:2F:28:E7:8D:46:38:B4:2C:E1:C6:D9:E2
            [X509v3 Authority Key Identifier] => keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55
            [Start date] => Mar  8 12:00:00 2013 GMT
            [Expire date] => Mar  8 12:00:00 2023 GMT
            [RSA Public Key] => 2048
            [rsa(n)] => DCAE58904DC1C4301590355B6E3C8215F52C5CBDE3DBFF7143FA642580D4EE18A24DF066D00A736E1198361764AF379DFDFA4184AFC7AF8CFE1A734DCF339790A2968753832BB9A675482D1D56377BDA31321AD7ACAB06F4AA5D4BB74746DD2A93C3902E798080EF13046A143BB59B92BEC207654EFCDAFCFF7AAEDC5C7E55310CE83907A4D7BE2FD30B6AD2B1DF5FFE5774533B3580DDAE8E4498B39F0ED3DAE0D7F46B29AB44A74B58846D924B81C3DA738B129748900445751ADD37319792E8CD540D3BE4C13F395E2EB8F35C7E108E8641008D456647B0A165CEA0AA29094EF397EBE82EAB0F72A7300EFAC7F4FD1477C3A45B2857C2B3F982FDB745589B
            [rsa(e)] => 10001
            [Signature] => 23:3e:df:4b:d2:31:42:a5:b6:7e:42:5c:1a:44:cc:69:d1:68:b4:5d:4b:e0:04:21:6c:4b:e2:6d:cc:b1:e0:97:8f:a6:53:09:cd:aa:2a:65:e5:39:4f:1e:83:a5:6e:5c:98:a2:24:26:e6:fb:a1:ed:93:c7:2e:02:c6:4d:4a:bf:b0:42:df:78:da:b3:a8:f9:6d:ff:21:85:53:36:60:4c:76:ce:ec:38:dc:d6:51:80:f0:c5:d6:e5:d4:4d:27:64:ab:9b:c7:3e:71:fb:48:97:b8:33:6d:c9:13:07:ee:96:a2:1b:18:15:f6:5c:4c:40:ed:b3:c2:ec:ff:71:c1:e3:47:ff:d4:b9:00:b4:37:42:da:20:c9:ea:6e:8a:ee:14:06:ae:7d:a2:59:98:88:a8:1b:6f:2d:f4:f2:c9:14:5f:26:cf:2c:8d:7e:ed:37:c0:a9:d5:39:b9:82:bf:19:0c:ea:34:af:00:21:68:f8:ad:73:e2:c9:32:da:38:25:0b:55:d3:9a:1d:f0:68:86:ed:2e:41:34:ef:7c:a5:50:1d:bf:3a:f9:d3:c1:08:0c:e6:ed:1e:8a:58:25:e4:b8:77:ad:2d:6e:f5:52:dd:b4:74:8f:ab:49:2e:9d:3b:93:34:28:1f:78:ce:94:ea:c7:bd:d3:c9:6d:1c:de:5c:32:f3:
            [Cert] => -----BEGIN CERTIFICATE-----
MIIElDCCA3ygAwIBAgIQAf2j627KdciIQ4tyS8+8kTANBgkqhkiG9w0BAQsFADBh
**INGEKORT**
j6tJLp07kzQoH3jOlOrHvdPJbRzeXDLz
-----END CERTIFICATE-----

        )

)

[HTTP REQUEST HEADER]

GET /2.0/feed/json HTTP/2
Host: data.buienradar.nl
accept: */*

[HTTP RESPONSE HEADER]

HTTP/2 200 
content-type: application/json
server: Microsoft-IIS/10.0
request-context: appId=cid-v1:edc7228b-6b2c-4316-88f0-d7cb6d4cb317
strict-transport-security: max-age=2592000
x-powered-by: ASP.NET
cache-control: public, max-age=11
date: Thu, 17 Dec 2020 16:25:32 GMT
content-length: 34343
set-cookie: ak_bmsc=AD5A82B1B1DD6A1B8212BA394E51383317CAE50E311100007C86DB5F506DE836~plSNXT6IHww3f3tzrInBPLkkal9SUjER6hJH/BQnsh2cQWiXun/gW611F7Qq30ZtJgk2PmJfBz8YVyzjjvNo4cT5cuSB5ZoeblzRKSSY3/bgAbzLmIlYdBVkJRtff3vzGfIwvN2pti5uBBGwQotj/cYx6o29mXXtCrB5dn9Ga82RJTingBkZivGhktUtJK/P9z5qJP4Wp3e4l0h0XCNMEUwb7gF6wNQ/69yVhY/ey+M+Y=; expires=Thu, 17 Dec 2020 18:25:32 GMT; max-age=7200; path=/; domain=.buienradar.nl; HttpOnly
access-control-max-age: 86400
access-control-allow-credentials: false
access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept-Encoding
access-control-allow-methods: GET,POST,PUT
access-control-allow-origin: *

[HTTP RESPONSE BODY]

{"$id":"1","buienradar":{"$id":"2","copyright":"(C)opyright Buienradar / RTL. Alle rechten voorbehouden","terms":"Deze feed mag vrij worden gebruikt onder voorwaarde van bronvermelding buienradar.nl inclusief een hyperlink naar https://www.buienradar.nl. Aan de feed kunnen door gebruikers of andere personen geen rechten worden ontleend."},
**INGEKORT**
{"$id":"64","day":"2020-12-22T00:00:00","mintemperature":"4/7","maxtemperature":"8/12","mintemperatureMax":7,"mintemperatureMin":4,"maxtemperatureMax":12,"maxtemperatureMin":8,"rainChance":80,"sunChance":10,"windDirection":"zw","wind":4,"mmRainMin":1.0,"mmRainMax":9.0,"weatherdescription":"Zwaar bewolkt en regen","iconurl":"https://www.buienradar.nl/resources/images/icons/weather/30x30/q.png"}]}}


[TCP]
Toont de IP adressen SOURCE => DESTINATION in de syntax ADDR:PORT
Hiermee kan je zien welk netwerk de reactie geeft, LAN of WAN. IP adres van Buienradar of niet...

[HTTP REQUEST/RESPONSE HEADER]
Toont de ruwe HTTP request line (request) en status line (response) met de header section.
Dit kan verhullen welke software de request tegenhoudt. (mbv header fields zoals; Server, X-Powered-By, Via ...)

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
jerryhopper schreef op donderdag 17 december 2020 @ 14:46:
Probeer eens deze functie, die laat je de redirects zien.
...
Bovenstaand voorbeeld resulteert in dit ( http->https redirect ):
http://data.buienradar.nl/2.0/feed/json ---> https://data.buienradar.nl/2.0/feed/json
Op basis van eerdere tests was al duidelijk dat we wel wat meer inzicht konden gebruiken dan alleen de URLs van de redirects... (zie mijn post hiervoor) Daarbij heeft deze code wat zaken handmatig geimplementeerd die gewoon standaard in cURL zitten. Kinda messy. :P

[ Voor 4% gewijzigd door Mr. HTTP op 17-12-2020 17:51 ]


  • ElMacaroni
  • Registratie: November 2012
  • Laatst online: 12-08 12:01

ElMacaroni

Laat de zon maar komen!

Topicstarter
Mr. HTTP schreef op donderdag 17 december 2020 @ 17:27:
Hierbij een iets ander script wat zich meer richt op het debuggen van HTTP I/O via cURL.
Toegevoegd is TCP source en destination, HTTP header trail en HTTP redirect trail.

--knip--
################################################################
[URL]


[TCP]
: => :

[HTTP REQUEST HEADER]

[HTTP RESPONSE HEADER]

HTTP/1.1 403 Forbidden :(
Server: AkamaiGHost
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 293
Expires: Thu, 17 Dec 2020 18:40:01 GMT
Date: Thu, 17 Dec 2020 18:40:01 GMT
Connection: close
Access-Control-Max-Age: 86400
Access-Control-Allow-Credentials: false
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept-Encoding
Access-Control-Allow-Methods: GET,POST,PUT
Access-Control-Allow-Origin: *

[HTTP RESPONSE BODY]

<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http://data.buienradar.nl/2.0/feed/json" on this server.<P>
Reference #18.77a1dd58.1608230401.43faadc2
</BODY>
</HTML>

SE2200+14xSF170S & SE1500M+4xTSM-375


  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
ElMacaroni schreef op donderdag 17 december 2020 @ 19:44:
HTTP/1.1 403 Forbidden
Server: AkamaiGHost
Duidelijk verhaal lijkt me. De reactie komt van Buienradar, je bent duidelijk op server niveau geblokt vandaar een standaard reactie van de server in plaats van een nette API response met foutindicatie.* Echt nette API implementaties zie ik trouwens zelden bij dit soort partijen. Meestal doen alleen partijen met een volledige developer focus het netjes of misschien is het slechts dit API endpoint...
Succes met opnieuw toestemming vragen en het implementeren van een cache optie voor als je weer toestemming krijgt en niet opnieuw geblokt wilt worden. oOo

[TCP] en [URL] bewust leeggelaten? Anders zit er nog een onverwacht foutje in mijn code :F ; niet dat het de conclusie verandert...

*= Op mijn eigen servers (nginx) krijgt een client die geblokt is (wegens ongeoorloofd gedrag) trouwens helemaal geen response maar wordt de verbinding gewoon verbroken. (nginx 444 optie). Het ligt ook erg aan de resource natuurlijk. Een API endpoint voor betaalde klanten heeft gewoon een nette foutindicatie, maar daarbij vaak ook duidelijke rate limit instructies...Iets wat je gratis kan gebruiken (zoals de data van Buienradar) wordt vaak niet zo uitgebreid ondersteund omdat er niet aan verdient wordt en het onderhoud/de implementatie dus ook niet teveel mag kosten...

[ Voor 32% gewijzigd door Mr. HTTP op 17-12-2020 20:14 ]

Pagina: 1