Problème pour récupérer une image sur un site tiers

Bonjour,

Une API me fournis une URL pour télécharger une image que je désire récupérer dans un plugin.

Je modifie l’URL dans mon code PHP pour avoir une image adaptée à mon besoin (Taille et transparence) puis lance un requête en utilisant curl de PHP.

Ceci fonctionnait bien il y a un certain temps. Mais maintenant, j’ai un retour avec un code 403.

Je peux utiliser l’URL modifiée depuis mon browser Firefox sans problème. J’ai donc tenté de récupérer les headers de la requête (y compris le user-agent) pour le mettre dans la requête Mais j’obtiens toujours un 403.

J’ai posté un email sur de site de documentation des API mais je n’ai pas de réponse.

Est-ce que l’un d’entre-vous a déjà rencontré ce genre de souci et peut me mettre sur une piste?

L’url est
https://cas.volvocars.com/image/dynamic/MY23_2217/536/exterior-v5/TF/73500/R98000/R150/FN01/TC06/2G03/_/TP05/LR02/JT02/GR08/T101/TJ02/NP02/TM04/JG02/CB04/EV02/JB0A/T222/LF05/_/VP07/FH01/_/_/_/_/_/_/default.png?market=se&client=gox-graph|public-api-engineering&angle=1&bg=ffffff00&w=1200

EDIT:
Voici la réponse du site avec le code 403

Array (
     [0] => HTTP/1.0 403 Forbidden
     [Server] => AkamaiGHost
     [Mime-Version] => 1.0
     [Content-Type] => text/html
     [Content-Length] => 747
     [Expires] => Fri, 06 Sep 2024 11:10:23 GMT
     [Date] => Fri, 06 Sep 2024 11:10:23 GMT
     [Connection] => close
     [Access-Control-Max-Age] => 86400
     [Access-Control-Allow-Credentials] => false
     [Access-Control-Allow-Headers] => *
     [Access-Control-Allow-Methods] => GET,POST
     [Access-Control-Allow-Origin] => *
     [Strict-Transport-Security] => max-age=15768000 ; includeSubDomains ; preload
 )

C’est quoi la commande curl que tu passe ?

J’en suis là avec mes essais:
Le contenu du header est une copie du header généré par firefox.

$session = curl_init($url);
$image = fopen($imgPath, 'wb');
curl_setopt($session,CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0");
curl_setopt($session,CURLOPT_FILE, $image);
curl_setopt($session,CURLOPT_HTTPHEADER,array(
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    "Accept-EncodingA: gzip, deflate, br",
    "Accept-Language: fr-CH,fr;q=0.8,fr-FR;q=0.6,en-US;q=0.4,en;q=0.2",
    "Cache-Control: no-cache",
    "Connection: keep-alive",
    "Cookie: ak_bmsc=89E02806C9BADAE13CA5D50F134062A2~000000000000000000000000000000~YAAQN2zerfwF8pqRAQAA2FWWxhlTaNCZ1lJ/QQIDDdOv6bn/IUF+swPzXteM2akRdoNc7wMAdAM/MGLhMLBCTbO6GN3EYGjrFkBHO3LeAcQZanQH43qfLef10awcdQpnSwbZX4MwNHFT8b/7hKBofPMl/39LuAn1e2TLJxvC3awtqvGM+V2m3QUCfZL1gEnXVZ/n/ppkvSjqFs7ST/nFmOuIU1nyQe10CcCI+CSTHzGnmZKOkjM/+QOR5TEPg0XrbhMraKj6Ym1c1+WYG+7wrM1AX24QjZ5WgF9DfybMxH/5ijlYNUUJCDiCUqWHNjSr50ZIkg5DvX/4RMQDEn1kzIqye8DbYtfq07+9xX0TxVf65yVOb1xL9hLzn6Wx7Uxqt7T9jcEcu1Lc; bm_sv=4AF3292DA01FE9109E4556379929DDB3~YAAQNmzerWu8WsGRAQAA2FyWxhl+0fcgdTz2I3NUl/BBX2f21xaAFO10H0vXkbqeqgXRzXhphZTmzrtUOqXacSXMYh/hVK5bO7RqgNrViq5sD1Y+cmNZoSXlp4HzQ0wBiUWrHUZscpsBos3XXBfoIljK9LjdRQ0LTXWWKR1i13kgOiPl1YwWuP93HkZHShCMFBlQp/zXxj6MZtrYsYPFvpVLR6uZ0GNLf+Y/2f9iy157kpWxZSvlzdCM3p+F1xtFegJE~1",
    "Host: cas.volvocars.com",
    "Pragma: no-cache",
    "Sec-Fetch-Dest: document",
    "Sec-Fetch-Mode: navigate",
    "Sec-Fetch-Site: cross-site",
    "Sec-Fetch-User: ?1",
    "TE: trailers",
    "Upgrade-Insecure-Requests: 1",
    "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0",
));
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($session, CURLOPT_HEADER, true);

$r = curl_exec($session);
$httpCode = curl_getinfo($session,CURLINFO_HTTP_CODE);
log::add("volvocars","debug","httpCode: " . $httpCode);
if ($httpCode != 200) {
    log::add("volvocars","error",sprintf(__("Erreur lors du téléchargement de l'image. HTTPCODE: %s",__FILE__), $httpCode));
    log::add("volvocars","error",$r);
}
curl_close($session);
fclose($image);

Pour info,
Lors de l’écriture de mon premier post, J’ai eu un message dans la prévisualisation qui me disait que l’image ne pourra pas être affichée dans le forum en raison d’une réponse avec un code 403

Il semble que le problème vient de akamaighost qui filtre les requêtes.

J’ai vu plusieurs articles sur internet à ce sujet. Il faudra que je creuse ce week-end…

effectivement moi aussi j’ai la même erreur.
j’ai trouvé ça si tu a compte et mdp:
https://github.com/Guley/Curl-Api-Upload-Image/blob/master/Image.php

Hello,
Merci pour l’info.
J’ai bien un compte et mdp mais pour les requêtes API qui me retourne, entre autres, l’URL pour aller chercher l’image. Cette image se trouve sur un autre serveur qui ne demande pas de login.

De ce que j’ai compris jusque là, AkamaiGhost détermine si la requête vient d’un humain ou d’un robot en utilisant une AI. Il laisse passer les humains et certains robots.

Je me donne le weekend pour trouver une solution. Sinon, je demanderai à l’utilisateur de télécharger lui-même l’image (en lui fournissant l’URL) puis de l’envoyer dans Jeddom. Pas beau mais à faire une seule fois par équipement du plugin.

Merci pour le test, ça confirme que le soucis ne vient pas de mon adresse IP.

Hello,

tu as essayé en changeant le user-agent (pour lui faire croire que tu es un chrome par exemple :stuck_out_tongue: ) de ta requête curl ? (ou autre)

TiTidom.

Oui,
C’est dans le code plus haut.
J’ai déjà eu un blocage il y a quelque temps et cette solution avait fonctionné. Mais plus maintenant :sob:

J’ai même tenté de reprendre tout le header envoyé par Firefox mais il semble que AkamaiGhost remarque que l’empreinte n’est pas la bonne.

avec cette conf curl :

<?php 
  $url = 'https://cas.volvocars.com/image/dynamic/MY23_2217/536/exterior-v5/TF/73500/R98000/R150/FN01/TC06/2G03/_/TP05/LR02/JT02/GR08/T101/TJ02/NP02/TM04/JG02/CB04/EV02/JB0A/T222/LF05/_/VP07/FH01/_/_/_/_/_/_/default.png?market=se&client=gox-graph';

// Enregistrer l'image
$ch = curl_init($url);
#$fp = fopen($img, 'wb');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
	"accept: application/json",
	"content-type:application/json"
));
                curl_exec($ch);?>

et voici la réponse :

<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
 
You don't have permission to access "http&#58;&#47;&#47;cas&#46;volvocars&#46;com&#47;image&#47;dynamic&#47;MY23&#95;2217&#47;536&#47;exterior&#45;v5&#47;TF&#47;73500&#47;R98000&#47;R150&#47;FN01&#47;TC06&#47;2G03&#47;&#95;&#47;TP05&#47;LR02&#47;JT02&#47;GR08&#47;T101&#47;TJ02&#47;NP02&#47;TM04&#47;JG02&#47;CB04&#47;EV02&#47;JB0A&#47;T222&#47;LF05&#47;&#95;&#47;VP07&#47;FH01&#47;&#95;&#47;&#95;&#47;&#95;&#47;&#95;&#47;&#95;&#47;&#95;&#47;default&#46;png&#63;" on this server.<P>
Reference&#32;&#35;18&#46;853e2217&#46;1725639325&#46;344cef11
<P>https&#58;&#47;&#47;errors&#46;edgesuite&#46;net&#47;18&#46;853e2217&#46;1725639325&#46;344cef11</P>
</BODY>
</HTML>

sans mettre de compte et mdp ou token api.

Salut
essayer avec « Access-Control-Allow-Origin: * »,

$_url='https://cas.volvocars.com/image/dynamic/MY23_2217/536/exterior-v5/TF/73500/R98000/R150/FN01/TC06/2G03/_/TP05/LR02/JT02/GR08/T101/TJ02/NP02/TM04/JG02/CB04/EV02/JB0A/T222/LF05/_/VP07/FH01/_/_/_/_/_/_/default.png?market=se&client=public-api-engineering&angle=1&bg=ffffff00&w=1200';

  		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $_url);
  		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
  		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 6);
		$headers = [
              "Accept: image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8",
              //"Accept-Encoding: gzip, deflate, br, zstd",
              "Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3",
              "Connection: keep-alive",
          	  "Access-Control-Allow-Origin: *",
          	  "Pragma: no-cache",
              "Host: cas.volvocars.com",
              "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0"
        ];
  		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  		//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
		$data = curl_exec($ch);
		echo '<p> fff: '.$data;

ça marche :grinning:

Mais…
Le user-agent Windows me piquait un peu les yeux. J’ai donc mis le user Agent du Firefox qui tourne sur ma machine Linux. Du coup, j’ai de nouveau eu des erreur 403 (alors que je peux télécharger l’image depuis mon Firefox) je suis donc remis l’user-agent Windows :unamused:.

D’après ce que j’ai lu, AkamaiGhost utilise des méthodes heuristiques pour déterminer s’il a affaire à un bots ou non. Il est donc fort possible que ce qui fonctionne aujourd’hui ne fonctionne plus dans quelques temps.

Je vais donc coder mon plugin avec ta config qui fonctionne aujourd’hui et voir pour implémenter un plan B qui permettra à l’utilisateur de charger lui-même l’image dans Jeedom.

"User-Agent: Moza/6.0 (Limad44) Firefox/130.0" ça marche aussi :wink:

ça fait partie des joies du reverse !

2 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.