¿Cómo usar cURL para obtener datos jSON y decodificar los datos?

96

Entonces tengo un enlace que devuelve un objeto jSON, y necesito decodificarlo y ponerlo en variables en PHP.

URL

api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1

Este es el objeto que devuelve

{
    "count": 1,
    "threads": {
        "38752": {
            "thread_id": 38752,
            "node_id": 4,
            "title": "The ShadyCraft Beta Launch!",
            "reply_count": 45,
            "view_count": 946,
            "user_id": 2,
            "username": "Shady",
            "post_date": 1366956695,
            "sticky": 0,
            "discussion_state": "visible",
            "discussion_open": 1,
            "discussion_type": "",
            "first_post_id": 226167,
            "first_post_likes": 7,
            "last_post_date": 1369094302,
            "last_post_id": 228226,
            "last_post_user_id": 2,
            "last_post_username": "Shady",
            "prefix_id": 19,
            "tinhte_xentag_tags": "a:4:{i:0;s:9:\"minecraft\";i:2;s:4:\"news\";i:3;s:14:\"private server\";i:1;s:10:\"shadycraft\";}",
            "content": {
                "count": 1,
                "content": {
                    "226167": {
                        "post_id": 226167,
                        "thread_id": 38752,
                        "user_id": 2,
                        "username": "Shady",
                        "post_date": 1366956695,
                        "message": "[ATTACH=full]4143[\/ATTACH]\n \nWe've completely restructured ShadyCraft, and today will be the launch of the ShadyCraft beta.\n \nCurrent Features\n[LIST]\n[*]Towns\n[*]Nations\n[*]All out wars\n[*]A live update map\n[*]No White-list\n[*]Earn Money\n[*]Griefing allowed where possible\n[\/LIST]\nThese are just some features which have a lot more things behind them. For instance, there is town and nation upkeep, tax, kingdoms, mayors, and kings.\n \nWe really wanted to have the server self-governed and this is why griefing and PvP are allowed where ever they are possible. All towns and nations cannot be griefed by other members. You can create a town and buy plots for it and expand the town as you wish.\n \n[SIZE=4]All of this is shown in the live updating map located [URL='http:\/\/50.7.6.116:8123']here[\/URL].[\/SIZE]\n \n[SIZE=4][SIZE=6]Join the Beta Now[\/SIZE][\/SIZE]\n[SIZE=6]Server-IP: 50.7.6.116[\/SIZE]\n \n \n[USER=118053]Frenchy[\/USER] and [USER=4863]Wolfbane[\/USER]",
                        "ip_id": 747429,
                        "message_state": "visible",
                        "attach_count": 1,
                        "position": 0,
                        "likes": 7,
                        "like_users": "a:5:{i:0;a:2:{s:7:\"user_id\";i:105699;s:8:\"username\";s:6:\"kvothe\";}i:1;a:2:{s:7:\"user_id\";i:146724;s:8:\"username\";s:12:\"Graveyard219\";}i:2;a:2:{s:7:\"user_id\";i:70182;s:8:\"username\";s:9:\"wmbrown18\";}i:3;a:2:{s:7:\"user_id\";i:5473;s:8:\"username\";s:9:\"Oblivious\";}i:4;a:2:{s:7:\"user_id\";i:118053;s:8:\"username\";s:7:\"Frenchy\";}}",
                        "warning_id": 0,
                        "warning_message": "",
                        "anonymous_posting_real_user_id": 0,
                        "anonymous_posting_real_username": ""
                    }
                }
            }
        }
    }
}

Realmente solo estoy interesado en el

"title":"The ShadyCraft Beta Launch!",  
"reply_count:"45, 
"view_count": 946,  
"user_id":2, 
"username":"Shady", 
"post_date":1366956695, 
"sticky":0, 
"discussion_state":"visible",
"discussion_open":1,

y finalmente el mensaje

[ATTACH=full]4143[/ATTACH]

We've completely restructured ShadyCraft, and today will be the launch of the ShadyCraft beta.

Current Features
[LIST]
[*]Towns
[*]Nations
[*]All out wars
[*]A live update map
[*]No White-list
[*]Earn Money
[*]Griefing allowed where possible
[/LIST]
These are just some features which have a lot more things behind them. For instance, there is town and nation upkeep, tax, kingdoms, mayors, and kings.

We really wanted to have the server self-governed and this is why griefing and PvP are allowed where ever they are possible. All towns and nations cannot be griefed by other members. You can create a town and buy plots for it and expand the town as you wish.

[SIZE=4]All of this is shown in the live updating map located [URL='http://50.7.6.116:8123']here[/URL].[/SIZE]

[SIZE=4][SIZE=6]Join the Beta Now[/SIZE][/SIZE]
[SIZE=6]Server-IP: 50.7.6.116[/SIZE]


[USER=118053]Frenchy[/USER] and [USER=4863]Wolfbane[/USER]

Entonces, ¿cómo puedo extraer el objeto jSON y ponerlo en las variables correctas en PHP, que luego puedo usar?

Variables como: $username, $user_id, $message, $title, $discussionState, y así sucesivamente.

Solo necesito saber cómo puedo recuperar el objeto jSON y luego extraer los datos en variables en PHP.

Ahora puedo obtener la matriz de PHP, pero tengo algunos problemas para llamar a los valores correctos. Aquí está la matriz.

Ha pasado bastante tiempo desde que comenzamos a integrar los foros de phanime con el sitio principal. Ahora hemos terminado la integración con los foros de phanime y el sitio principal. Ya no notará que hay dos plataformas que ejecutan phanime, sino solo una. ¡Nuestro siguiente paso es crear un tema para los foros para que parezca el sitio principal! [ip_id] => 268 [message_state] => visible [attach_count] => 0 [position] => 0 [likes] => 0 [like_users] => a: 0: {} [warning_id] => 0 [warning_message] =>))))))

