Tonterías remotas con el PC sin abrir puertos

Alguna vez he querido hacer alguna cosa puntual en mi PC remotamente, sea desde el móvil o desde otro PC, pero en cualquier caso desde fuera de casa. Como no me gusta andar abriendo puertos en el router y en el firewall para una cosa que voy a dejar de usar en unos días suelo usar un método alternativo.

La última vez que necesité montar algo así fue para vacilar a cierta persona, y es el ejemplo que voy a explicar aquí.

La idea es la siguiente: un php online (vale cualquier hosting gratuito) y un script corriendo en el PC. A través de un formulario en el php decimos al ordenador qué queremos que haga, y el script recoge las órdenes.

Nada espectacular, pero es sencillo y funciona.

En este ejemplo en particular quería escribir una frase en el formulario web a través del móvil, y que la frase fuese pronunciada por un sintetizador de voz en el ordenador del salón a través de los altavoces (los cuales comparte con la PS3, que era la gracia para que el “invento” no resultase obvio).

La parte php sería algo como esto:

[sourcecode language=’php’]

class=”hiddenSpellError” type=”text” />type=”\”hidden\”” name=”\”spdfunc\”” value=”\”u\”” />”;
echo ”

class=”hiddenSpellError”>action=”txt.php?spdfunc=w” method=”post”>”;

echo “class=”hiddenSpellError” type=”text” />type=”text” name=”msg” value=”\”” size=”\”30\”” />”;
echo “class=”hiddenSpellError” type=”text” />type=”\”submit\”” name=”\”enviar\”” value=”\”Talk!\”” />”;}

echo “”;
}

if ( isset($_POST[‘enviar’]) )
{

$myFile = “t.spd”;
$fh = fopen($myFile, ‘w’) or die(“can’t open file”);
$stringData=$_POST[‘msg’];
fwrite($fh, $stringData);
fclose($fh);
}

?>
[/sourcecode]

Lo que hace el script es lo siguiente: si accedemos a la página php con el parámetro “?spdfunc=w” nos mostrará un formulario donde escribir el texto. Al enviarlo se guardará en un fichero de texto en el servidor, y no permitirá volver a mandar otro texto hasta que el PC lo haya leido accediendo a la web con el parámetro “?spdfunc=r”, momento en que escribirá un * en el fichero para indicar que ya está leído.

Se podría sanear la entrada del formulario para que no entren textos demasiado grandes, pero me sentía perezoso y sólo lo tuve online un par de días de todas formas.

La parte de script que se ejecutaría en el PC sería algo como esto:

[sourcecode language=’bash’]

#!/bin/bash
wget “http://www.nuestraweb.com/txt.php?spdfunc=r” -O ~/texto.txt
tcontent=$(cat ~/texto.txt)
if [ “$tcontent” != “*” ]
then
espeak -a 100 -p 0 -s 88 -g 10 -v mb-es1 -f ~/texto.txt
fi

[/sourcecode]

Debemos tener instalado “espeak” para que sintetize el texto como voz, y configurar el script para ser lanzado por ejemplo cada 5 o 10 segundos. Podemos hacerlo a través de cron o cualquier otro planificador de tareas.

El script hace un wget del php con el parámetro “?spdfunc=r” para leer el archivo que habíamos escrito previamente, si había alguno, y luego le pasa ese texto al espeak.

Se podría hacer mucho más limpio y más seguro, por ejemplo como decía antes saneando la entrada del php, pero la idea es básicamente esa.

Esto lo combiné con otro par de scripts similares que me creaban un registro online de las horas a las que se encendía y apagaba la PS3, con lo que sabía el momento justo en que la persona objetivo iba a estar delante de la tele e iba a oír lo que el sintetizador tuviese que decir.