Visualizzazione risultati 1 fino 13 di 13

Discussione: cURL improvvisamente non più funzionante

  1. #1
    Guest

    Predefinito cURL improvvisamente non più funzionante

    Buonasera, da alcune settimane i contenuti di una mia pagina non sono più visibili. Le chiamate cURL restituiscono NULL al posto del JSON precedente

    Il codice ha funzionato per mesi e non è stato modificato. Inoltre lo ho provato localmente, salvando manualmente il json prelevabile dalla url del codice che segue, e funziona regolarmente. Ripeto ha funzionato per mesi. Mi aiutate a capire?

    Di seguito il codice in questione, utilizzato per leggere il nome ed il numero di follower di un utente instagram:

    Codice PHP:
    <?php
    $url
    = "https://www.instagram.com/rds_official/?__a=1";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20 );
    $response = curl_exec ($ch);
    curl_close($ch);

    var_dump($response);
    echo
    '<br><br>errori: ';
    var_dump(curl_error($ch));
    echo
    '<br><br>';

    $result = json_decode($response, true);
    var_dump($result);
    echo
    '<br><br>';

    echo
    '<br><br>full name (_a): '.$result[graphql][user][full_name];
    echo
    '<br><br>follower count (_a): '.$result[graphql][user][edge_followed_by][count];
    echo
    '<br><br>following count (_a): '.$result[graphql][user][edge_follow][count];
    echo
    '<br><br>igtv video (_a): '.$result[graphql][user][edge_felix_video_timeline][count];
    ?>
    Ultima modifica di dreadnaut : 04-09-2020 alle ore 18.36.36 Motivo: + tag [php] attorno al codice

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Un array associativo può essere unicamente racchiuso da apici singoli o apici doppi (altrimenti per php è una costante), puoi mostrare l'errore?
    Comunque https://www.instagram.com/rds_official/?__a=1 effettua un redirect 302 https://www.instagram.com/accounts/l...ial/%3F__a%3D1 (%3F è il punto interrogativo nella codifica percent enconding, cioè non l'ho tratta come query string).
    Ultima modifica di darbula : 04-09-2020 alle ore 16.34.25

  3. #3
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    Confermo che il codice funziona in locale, ma non esattamente quello sopra. Come accennato da Darbula, l'accesso agli array causa un sacco di warning:
    Codice PHP:
    # no no
    echo '<br><br>full name (_a): '.$result[graphql][user][full_name];
    # corretto
    echo '<br><br>full name (_a): '.$result['graphql']['user']['full_name'];
    L'altro problema è che chiami curl_error dopo avere concluso la chiamata con curl_close, così non ottieni il messaggio di errore che stai cercando.

    Guarda se ottieni più informazioni chiamando curl_error al punto giusto:
    Codice PHP:
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20 );
    $response = curl_exec ($ch);

    if (!
    $response) {
    echo
    "<p>La richiesta ad Instagram è fallita: ", curl_error($ch);
    }

    curl_close($ch);
    Vedo un sacco di <br> in giro, quindi dopo tanti anni estraggo questo vecchio link

  4. #4
    Guest

    Predefinito

    Vi ringrazio per l'attenzione,
    rimango un neofita che scrive codice a tempo perso, quindi commetto sempre molti errori ed approfitterò per correggere e pulire quanto più possibile.
    Ma in questo caso il punto è un altro. Il codice di cui parlo ha funzionato continuativamente da ottobre 2018 a maggio 2020, tempo nel quale ho memorizzato i dati estratti nel MySql, poi improvvisamente il nulla.
    L'anomalia è che il risultato delle cURL ora è NULL mentre prima veniva correttamente decodificato il JSON prelevato.

    Lo stesso codice funziona in locale ma non funziona verso l'esterno.
    Di seguito il link del file che ho utilizzato per il test in locale.
    https://radiosocialbeat.altervista.o...am_profile.php
    Il codice cURL punta alla url "https://radiosocialbeat.altervista.org/php/sampleData6" dove è salvato il JSON prelevato dalla url "https://www.instagram.com/rds_official/?__a=1".

    Ho messo i var_dump per cercare di capire cosa accade. Vedete il var_dump di $response (il JSON), quello di $result (l'array) e i dati finali estratti da esso.

    Se però la cURL punta direttamente a "https://www.instagram.com/rds_official/?__a=1" come nel link seguente
    https://radiosocialbeat.altervista.o..._profile_2.php
    allora come vedete il risultato è NULL.
    Cosa è accaduto?


  5. #5
    GraphOGLRisorse non è connesso AlterGuru 2500
    Data registrazione
    14-02-2015
    Messaggi
    3,997

    Predefinito

    Salve,
    il 26 maggio 2020, è stato rimosso da AlterVista php 5.3. Ora la versione minore disponibile è php 5.6

    Come menzionato da darbula, e mostrato da dreadnaut, negli array ci vanno gli apici. Inoltre, come le ha fatto notare dreadnaut, la chiusura di curl va dopo curl_error().
    Codice PHP:
    <?php
    $url
    = "https://www.instagram.com/rds_official/?__a=1";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20 );
    $response = curl_exec ($ch);

    var_dump($response);
    echo
    '<br><br>errori: ';
    var_dump(curl_error($ch));
    echo
    '<br><br>';
    curl_close($ch);

    $result = json_decode($response, true);
    var_dump($result);
    echo
    '<br><br>';

    echo
    '<br><br>full name (_a): '.$result["graphql"]["user"]["full_name"];
    echo
    '<br><br>follower count (_a): '.$result["graphql"]["user"]["edge_followed_by"]["count"];
    echo
    '<br><br>following count (_a): '.$result["graphql"]["user"]["edge_follow"]["count"];
    echo
    '<br><br>igtv video (_a): '.$result["graphql"]["user"]["edge_felix_video_timeline"]["count"];
    ?>
    Cordiali saluti.
    Ultima modifica di GraphOGLRisorse : 04-09-2020 alle ore 20.27.37

  6. #6
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Comunque credo che in locale esegue il redirect mentre in remoto no.. imposta questo su false https://curl.haxx.se/libcurl/c/CURLO...WLOCATION.html che comunque è curl_setopt (in php).
    Lei riscontra un errore ma se non è scritto in modo corretto per un programmatore è un errore anche se visualizerebbe i dati.

  7. #7
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    Citazione Originalmente inviato da radiosocialbeat Visualizza messaggio
    Cosa è accaduto?
    L'unico modo per sapere con certezza cosa non funziona è chiamare curl_error() e stamparne il risultato. Senza di quello possiamo solo supporre.

  8. #8
    Guest

    Predefinito

    Ho corretto gli apici e la posizione della chiamata a curl_error, inserendo il CURLOPT_FOLLOWLOCATION con valore false, come sotto.

    Codice PHP:
    <?php
    $url
    = "https://www.instagram.com/rds_official/?__a=1";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20 );
    $response = curl_exec ($ch);
    if (!
    $response) {
    echo
    "<p>echo di curl_error: ", curl_error($ch);
    }
    curl_close($ch);

    echo
    '<br><br>var_dump di $response: ';
    var_dump($response);

    echo
    '<br><br>var_dump di $result: ';
    $result = json_decode($response, true);
    var_dump($result);


    echo
    '<br><br>Dati estratti da $result: ';
    echo
    '<br><br>full name (_a): '.$result['graphql']['user']['full_name'];
    echo
    '<br><br>follower count (_a): '.$result['graphql']['user']['edge_followed_by'][count];
    echo
    '<br><br>following count (_a): '.$result['graphql']['user']['edge_follow'][count];
    echo
    '<br><br>igtv video (_a): '.$result['graphql']['user']['edge_felix_video_timeline'][count];

    ?>
    l'output a video è il seguente:

    Codice:
    echo di curl_error:
    
    var_dump di $response: string(0) ""
    
    var_dump di $result: NULL
    
    Dati estratti da $result:
    
    full name (_a):
    
    follower count (_a):
    
    following count (_a):
    
    igtv video (_a):
    Stessa cosa senza il CURLOPT_FOLLOWLOCATION. Scusate la mia ignoranza, ma non capisco il redirect: se incollo "https://www.instagram.com/rds_official/?__a=1" nella barra indirizzo ottengo direttamente da quella url a video il JSON cercato.
    Ultima modifica di dreadnaut : 05-09-2020 alle ore 19.43.49 Motivo: + tag [php] attorno al codice

  9. #9
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Instagram necessita l'utente autenticato nel caso non sei autenticato effettua un redirect alla pagina di login.
    Il CURLOPT_FOLLOWLOCATION impostato su false era per testare se ottenevi lo stesso risultato dell'ambiente locale e remoto (cioè senza redirect tra una pagina all'altra).
    Dovresti controllare e includere CURLOPT_HEADER di risposta nel tuo php curl.
    Dovresti anche modificare in
    Codice PHP:
    if (gettype($response) != 'string' && $response !== TRUE) {
    echo
    "<p>echo di curl_error: ", curl_error($ch);
    }
    altrimenti se la pagina è con contenuto vuoto a te sembra errore ma non lo è.
    Ultima modifica di darbula : 05-09-2020 alle ore 15.49.23

  10. #10
    GraphOGLRisorse non è connesso AlterGuru 2500
    Data registrazione
    14-02-2015
    Messaggi
    3,997

    Predefinito

    Metta questo a inizio del codice dopo il tag php:
    Codice PHP:
    error_reporting(E_ALL);
    così se ci sono errori non dichiarati vengono mostrati.

    Cordiali saluti.

  11. #11
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    @darbula: in questo caso non c'è motivo di modificare l'if come da te suggerito, la condizione è equivalente. Se proprio vuoi, questo è sufficiente:
    Codice PHP:
    if ($response === false) {
    echo
    curl_error($ch);
    }
    @radiosocialbeat: l'URL che sui sembra far parte della "Legacy API" che è stata disabilitata di recente. Perché funzioni ancora da locale resta un mistero. Ho provato anche a copiare tutti gli header della richiesta dal browser, ma ogni chiamata server-2-server viene redirezionata alla pagina di login.

    Ho paura ti tocchi usare la nuova API, che richiede un paio di passi in più per la registrazione e l'autenticazione

    [edit] forse questa libreria ti aiuta? https://github.com/aakatheeri/Instagram-Basic-API
    Ultima modifica di dreadnaut : 05-09-2020 alle ore 20.24.13

  12. #12
    Guest

    Predefinito

    Ho provato a mettere la pagina su un altro hosting web e funziona. (Io non sono autenticato su instagram, da ogni pagina, senza fare login, con il suffisso "/?__a=1" si ottiene il JSON del feed pubblico).
    Devo controllare qualcosa a livello di permessi e/o abilitazioni su altervista? Ho gia' impostato il senza restrizioni nelle impoatazioni php - connessione server to server

  13. #13
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    Ho provato lo stesso codice su tre server: UK e DE stesso error, HU funziona.

    Documentazione + errori + incertezza = metodo altamente sconsigliato.
    Ultima modifica di dreadnaut : 05-09-2020 alle ore 21.57.37

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •