Ejemplo de API Data Explorer en PHP

Estoy trabajando para extraer datos de Discourse usando PHP y la API del Explorador de Datos. Aquí está el esqueleto de mi código PHP para que otros lo usen como punto de partida.

Código PHP

<?php
// Establecer clave API
$api_key = '<tu clave va aquí>';
//
// 1. $url debe establecerse en la URL de tu foro de Discourse
// 2. Obtén el # de consulta que deseas ejecutar. Actualiza la URL para esa consulta
//    es decir, consulta #5 => .../queries/5/run
//    es decir, consulta #47 => .../queries/47/run
$url = 'https://discourse.com/admin/plugins/explorer/queries/7/run';
//
// Actualiza tus parámetros para pasarlos a la consulta.
// Ejemplo para un parámetro - codificado
// $data = 'params={"user":"fred_smith"}';
// Ejemplo para un parámetro - pasando una variable
// $data = 'params={"user":"'.$user.'"}';
// Ejemplo para dos o más parámetros - pasando una variable
$data = 'params={"user":"'.$user.'","term":"'.$term.'"}';
//
// Comandos Curl
//
$headers = array("Content-Type: multipart/form-data;", "Api-Key: $api_key", "Api-Username: system");
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$result = curl_exec($ch);
if (curl_errno($ch) !== 0) {
   // Manejar error, llamar a curl_close($ch) y retornar.
}
curl_close($ch);
//
// Convertir el resultado de curl a un array de php para trabajar programáticamente
$result_array = json_decode($result, true);

print($result_array);

?>

Consulta del Explorador de Datos

En el ejemplo del código que utiliza dos variables pasadas, mi código del explorador de datos se veía así:

--[params]
-- string :term
-- string :user

SELECT users.username, posts.id, uploads.url, topics.title
     FROM upload_references
     JOIN uploads ON uploads.id = upload_references.upload_id
     JOIN posts   ON posts.id   = upload_references.target_id
     JOIN topics  ON topics.id  = posts.topic_id
     JOIN users   ON posts.user_id = users.id
    WHERE (posts.cooked like '%' || :term || '%'
       OR topics.title like '%' || :term || '%')
      AND users.username_lower like '%' || :user || '%'
      AND topics.archetype = 'regular'
 ORDER BY uploads.created_at DESC
 limit 10

Espero que esto ayude a alguien a poner en marcha un proyecto.

3 Me gusta

Me gustaría eliminar la mayoría de los comentarios para que sea más fácil de leer :slight_smile:
Algunos comentarios son innecesarios, como:

// Obtener resultado
//
$result = curl_exec( $ch );

o

// cerrar sesión de curl
curl_close( $ch );

Además, sepa que puede establecer el resaltado de sintaxis agregando el nombre del idioma a la primera línea de las comillas invertidas:

```php
$headers = array("Content-Type: multipart/form-data;","Api-Key: $api_key","Api-Username: system",);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
```

Se renderiza como

$headers = array("Content-Type: multipart/form-data;","Api-Key: $api_key","Api-Username: system",);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);

Gracias por tus comentarios. He actualizado las publicaciones iniciales.