Ahora digamos que esta matriz se nombró $arrayentonces para obtener el valor del primer elemento "[cuenta]". No puedo simplemente decir lo siguiente: print $array["[count]"] <- esto devuelve un error.

¿Qué pasa con el elemento que tiene un valor como una matriz en sí, que es el [threads]elemento? ¿Cómo obtengo, quizás el [thread_id]valor del elemento?

Maaz
fuente

Respuestas:

267

Creo que este responderá a tu pregunta: P

$url="https://.../api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=‌​desc&limit=1&grab_content&content_limit=1";

Utilizando cURL

//  Initiate curl
$ch = curl_init();
// Will return the response, if false it print the response
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Set the url
curl_setopt($ch, CURLOPT_URL,$url);
// Execute
$result=curl_exec($ch);
// Closing
curl_close($ch);

// Will dump a beauty json :3
var_dump(json_decode($result, true));

Utilizando file_get_contents

$result = file_get_contents($url);
// Will dump a beauty json :3
var_dump(json_decode($result, true));

Accediendo

$array["threads"][13/* thread id */]["title"/* thread key */]

Y

$array["threads"][13/* thread id */]["content"/* thread key */]["content"][23/* post id */]["message" /* content key */];
Wesley Schleumer de Góes
fuente
1
Actualicé la pregunta con la pequeña dificultad que tengo al trabajar con la matriz PHP que devuelve jSON. Por favor, lea la parte inferior si puede.
Maaz
¡Hola! Me estoy acercando a un problema similar gracias a tu respuesta, pero todavía estoy atascado en el cajero automático, ¿te importaría echar un vistazo? stackoverflow.com/questions/28033267/…
Leon Gaban
Así es. CURLOPT_RETURNTRANSFERdame el resultado correcto (y) ¡Gracias!
ariyandi
Después de pasar horas, agregando la línea // Desactivar la verificación SSL curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); devuelve el resultado.
kta
10

para obtener el objeto, no necesita usar cURL (está cargando otro dll en la memoria y tiene otra dependencia, a menos que realmente necesite curl, me quedaría con las funciones php integradas), puede usar un archivo php simple_get_contents (url) función: http://il1.php.net/manual/en/function.file-get-contents.php

$unparsed_json = file_get_contents("api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1");

$json_object = json_decode($unparsed_json);

luego json_decode () analiza JSON en un objeto PHP, o una matriz si pasa trueal segundo parámetro. http://php.net/manual/en/function.json-decode.php

Por ejemplo:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));           // Object
var_dump(json_decode($json, true));     // Associative array
Dory Zidon
fuente
¿Qué pasa con la URL? ¿Cómo recupero el objeto jSON en primer lugar y lo configuro en la variable $ json? La URL es: /api.php?action=getThreads&hash=123fajwersa&node_id=4&order_by=post_date&order=desc&limit=1&grab_content&content_limit=1 que devuelve el objeto jSON.
Maaz
1
Actualicé la pregunta con la pequeña dificultad que tengo al trabajar con la matriz PHP que devuelve jSON. Por favor, lea la parte inferior si puede.
Maaz
Esto es incorrecto. No puede pasar una URL a file_get_contents () ... debe ser el nombre del archivo (ruta).
Henrik Petterson
@HenrikPetterson: file_get_contents puede usarse absolutamente para buscar una URL, no solo archivos locales. Aunque cURL ofrece más opciones y probablemente sea una mejor opción para todos los casos de uso menos los más simples. Consulte aquí para obtener más información: php.net/manual/en/function.file-get-contents.php
ineedhelp
7

Puedes usar esto para Curl:

function fakeip()  
{  
    return long2ip( mt_rand(0, 65537) * mt_rand(0, 65535) );   
}  

function getdata($url,$args=false) 
{ 
    global $session; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: ".fakeip(),"X-Client-IP: ".fakeip(),"Client-IP: ".fakeip(),"HTTP_X_FORWARDED_FOR: ".fakeip(),"X-Forwarded-For: ".fakeip())); 
    if($args) 
    { 
        curl_setopt($ch, CURLOPT_POST, 1); 
        curl_setopt($ch, CURLOPT_POSTFIELDS,$args); 
    } 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    //curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:8888"); 
    $result = curl_exec ($ch); 
    curl_close ($ch); 
    return $result; 
} 

Luego para leer Json:

$result=getdata("https://example.com");

Entonces :

///Deocde Json
$data = json_decode($result,true);
///Count
             $total=count($data);
             $Str='<h1>Total : '.$total.'';
             echo $Str;
//You Can Also Make In Table:
             foreach ($data as $key => $value)
              {
          echo '  <td><font  face="calibri"color="red">'.$value[type].'   </font></td><td><font  face="calibri"color="blue">'.$value[category].'   </font></td><td><font  face="calibri"color="green">'.$value[amount].'   </font></tr><tr>';

           }
           echo "</tr></table>";
           }

También puedes usar esto:

echo '<p>Name : '.$data['result']['name'].'</p>
      <img src="'.$data['result']['pic'].'"><br>';

Espero que esto haya ayudado.

Cazador de Dragxon Xelosr
fuente
esto me ayudó. pero tuve que reemplazar $ data con $ data ['result'] en las entradas de foreach en mi caso de uso.
Eaweb
0

también puedes usar

$result = curl_exec($ch);
return response()->json(json_decode($result));
HeshamSalama
fuente
-2

Puedes usar esto:

curl_setopt_array($ch, $options);
$resultado = curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info["url"]);
Sergio Nava
fuente