Usuario:Davidmartindel/How to Bot php
Breve tutorial de como programar bots en php
Principios básicos
- Todo lo que aquí se refiere estan averiguados y ensayados por user:Davidmartindel con la investigación de varios códigos fuentes como [[1]] o frameworks como [[2]] y de estos y algunos códigos más, se ha podido llegar a estas conclusiones. Si se ve alguna mejora, error o comentario no dudes en hacérselo llegar a David.
- Usaremos la librería Snoopy. http://snoopy.sourceforge.net/ . Simplemente es copiar Snoopy.class.php en la carpeta donde estemos programando.
- Se puede usar CURL, pero a mi opinión es matar moscas a cañonazos.
- El funcionamiento es acceder a los proyectos wikimedia y trabajar desde la pagina del api. http://es.wikipedia.org/w/api.php. Más información: http://www.mediawiki.org/wiki/API
- Minimo de versión de php es la 5
Login
Es lo primero que debemos de hacer y yo creo que es lo más complicado.
- Esta versión ha sido reformada hace poco tiempo por la nueva actualización del API: La introducción del token. http://www.mediawiki.org/wiki/API:Login
Empezaremos poniendo el código y explicándolo:
Siempre para conectarse a la API de wikipedia usando Snoppy habrá que inicializar el objeto Snoopy:
require_once('Snoopy.class.php');
$snoopy = new Snoopy;
Aqui realizamos el login. Se hace el envio de los parámetros con arrays por que el login solo admite que se envie por método POST, y es de esta forma con la que Snoopy lo envia por metodo POST.
$request_vars = array('action' => 'login', 'lgname' => 'NOMBRE_USUARIO_BOT',
'lgpassword' => 'CONTRASEÑA_USUARIO_BOT', 'format' => 'php');
if(!$snoopy->submit("https://es.wikipedia.org/w/api.php", $request_vars))
die("Snoopy error: {$snoopy->error}");
$snoopy->setcookies();
$array_ = unserialize($snoopy->results);
//Guardamos lo que nos devuelve la API en un array en $array_
$request_vars = array('action' => 'login', 'lgname' => 'NOMBRE_USUARIO_BOT',
'lgpassword' => 'CONTRASEÑA_USUARIO_BOT','lgtoken'=>$array_['login']['token'].'', 'format' => 'php');
if(!$snoopy->submit("https://es.wikipedia.org/w/api.php", $request_vars))
die("Snoopy error: {$snoopy->error}");
$snoopy->setcookies();
$array_ = unserialize($snoopy->results);
var_dump($array_);//nos dice todo lo que nos ha devuelto wikipedia
$snoopy->setcookies();
//es imprescindible para realizar las acciones con el usuario del bot.
Una vez realizado el login y guardado los datos de las cookies. Se puede empezar a realizar las tareas sobre los artículos de wikipedia como usuario registrado; con Snoopy enviaremos siempre la información de que usuarios somos sin tener que hacer nada.
Leer un artículo
No existe una función en concreto en la API [[3]] para realizar esta labor. Por ello que se busca en las revisiones cogiendo la actual versión y pidiendo el contenido.
El código y la explicación:
$request_vars = array('titles' => 'TITULO_ARTICULO','format' => 'php','rvprop' => 'content');
$snoopy->submit("https://es.wikipedia.org/w/api.php?action=query&prop=revisions",$request_vars);
$array_=unserialize($snoopy->results);
if(isset($array_["query"]["pages"][-1]["missing"])) //comprobamos que exisista el articulo
echo $array_["query"]["pages"][key($array_["query"]["pages"])]["revisions"][0]["*"];
Otra opción seria abrirlo directamente sin usar el array $request_vars. Por que "revision" no necesita que se haga la petición en POST así que se puede hacer con método GET
$snoopy->submit("https://es.wikipedia.org/w/api.php?action=query&prop=revisions&titles=TITULO_ARTICULO&format=php&rvprop=content",null);
$array_=unserialize($snoopy->results);
if(isset($array_["query"]["pages"][-1]["missing"])) //comprobamos que exisista el articulo
echo $array_["query"]["pages"][key($array_["query"]["pages"])]["revisions"][0]["*"];
Editar un artículo
La edición es obligatoria hacerla en dos pasos. El primero es para coger el token y el segundo es para realizar la edición en si. El basetimestamp no es obligatorio pero muy recomendable para que no se pisen las ediciones o de error por que alguien ha editado antes.
$request_vars = array('action' => 'query', 'prop' => 'info',
'intoken' => 'edit','titles' => 'TITULO_ARTICULO_A_EDITAR','format' => 'php');
if(!$snoopy->submit("https://es.wikipedia.org/w/api.php", $request_vars))
die("Snoopy error: {$snoopy->error}");
$array_ = unserialize($snoopy->results);
$vars['token'] =$array_["query"]["pages"][key($array_["query"]["pages"])]["edittoken"];
$vars['basetimestamp'] =$array_["query"]["pages"][key($array_["query"]["pages"])]["touched"];
$vars['format'] = 'php';
$vars['action']='edit';
$vars['minor']='1';
$vars['bot']='1';
$vars['title'] = utf8_encode ("TITULO_ARTICULO_A_EDITAR");
$vars['summary'] = utf8_encode ("RESUMEN_DE_EDICIÓN");
$vars['text'] = utf8_encode ("TEXTO_DEL_ARTÍCULO_ENTERO");
if(!$snoopy->submit("https://es.wikipedia.org/w/api.php",$vars))
die("Snoopy error: {$snoopy->error}");
$array_ = unserialize($snoopy->results);
if($array_["edit"]["result"]=="Success")
echo "EDICIÓN CORRECTA";
else{
echo "EDICION ERRONEA";
}
Importante sobre codificación
Lo normal es usar una codificación ANSI o ASCI en php. Pero resulta que wikipedia para dar soporte a todo tipo de idiomas usa una codificación UTF8 por lo que siempre que enviemos texto y recibamos tendremos o que cambiar la forma de mostrar o trabajar a UTF8 o sino lo que he introducido por ejemplo en la sección de editar: El usar las funciones utf8_encode para enviar datos a wikipedia, y usar utf8_decode para mostrar los datos que se recogen de wikipedia.
En un principio no se vera la diferencia por que muchas letras son iguales. Pero los acentos en concreto no son iguales y aparecerán símbolos extraños. Por ejemplo: ó , si sale esto es que habéis enviado un ó en formato ANSI a wikipedia, la solución es enviarlo en UTF8 asi en código php utf8_encode ('ó');.
Realmente esto es un poco erróneo el usar esta tecnología por que muchos de los caracteres en UTF8 no tienen correspondencia, como por ejemplo el alfabeto indio o algunos símbolos. Lo mejor siempre seria trabajar en php directamente en UTF8. Esto seria con alguna modificaciones por ejemplo codificando los archivos en este formato.
Sobre el resto de acciones
El resto de las acciones son sencillas, solo se debe de buscarlas en http://es.wikipedia.org/w/api.php y enviar los parámetros que nos pida de la forma que nos lo pide. La respuesta que nos devuelva siempre habrá que pasarla por la función "unserialize()" para que nos devuelva un array. Si queremos ver la estructura del array se puede usar la función en php "var_dump" o "var_export()"(este hace lo mismo pero en formato html para leerlo mejor).
Más a delante si se tiene dudas publico más código para los que lo necesiten.
Como se puede ejecutar
Se puede usar desde un navegador. Simplemente llamando la pagina php que hemos creado. Si se quiere que no solo realice una interacción, sino que siga indeterminadamente ejecutándose; lo mejor es usar que escriba en HTML la etiqueta "<META HTTP-EQUIV="refresh" CONTENT="1; url="EL_NOMBRE_DEl_ARCHIVO_PHP_QUE_CREAMOS">"
Ejemplo de un archivo llamado :ejemplo.php con el código siguiente:
<html>
ejemplo de una pagina que siempre se esta recargando y sumando valores <br><?php echo $_GET['numero']++;?>
<META HTTP-EQUIV="refresh" CONTENT="1; url="ejemplo.php?numero=<?php echo $_GET['numero'];?>">
</html>
El mejor sistema, más optimo y fiable sin tener que dejar un navegador abierto es ejecutarlo con PHP-CLI. En linux viene siempre implementado. Solo habría que ejecutar :
~@localhost$ php NOMBRE_ARCHIVO.php
Nos iría escribiendo a continuación lo que hayamos puesto con echo,printf, print...Para no permitir que se cierre una vez terminado una interacción se pueden usar varios sistemas el peor a mi juicio pero funcional es " while(1==1){CODIGO_QUE_SE_REPITE} ". Así nunca se cerraría el programa, a menos que haya errores.