Lo siguiente fue duro hacerlo, dure como 3 días pensando como lograrlo de una forma correcta e ideando una forma que me funcionara bien.
Entonces para explicar lo que hace mi script.
Para los que no conocen bien trustpilot, es una web en la cual pueden hacer evaluaciones o reseñas de tu sitio web, la web tiene planes de pago que son de unos 100$ aproximadamente mensuales. evidentemente no quería pagar por esto y pensé en una forma de, traerme los comentarios para mostrarlos en mi web.
Entonces, la única forma era hacer un análisis del contenido del sitio e ir parseando poco a poco el contenido hasta traer los comentarios, las estrellas, la calificación, el nombre del usuario que realiza la crítica, y la imagen del usuario que realizo la crítica y ponerlo todo en un array para luego guardar el contenido en un archivo .json y así poder consumir ese archivo luego desde mi web.
La pregunta que se harán es ¿por qué guardarlo en un archivo .json y no mostrarlos directamente en tu web?
La respuesta es muy sencilla, el servidor de trustpilot usa el WAF de cloudfront el cual si realizas demasiadas peticiones (requests), te bloquea la conexión, entonces imagina que 3 o 4 usuarios ingresen a tu web, automáticamente el WAF detectara demasiadas peticiones desde la IP de tu servidor y te bloqueara el acceso, entonces no se imprimiría ningún contenido en tu web.
entonces para aclarar (el código lo arme apurado porque tenía otras cosas que hacer así que si encuentran algún error sería interesante reportarlo para arreglarlo lo antes posible sin embargo se puede ver en funcionamiento actualmente en )
¿Ahora, el código como funciona?
El script se conecta a trustpilot para traer los últimos comentarios > luego los guarda en un archivo llamado data.json en donde se almacenan hasta que hay nuevos comentarios.
El script se debe ejecutar con una tarea cron job en tu servidor o en tu cuenta cPanel diariamente para verificar si hay nuevos comentarios.
Iniciando el proceso de configuración, simplemente basta con solo cambiar la URL de tu sitio web en la variable: $website de la línea 10, por su sitio y ya funciona.
debes crear un archivo llamado data.json el cual trae en forma de array algo como:
JSON:
{
"ID del comentario": {
"nombre": "Nombre de quien te da la critica",
"estrellas": 5,
"titulo": "Titulo de la evaluacion o reseña",
"critica": "El comentario de la evaluacion",
"imagen": "La imagen, algo como: https://user-images.trustpilot.com/id_imagen/73x73.png",
"fecha": "Fecha, en formato: 28 January 2021"
}
}
Quiero aclarar que el script trae los últimos 12 comentarios hechos por tus clientes en trustpilot para no realizar tantas peticiones al servidor de trustpilot, Además solo trae los comentarios que tengan 5 estrenas.
También indicar que si el usuario que hace el comentario no tiene ningún avatar hay que configurar la ruta de la carpeta en la línea 58, yo les deje aquí adjunto la carpeta que hice con las estrellas y el archivo no_avatar por si algún usuario no contiene avatar.
Ahora para usar el codigo creen un archivo llamado cron.php dentro de una carpeta que diga trustpilot y allí colocan el código
Aquí les dejo el código PHP
PHP:
<?php
error_reporting(0);
ini_set('display_errors', 0);
declare(strict_types = 1);
header("Content-Type: text/plain;charset=utf-8");
$ch = curl_init();
curl_setopt($ch, CURLOPT_ENCODING, ''); // habilitar compresion
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_TIMEOUT, 40000);
$website = "cambiar_por_tu_dominio_o_tu_usuario_trustpilot";
curl_setopt($ch, CURLOPT_URL, "https://es.trustpilot.com/review/$website?languages=all");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$trustpilot = curl_exec($ch);
// checkear si pasa un error de lo contrario seguir
$trust_error = trim($trustpilot);
$error_internet = "We have received an unusually large amount of requests from your IP so you have been rate limited";
if (curl_errno($ch)) {
die('Error fatal: curl_exec fallo, ' . curl_errno($ch) . ": " . curl_error($ch));
} elseif (strip_tags($trust_error) == $error_internet) {
die("La direccion IP de tu servidor fue bloqueda, mensaje de error desde trustpilot: (" . strip_tags($trust_error) . ')');
} else {
echo "trustpilot cargado correctamente.. se guardo la data en el archivo JSON";
}
// aqui esta la magia (no tocar)
$domd = @DOMDocument::loadHTML($trustpilot);
$xp = new DOMXPath($domd);
// contador definido en 0 (definir 10 reviews mas abajo en el if)
$i = 0;
$todas_reviews = $xp->query(".//article[@class='review']");
$reviews = []; //array global
foreach ($todas_reviews as $review) {
if ($i < 12) {
//id del comentario
$id = $review->getAttribute("id");
$data_review_user_id = $review->getAttribute("data-review-user-id");
// toda la data sin parcear
$dataall = $xp->query(".//*[@data-initial-state='review-info']", $review)->item(0)->textContent;
// nombre de quien comenta
$convert_array_content = json_decode($dataall);
$json = json_encode($convert_array_content);
$array = json_decode($json, true);
$id = $array[reviewId];
$nombre = $array[consumerName];
$estrellas = $array[stars];
$titulo = $array[reviewHeader];
$critica = $array[reviewBody];
$imagen = $array[consumerProfileImage];
if ($imagen != null) {
$img = $imagen;
} else {
$img = "/trustpilot/img/no_avatar.png";
}
// fecha
$fecha = $xp->query('.//*[@class="review-content-header__dates"]', $review)->item(0)->textContent;
$fecha1 = explode(",", $fecha);
$fecha2 = substr($fecha1[0], 0, -16);
$fecha3 = substr($fecha2, -10, 10);
$original_date = "$fecha3";
// Creating timestamp from given date
$timestamp = strtotime($original_date);
// Creating new date format from that timestamp
$new_date = date("d F Y", $timestamp);
// if (++$i == 2) break;
if ($titulo != null && $estrellas == 5 && $critica != null) {
$reviews[$id] = array(
'nombre' => $nombre,
'estrellas' => $estrellas,
'titulo' => $titulo,
'critica' => $critica,
'imagen' => $img,
'fecha' => $new_date,
);
}
$i +=1;
}
}
$json_alt = json_encode($reviews);
$file = fopen("data.json", "w");
fwrite($file, $json_alt . PHP_EOL);
fclose($file);
curl_close($ch);
Si leen el código verán que hay una sección que está comentada en el código, en esa sección puedes traer la cantidad de opiniones y de estrellas desde trustpilot y las guarda en un archivo llamado puntuacion.json
Luego les toca a ustedes hacer el diseño similar a trustpilot (el html)
el cron job lo pueden configurar de esta manera:
Código:
php -q /home/user/public_html/trustpilot/cron.php
adjunto dejo la carpeta de las imagenes de las estrellas y no avatar.
PD: si descargaste el zip, simplemente copia el código php, y reemplázalo por el del archivo trustpilot.php que está dentro del zip. la contraseña es: foroshosting
Adjuntos
Última edición: