<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Node.js_y_Telegram</id>
	<title>Node.js y Telegram - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Node.js_y_Telegram"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Node.js_y_Telegram&amp;action=history"/>
	<updated>2026-10-21T04:22:34Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Node.js_y_Telegram&amp;diff=69426&amp;oldid=prev</id>
		<title>Veiga: /* Node.js y Telegram */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Node.js_y_Telegram&amp;diff=69426&amp;oldid=prev"/>
		<updated>2021-02-11T17:22:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Node.js y Telegram&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Node.js y Telegram =&lt;br /&gt;
&lt;br /&gt;
En este tutorial, crearemos un &amp;#039;&amp;#039;&amp;#039;bot básico de Telegram&amp;#039;&amp;#039;&amp;#039; empleando &amp;#039;&amp;#039;&amp;#039;Node.js&amp;#039;&amp;#039;&amp;#039; y un framework llamado &amp;#039;&amp;#039;&amp;#039;Telegraf&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Telegram.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introducción a los Bots de Telegram ==&lt;br /&gt;
&lt;br /&gt;
* Los bots, que ahora están muy de moda, son una funcionalidad de Telegram que nos permite crear una aplicación en Telegram que interactúe con nuestro servidor a través de mensajes de texto que se envían al chat del Bot.&lt;br /&gt;
* Para buscar bots solamente hay que entrar en la app de Telegram y buscarlos en el cajón de búsqueda. A través de web se puede hacer tecleando &amp;#039;&amp;#039;&amp;#039;https://telegram.me/&amp;#039;&amp;#039;&amp;#039; y añadiendo después de la última barra el nombre del bot que queremos localizar.&lt;br /&gt;
* Una de las ventajas de los Bots de Telegram es que Telegram proporciona de forma pública y gratuita su API para interactuar con todos sus servicios. Salvo aplicaciones como WhatsApp o similares que son cerradas y no permiten la realización de ninguna de estas tareas.&lt;br /&gt;
* Además &amp;#039;&amp;#039;&amp;#039;recomiendo Telegram encarecidamente&amp;#039;&amp;#039;&amp;#039; por que va muy por delante en seguridad y servicios disponibles en comparación a WhatsApp o similares.&lt;br /&gt;
&lt;br /&gt;
== Documentación oficial del framework Telegraf de Node ==&lt;br /&gt;
&lt;br /&gt;
Podemos encontrar la &amp;#039;&amp;#039;&amp;#039;documentación oficial del framework Telegraf&amp;#039;&amp;#039;&amp;#039; para Node.js en:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;https://telegraf.js.org/#/&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Registro de Bot en BotFather ==&lt;br /&gt;
&lt;br /&gt;
* Lo primero que tenemos que hacer es &amp;#039;&amp;#039;&amp;#039;indicar a Telegram de que queremos crear un nuevo Bot&amp;#039;&amp;#039;&amp;#039;. Para ello tenemos que mandar un mensaje al &amp;#039;&amp;#039;&amp;#039;BotFather (@BotFather)&amp;#039;&amp;#039;&amp;#039;, en concreto al comando de «/newbot».&lt;br /&gt;
* Posteriormente BotFather nos preguntará por un &amp;#039;&amp;#039;&amp;#039;name&amp;#039;&amp;#039;&amp;#039; para el Bot (será el Título del Bot) y a continuación nos pregunta un &amp;#039;&amp;#039;&amp;#039;username&amp;#039;&amp;#039;&amp;#039;. Importante, el &amp;#039;&amp;#039;&amp;#039;username&amp;#039;&amp;#039;&amp;#039; tiene que &amp;#039;&amp;#039;&amp;#039;terminar en bot&amp;#039;&amp;#039;&amp;#039;. Ejemplo: mi_nuevobot, soytubot, etc...&lt;br /&gt;
* Si todo está correcto, nos confirmará la creación del Bot con un texto similar al mostrado más abajo, indicando el TOKEN que usaremos para hacer peticiones a la &amp;#039;&amp;#039;&amp;#039;API de Bots de Telegram&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039;https://core.telegram.org/bots/api&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Importantísimo: NO COMPARTIR NUNCA NUESTRO TOKEN por que es la referencia a nuestro Bot.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Done! Congratulations on your new bot. You will find it at t.me/veigarobot. &lt;br /&gt;
&lt;br /&gt;
You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you&amp;#039;ve finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.&lt;br /&gt;
&lt;br /&gt;
Use this token to access the HTTP API:&lt;br /&gt;
1041226772:AAERTGXt3_oPG1ceVYKnz1KlFKKFLV7ykd2g&lt;br /&gt;
&lt;br /&gt;
Keep your token secure and store it safely, it can be used by anyone to control your bot.&lt;br /&gt;
&lt;br /&gt;
For a description of the Bot API, see this page: https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Comandos disponibles en BotFather&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/newbot – Crea un nuevo bot, te pedirá el nombre y lo creará.&lt;br /&gt;
/token – Te da el Token HTTP para una API que quieras hacer, por ejemplo.&lt;br /&gt;
/revoke – Elimina el acceso mediante el Token a tu Bot.&lt;br /&gt;
/setname – Cambia el nombre de tu bot&lt;br /&gt;
/setdescription – Cambia la descripción de tu bot, muy útil para presentarlo y explicar lo que hace&lt;br /&gt;
/setabouttext – Modifica la información sobre tu bot.&lt;br /&gt;
/setuserpic – Cambia la imagen de perfil de tu bot.&lt;br /&gt;
/setinline – Permite modificar los permisos con respecto a los bots integrados, si los entiende o no.&lt;br /&gt;
/setinlinefeedback – Configura las respuestas a los mensajes con bot integrados.&lt;br /&gt;
/setcommands – Cambia los comandos con los que se podrá interactuar con tu bot&lt;br /&gt;
/setjoingroups – Habilita o deshabilita la opción de añadir tu bot a grupos&lt;br /&gt;
/setprivacy – Ajustes de privacidad, si el bot puede ver todos los mensajes o sólo los que lo mencionen&lt;br /&gt;
/deletebot – Eliminar un bot.&lt;br /&gt;
/cancel – Cancelar la operación vigente con el BotFather&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración inicial del servidor de Node.js ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1.-&amp;#039;&amp;#039;&amp;#039; Primeramente &amp;#039;&amp;#039;&amp;#039;crearemos una carpeta para nuestro bot&amp;#039;&amp;#039;&amp;#039; en el servidor.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2.-&amp;#039;&amp;#039;&amp;#039; Realizaremos la inicialización del proyecto con &amp;#039;&amp;#039;&amp;#039;npm init&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm init&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3.-&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Instalamos&amp;#039;&amp;#039;&amp;#039; los siguientes &amp;#039;&amp;#039;&amp;#039;módulos necesarios&amp;#039;&amp;#039;&amp;#039; para programar el &amp;#039;&amp;#039;&amp;#039;bot&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm install --save telegraf dotenv fs http https express&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;4.-&amp;#039;&amp;#039;&amp;#039; Creamos un &amp;#039;&amp;#039;&amp;#039;fichero de configuración&amp;#039;&amp;#039;&amp;#039; del entorno con el nombre &amp;#039;&amp;#039;&amp;#039;.env&amp;#039;&amp;#039;&amp;#039;. Ejemplo de contenido de un fichero: &amp;#039;&amp;#039;&amp;#039;.env&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# .env&lt;br /&gt;
# Bot Telegram: veigarobot&lt;br /&gt;
&lt;br /&gt;
PUERTO = 8080&lt;br /&gt;
BOT_NOMBRE = veigarobot&lt;br /&gt;
BOT_TOKEN = 1041226772:AAERTGXt3_oPG1ceVYKnz1KlFKKFLV7ykd2g&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Creación de certificado SSL para el servidor de Node.js usando LetsEncrypt (solamente cuando no tengamos certificado SSL) ===&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Logo_lets_encrypt.jpg]]&lt;br /&gt;
&lt;br /&gt;
# Para que Telegram pueda enviar las solicitudes que le lleguen al Bot, a nuestro servidor de Node.js, nuestro servidor deberá tener instalado un &amp;#039;&amp;#039;&amp;#039;certificado SSL&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Para ello podemos &amp;#039;&amp;#039;&amp;#039;crearlo de forma gratuita&amp;#039;&amp;#039;&amp;#039; utilizando el servicio &amp;#039;&amp;#039;&amp;#039;Let&amp;#039;sEncrypt&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039;https://letsencrypt.org/es/&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Tendremos que realizar lo siguiente:&lt;br /&gt;
# Tutorial seguido: &amp;#039;&amp;#039;&amp;#039;https://itnext.io/node-express-letsencrypt-generate-a-free-ssl-certificate-and-run-an-https-server-in-5-minutes-a730fbe528ca&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Requerimientos previos:&lt;br /&gt;
&lt;br /&gt;
* Servidor accesible por SSH.&lt;br /&gt;
* NodeJS&lt;br /&gt;
* Express&lt;br /&gt;
* CertBot&lt;br /&gt;
&lt;br /&gt;
* Primero instalaremos &amp;#039;&amp;#039;&amp;#039;CertBot en Debian 10&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo su&lt;br /&gt;
&lt;br /&gt;
# Editamos el fichero /etc/apt/sources.list:&lt;br /&gt;
nano /etc/apt/sources.list&lt;br /&gt;
&lt;br /&gt;
# Añadimos este contenido:&lt;br /&gt;
deb http://deb.debian.org/debian buster-backports main&lt;br /&gt;
deb-src http://deb.debian.org/debian buster-backports main&lt;br /&gt;
&lt;br /&gt;
# Actualizamos las sources.list&lt;br /&gt;
apt update&lt;br /&gt;
&lt;br /&gt;
# Instalamos los siguientes paquetes:&lt;br /&gt;
apt-get install certbot&lt;br /&gt;
&lt;br /&gt;
# Generamos un certificado SSL manualmente:&lt;br /&gt;
certbot certonly --manual&lt;br /&gt;
&lt;br /&gt;
# Introduciremos el nombre de nuestro dominio sin http://&lt;br /&gt;
# Seguiremos las instrucciones indicadas...&lt;br /&gt;
# En mi caso para confirmar el dominio tuve que crear las siguientes carpetas, dentro de la carpeta de mi bot de telegram:&lt;br /&gt;
mkdir -p .well-known/acme-challenge&lt;br /&gt;
&lt;br /&gt;
# Crear el siguiente archivo XdVyxWPEcX_A8HLC3aOJrhY7x8T3o1w0vPyYHG1EVYw dentro de la carpeta acme-challenge:&lt;br /&gt;
&lt;br /&gt;
# Con el contenido que me indicaba.&lt;br /&gt;
XdVyxWPEcX_A8HLC3aOJrhY7x8T3o1w0vPyYHG1EVYw.xZzVoAmDSo0mh7XFWJo1tPScYVRdthQSRcRDjffG6B8&lt;br /&gt;
&lt;br /&gt;
# Y a continuación pulsar en Y (y en ese momento letsencrypt se conecta a mi dominio y se crearán los certificados en:&lt;br /&gt;
&lt;br /&gt;
# Cadena completa del certificado en:&lt;br /&gt;
/etc/letsencrypt/live/veiga.dynu.net-0001/fullchain.pem&lt;br /&gt;
&lt;br /&gt;
# Clave privada en:&lt;br /&gt;
/etc/letsencrypt/live/veiga.dynu.net-0001/privkey.pem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Secuencia original completa de creación en la terminal:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/var/www/veiga.dynu.net/public/nodejs/bottelegram# certbot certonly --manual&lt;br /&gt;
&lt;br /&gt;
Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;br /&gt;
Plugins selected: Authenticator manual, Installer None&lt;br /&gt;
Please enter in your domain name(s) (comma and/or space separated)  (Enter &amp;#039;c&amp;#039;&lt;br /&gt;
to cancel): veiga.dynu.net&lt;br /&gt;
Obtaining a new certificate&lt;br /&gt;
Performing the following challenges:&lt;br /&gt;
http-01 challenge for veiga.dynu.net&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
NOTE: The IP of this machine will be publicly logged as having requested this&lt;br /&gt;
certificate. If you&amp;#039;re running certbot in manual mode on a machine that is not&lt;br /&gt;
your server, please ensure you&amp;#039;re okay with that.&lt;br /&gt;
&lt;br /&gt;
Are you OK with your IP being logged?&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
(Y)es/(N)o: Y&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Create a file containing just this data:&lt;br /&gt;
&lt;br /&gt;
XdVyxWPEcX_A8HLC3aOJrhY7x8T3o1w0vPyYHG1EVYw.xZzVoAmDSo0mh7XFWJo1tPScYVRdthQSRcRDjffG6B8&lt;br /&gt;
&lt;br /&gt;
And make it available on your web server at this URL:&lt;br /&gt;
&lt;br /&gt;
http://veiga.dynu.net/.well-known/acme-challenge/XdVyxWPEcX_A8HLC3aOJrhY7x8T3o1w0vPyYHG1EVYw&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;br /&gt;
Press Enter to Continue&lt;br /&gt;
Waiting for verification...&lt;br /&gt;
Cleaning up challenges&lt;br /&gt;
&lt;br /&gt;
IMPORTANT NOTES:&lt;br /&gt;
 - Congratulations! Your certificate and chain have been saved at:&lt;br /&gt;
   /etc/letsencrypt/live/veiga.dynu.net-0001/fullchain.pem&lt;br /&gt;
   Your key file has been saved at:&lt;br /&gt;
   /etc/letsencrypt/live/veiga.dynu.net-0001/privkey.pem&lt;br /&gt;
   Your cert will expire on 2020-04-13. To obtain a new or tweaked&lt;br /&gt;
   version of this certificate in the future, simply run certbot&lt;br /&gt;
   again. To non-interactively renew *all* of your certificates, run&lt;br /&gt;
   &amp;quot;certbot renew&amp;quot;&lt;br /&gt;
 - If you like Certbot, please consider supporting our work by:&lt;br /&gt;
&lt;br /&gt;
   Donating to ISRG / Let&amp;#039;s Encrypt:   https://letsencrypt.org/donate&lt;br /&gt;
   Donating to EFF:                    https://eff.org/donate-le&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuración del certificado SSL para el servidor de Node.js (cuando ya dispongamos de un certificado SSL) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Si ya tenemos un certificado SSL&amp;#039;&amp;#039;&amp;#039; por que lo hemos creado en el paso anterior, o bien por que ya teníamos alguno de nuestro servidor de Nginx, podemos aprovecharlo para este servidor también.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;La carpeta dónde buscar los certificados de CertBot&amp;#039;&amp;#039;&amp;#039; sería en:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Directorio de todos los certificados de LetsEncrypt&lt;br /&gt;
/etc/letsencrypt/live&lt;br /&gt;
&lt;br /&gt;
# Ahí dentro tendremos carpetas para cada dominio.&lt;br /&gt;
&lt;br /&gt;
# Fichero del certificado, por ejemplo en: &lt;br /&gt;
/etc/letsencrypt/live/veiga.dynu.net-0001/cert.pem&lt;br /&gt;
&lt;br /&gt;
# Fichero de la clave privada del certificado, por ejemplo en:&lt;br /&gt;
/etc/letsencrypt/live/veiga.dynu.net-0001/privkey.pem&lt;br /&gt;
&lt;br /&gt;
# Fichero de certification authority:&lt;br /&gt;
/etc/letsencrypt/live/veiga.dynu.net-0001/chain.pem&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ejemplo de aplicación de Node.js que hace uso de los certificados SSL&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// index.js de ejemplo de servidor con certificado SSL incluído.&lt;br /&gt;
&lt;br /&gt;
// Módulos necesarios&lt;br /&gt;
const fs = require(&amp;#039;fs&amp;#039;);&lt;br /&gt;
const http = require(&amp;#039;http&amp;#039;);&lt;br /&gt;
const https = require(&amp;#039;https&amp;#039;);&lt;br /&gt;
const express = require(&amp;#039;express&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const app = express();&lt;br /&gt;
&lt;br /&gt;
// Configuración de los certificados&lt;br /&gt;
const privateKey = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/privkey.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
const certificate = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/cert.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
const ca = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/chain.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const credentials = {&lt;br /&gt;
    key: privateKey,&lt;br /&gt;
    cert: certificate,&lt;br /&gt;
    ca: ca&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
app.use((req, res) =&amp;gt; {&lt;br /&gt;
    res.send(&amp;#039;Servidor web funcionando tanto en http y https !&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Arrancamos tanto el servidor http como https:&lt;br /&gt;
const httpServer = http.createServer(app);&lt;br /&gt;
const httpsServer = https.createServer(credentials, app);&lt;br /&gt;
&lt;br /&gt;
httpServer.listen(80, () =&amp;gt; {&lt;br /&gt;
    console.log(&amp;#039;Servidor http funcionando en puerto 80&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
httpsServer.listen(443, () =&amp;gt; {&lt;br /&gt;
    console.log(&amp;#039;Servidor https funcionando en puerto 443&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Podemos probar el servidor desde la línea de comandos.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ATENCION: hacerlo como root, ya que necesita tener permisos para poder acceder a las carpetas de los certificados.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Atención, antes de arrancar nuestro servidor de Node en el puerto 80 y 443, tendremos que parar el servidor de Nginx o cualquier otro servidor que esté funcionando en esos puertos:&lt;br /&gt;
sudo su&lt;br /&gt;
&lt;br /&gt;
# Paramos nuestro servidor de Nginx que tenemos funcionando en el VPS de Google.&lt;br /&gt;
service nginx stop&lt;br /&gt;
&lt;br /&gt;
# Arrancamos el servidor de Node.js&lt;br /&gt;
node index.js&lt;br /&gt;
&lt;br /&gt;
Servidor http funcionando en puerto 80&lt;br /&gt;
Servidor https funcionando en puerto 443&lt;br /&gt;
&lt;br /&gt;
# Nos conectaremos con un navegador cliente a la dirección de nuestro dominio por http y https y comprobamos que funciona correctamente:&lt;br /&gt;
http://veiga.dynu.net/&lt;br /&gt;
https://veiga.dynu.net/&lt;br /&gt;
&lt;br /&gt;
# Resultado:&lt;br /&gt;
Servidor web funcionando tanto en http y https !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuración del Webhook de Telegram ==&lt;br /&gt;
&lt;br /&gt;
* En un bot de Telegram cuando mandamos un comando, el proceso que se ejecuta es el siguiente:&lt;br /&gt;
&lt;br /&gt;
# El comando se envía desde nuestro teléfono o aplicación cliente de Telegram, a la red de Telegram.&lt;br /&gt;
# Telegram reenvía ese comando al servidor dónde tenemos programado el Bot. En nuestro caso será el servidor en Google (para ello necesita saber la &amp;#039;&amp;#039;&amp;#039;URL HTTPS&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Webhook&amp;#039;&amp;#039;&amp;#039;) del servidor que gestionará dicha petición de Telegram.&lt;br /&gt;
# Nuestro servidor de Google responderá a dicha petición enviando una respuesta procesada, a la red de Telegram.&lt;br /&gt;
# Telegram enviará finalmente al teléfono o app del cliente la respuesta recibida desde el Bot.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Fichero de variables de entorno .env completo&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# .env&lt;br /&gt;
# Bot Telegram: veigarobot&lt;br /&gt;
&lt;br /&gt;
BOT_NOMBRE = veigarobot&lt;br /&gt;
BOT_TOKEN = 1041226772:AAERTGXt3_oPG1ceVYKnz1KlFKKFLV7ykd2g&lt;br /&gt;
WEBHOOK_URL = https://veiga.dynu.net&lt;br /&gt;
WEBHOOK_CARPETA_SECRETA = /botty&lt;br /&gt;
PUERTO = 8443&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ejemplo de &amp;#039;&amp;#039;&amp;#039;configuración del Webhook&amp;#039;&amp;#039;&amp;#039; de nuestro &amp;#039;&amp;#039;&amp;#039;bot&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// index.js&lt;br /&gt;
&lt;br /&gt;
// Cargamos el módulo que nos permite leer variables adicionales de entorno:&lt;br /&gt;
const dotenv = require(&amp;#039;dotenv&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const fs = require(&amp;#039;fs&amp;#039;);&lt;br /&gt;
const Telegraf = require(&amp;#039;telegraf&amp;#039;);&lt;br /&gt;
const express = require(&amp;#039;express&amp;#039;);&lt;br /&gt;
const expressApp = express();&lt;br /&gt;
&lt;br /&gt;
// Leemos el fichero &amp;quot;.env&amp;quot; que contiene las variables de configuración y se añadirá a la lista de variables que tenemos en process.env&lt;br /&gt;
dotenv.config();&lt;br /&gt;
&lt;br /&gt;
// Ejemplo de muestra de la variable de entorno BOT_TOKEN&lt;br /&gt;
// console.log(process.env.BOT_TOKEN);&lt;br /&gt;
&lt;br /&gt;
// Constante que referencia a nuestro Bot.&lt;br /&gt;
const bot = new Telegraf(process.env.BOT_TOKEN)&lt;br /&gt;
&lt;br /&gt;
// Configuración de los certificados&lt;br /&gt;
const privateKey = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/privkey.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
const certificate = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/cert.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
const ca = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/chain.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const credenciales = {&lt;br /&gt;
    key: privateKey,&lt;br /&gt;
    cert: certificate,&lt;br /&gt;
    ca: ca&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Ajuste del webhook&lt;br /&gt;
// El webhook en Telegram solamente se puede configurar para los siguientes puertos: 80, 88, 443 or 8443&lt;br /&gt;
// Como queremos seguir teniendo nuestro servidor Nginx funcionando (para http 80 y https 443), vamos a trabajar en este caso con el puerto 8443 por https.&lt;br /&gt;
&lt;br /&gt;
// Acordarse de abrir en el firewall de Google el puerto TCP 8443 a nuestro servidor.&lt;br /&gt;
&lt;br /&gt;
// Configuraremos en nuestro fichero .env una variable de entorno para la URL del Webhook&lt;br /&gt;
// Configuraremos en nuestro fichero .env una variable para el puerto de escucha del servidor Node.js&lt;br /&gt;
// Y además configuraremos una ruta con el nombre que queramos que será dónde se recibirán las peticiones que lleguen desde la Red de Telegram a nuestro servidor.&lt;br /&gt;
&lt;br /&gt;
// WEBHOOK_URL = https://veiga.dynu.net&lt;br /&gt;
// PUERTO = 8443&lt;br /&gt;
// WEBHOOK_CARPETA_SECRETA = /botty&lt;br /&gt;
&lt;br /&gt;
// Ajustamos el webhook de nuestro bot&lt;br /&gt;
expressApp.use(bot.webhookCallback(process.env.WEBHOOK_CARPETA_SECRETA));&lt;br /&gt;
bot.telegram.setWebhook(process.env.WEBHOOK_URL+&amp;#039;:&amp;#039;+process.env.PUERTO+process.env.WEBHOOK_CARPETA_SECRETA);&lt;br /&gt;
&lt;br /&gt;
expressApp.get(&amp;#039;/&amp;#039;, (req, res) =&amp;gt; {&lt;br /&gt;
  res.send(&amp;#039;Hola que tal ?&amp;#039;)&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
expressApp.listen(process.env.PUERTO, () =&amp;gt; {&lt;br /&gt;
  console.log(`Escuchando en el puerto ${process.env.PUERTO} !`);&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más conceptos sobre el framework Telegraf ==&lt;br /&gt;
&lt;br /&gt;
=== Introducción ===&lt;br /&gt;
* En el framework de Node.js &amp;#039;&amp;#039;&amp;#039;Telegraf&amp;#039;&amp;#039;&amp;#039; que vamos a utilizar, un &amp;#039;&amp;#039;&amp;#039;bot es un objeto que contiene un array de middlewares&amp;#039;&amp;#039;&amp;#039; que se ejecutan en cada petición.&lt;br /&gt;
* Un &amp;#039;&amp;#039;&amp;#039;Middleware&amp;#039;&amp;#039;&amp;#039; es una parte esencial de cualquier framework moderno. Te permitirá modificar las peticiones y respuestas que se producen entre Telegram y tu bot. &lt;br /&gt;
* Podemos pensar en un middleware como una cadena lógica de conexión entre el bot y la petición de Telegram.&lt;br /&gt;
* Un Middleware normalmente acepta &amp;#039;&amp;#039;&amp;#039;2 parámetros (ctx,next)&amp;#039;&amp;#039;&amp;#039;. &amp;#039;&amp;#039;&amp;#039;CTX&amp;#039;&amp;#039;&amp;#039; es el contexto de la actualización de Telegram, &amp;#039;&amp;#039;&amp;#039;NEXT&amp;#039;&amp;#039;&amp;#039; es una función que se ejecutará para pasar al siguiente middleware.&lt;br /&gt;
* Retornará una &amp;#039;&amp;#039;&amp;#039;Promise&amp;#039;&amp;#039;&amp;#039; con una función &amp;#039;&amp;#039;&amp;#039;then&amp;#039;&amp;#039;&amp;#039; que se ejecutará cuando se termine la ejecución de la petición.&lt;br /&gt;
* Lista de &amp;#039;&amp;#039;&amp;#039;Middlewares&amp;#039;&amp;#039;&amp;#039; disponibles para el &amp;#039;&amp;#039;&amp;#039;framework Telegraf&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039;https://telegraf.js.org/#/?id=known-middleware&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Gestión de errores en Telegraf === &lt;br /&gt;
&lt;br /&gt;
* Por defecto Telegraf imprimirá todos los errores a stderr.&lt;br /&gt;
&lt;br /&gt;
=== Contexto ===&lt;br /&gt;
&lt;br /&gt;
* Un contexto de Telegraf encapsula una actualización de Telegram. &lt;br /&gt;
* Un contexto se crea en cada petición y contiene las siguientes propiedades:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;https://telegraf.js.org/#/?id=context&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Tipos de actualizaciones soportadas por Telegraf ===&lt;br /&gt;
&lt;br /&gt;
* Cuando se produce un evento en Telegram los tipos y sub-tipos de actualizaciones disponibles, que podemos gestionar con el evento &amp;#039;&amp;#039;&amp;#039;.on&amp;#039;&amp;#039;&amp;#039; son:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;https://telegraf.js.org/#/?id=update-types&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Ejemplo de Bot programado con Telegraf y Node.js ==&lt;br /&gt;
&lt;br /&gt;
* Vamos a programar el bot para que haga lo siguiente:&lt;br /&gt;
** Cuando &amp;#039;&amp;#039;&amp;#039;entremos nos salude con un mensaje&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
** Cuando &amp;#039;&amp;#039;&amp;#039;le enviemos un texto nos responda con otro texto&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
** Cuando &amp;#039;&amp;#039;&amp;#039;le enviemos nuestra localización nos devuelva las coordenadas&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
** Cuando &amp;#039;&amp;#039;&amp;#039;le enviemos un sticker nos devuelva un icono&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
** Cuando &amp;#039;&amp;#039;&amp;#039;le enviemos un comando /fecha nos devuelva la fecha y hora&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
** Y alguna cosilla más (ver el código).&lt;br /&gt;
&lt;br /&gt;
* Véase la &amp;#039;&amp;#039;&amp;#039;explicación en la parte de código fuente&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;//// Interactuando con nuestro Bot de Telegram ////&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Si con nodemon nos genera algún error no detectado,.se recomienda parar con CTRL+C y ejecutar manualmente con node index.js.&lt;br /&gt;
&lt;br /&gt;
Código del fichero &amp;#039;&amp;#039;&amp;#039;.env&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#.env&lt;br /&gt;
# Bot Telegram. Datos de configuración:&lt;br /&gt;
# Nombre del bot: veigarobot&lt;br /&gt;
&lt;br /&gt;
BOT_NOMBRE = veigarobot&lt;br /&gt;
BOT_TOKEN = 1087578423234:AAwer23049afiasdf_lasiwer234sadf21KlFKg&lt;br /&gt;
WEBHOOK_URL = https://veiga.dynu.net&lt;br /&gt;
WEBHOOK_CARPETA_SECRETA = /newbotxxx&lt;br /&gt;
&lt;br /&gt;
# Puertos validos de conexion desde Telegram a servidores: 80, 88, 443 y 8443&lt;br /&gt;
PUERTO = 8443&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Crear la carpeta &amp;#039;&amp;#039;&amp;#039;/descargas&amp;#039;&amp;#039;&amp;#039; dentro del bot de Node:&lt;br /&gt;
* Inicialización de package.json e instalación de todos los módulos necesarios:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm init&lt;br /&gt;
&lt;br /&gt;
npm install --save fs https express dotenv telegraf request unique-filename&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Código del fichero &amp;#039;&amp;#039;&amp;#039;index.js&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// index.js&lt;br /&gt;
// Cargamos módulos&lt;br /&gt;
const fs = require(&amp;#039;fs&amp;#039;);&lt;br /&gt;
const https = require (&amp;#039;https&amp;#039;);&lt;br /&gt;
const express = require (&amp;#039;express&amp;#039;);&lt;br /&gt;
const dotenv = require (&amp;#039;dotenv&amp;#039;);&lt;br /&gt;
const Telegraf = require (&amp;#039;telegraf&amp;#039;);&lt;br /&gt;
const Extra = require(&amp;#039;telegraf/extra&amp;#039;)&lt;br /&gt;
const Markup = require(&amp;#039;telegraf/markup&amp;#039;)&lt;br /&gt;
const request = require(&amp;#039;request&amp;#039;)&lt;br /&gt;
const uniqueFilename = require (&amp;#039;unique-filename&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const app= express();&lt;br /&gt;
&lt;br /&gt;
// Configuramos los certificados SSL para HTTPS&lt;br /&gt;
const privateKey = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/privkey.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
const certificate = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/cert.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
const ca = fs.readFileSync(&amp;#039;/etc/letsencrypt/live/veiga.dynu.net/chain.pem&amp;#039;, &amp;#039;utf8&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const credentials = {&lt;br /&gt;
    key: privateKey,&lt;br /&gt;
    cert: certificate,&lt;br /&gt;
    ca: ca&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Leemos el fichero de entorno .env&lt;br /&gt;
dotenv.config();&lt;br /&gt;
&lt;br /&gt;
// Creamos objeto Telegraf&lt;br /&gt;
const bot = new Telegraf(process.env.BOT_TOKEN);&lt;br /&gt;
&lt;br /&gt;
// Ajustamos el Webhook (necesario hacer solamente 1 vez o cuando cambie la URL/puerto de nuestro servidor)&lt;br /&gt;
// Esta línea la ejecutamos 1 vez y la comentamos:&lt;br /&gt;
// bot.telegram.setWebhook(process.env.WEBHOOK_URL+&amp;#039;:&amp;#039;+process.env.PUERTO+process.env.WEBHOOK_CARPETA_SECRETA);&lt;br /&gt;
&lt;br /&gt;
// Ajustamos la ruta en Express, que gestionará las peticiones que recibimos desde Telegram en el bot.&lt;br /&gt;
app.use (bot.webhookCallback(process.env.WEBHOOK_CARPETA_SECRETA));&lt;br /&gt;
&lt;br /&gt;
// Arrancamos el servidor https en el puerto 8443&lt;br /&gt;
const httpsServer = https.createServer(credentials,app);&lt;br /&gt;
var server= httpsServer.listen(process.env.PUERTO, () =&amp;gt; {&lt;br /&gt;
    console.log(&amp;#039;Servidor https funcionando en puerto 8443&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Prueba de servicio web, comentar despues...&lt;br /&gt;
// Nos conectamos a https://veiga.dynu.net:8443 para ver si funciona todo OK.&lt;br /&gt;
// app.get(&amp;#039;/&amp;#039;,(req,res)=&amp;gt;{&lt;br /&gt;
//     res.send(&amp;#039;Hola que tal&amp;#039;);&lt;br /&gt;
// });&lt;br /&gt;
&lt;br /&gt;
// Función que nos permitirá descargar un fichero desde una URL determinada.&lt;br /&gt;
var descargarFichero =function(url,nombrefichero,callback)&lt;br /&gt;
{&lt;br /&gt;
    request.head(url, function(err,res,body)&lt;br /&gt;
    {&lt;br /&gt;
        // Consulta de headers.. Ejemplo:&lt;br /&gt;
        //console.log(&amp;#039;content-type:&amp;#039;,res.headers[&amp;#039;content-type&amp;#039;]);&lt;br /&gt;
        //console.log(&amp;#039;content-length:&amp;#039;,res.headers[&amp;#039;content-length&amp;#039;]);&lt;br /&gt;
        request(url).pipe(fs.createWriteStream(nombrefichero)).on(&amp;#039;close&amp;#039;,callback);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////&lt;br /&gt;
//// Interactuando con nuestro Bot de Telegram ////&lt;br /&gt;
///////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
// Mensaje de bienvenida.&lt;br /&gt;
bot.start((ctx)=&amp;gt;{&lt;br /&gt;
    //console.log(ctx);&lt;br /&gt;
    ctx.reply(&amp;#039;Bienvenido/a a mi Bot. Si quieres volver a ver este mensaje, pulsa en /start&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Si escribo hola en el chat, que responda con Hola que tal?&lt;br /&gt;
//bot.hears(&amp;#039;Hola&amp;#039;,(ctx)=&amp;gt;ctx.reply(`Hola ${ctx.from.first_name}, ¿qué tal estás?`));&lt;br /&gt;
&lt;br /&gt;
// Versión mejorada....&lt;br /&gt;
bot.hears(&amp;#039;Hola&amp;#039;,(ctx)=&amp;gt;ctx.replyWithHTML(`Hola &amp;lt;b&amp;gt;${ctx.from.first_name}&amp;lt;/b&amp;gt;, ¿qué tal estás?. Tu ID en Telegram es: &amp;lt;b&amp;gt;${ctx.message.from.id}&amp;lt;/b&amp;gt;\n\nTu username es: &amp;lt;b&amp;gt;${ctx.message.from.username}&amp;lt;/b&amp;gt;`));&lt;br /&gt;
&lt;br /&gt;
// Cuando alguien escribe &amp;quot;calor&amp;quot;... le decimos algo&lt;br /&gt;
bot.hears(/calor/i,(ctx)=&amp;gt;ctx.reply(&amp;#039;Pues si, parece que hacer calor por aqui....&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
// Al poner el comando /help... que nos mande un texto.&lt;br /&gt;
bot.help((ctx)=&amp;gt;ctx.reply(&amp;#039;Aquí se muestra la ayuda del bot... Puedes por ejemplo mandar un sticker y te mando un simbolito...&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
// Programamos el evento de cuando recibimos un sticker nos devuelva la mano de OK&lt;br /&gt;
bot.on(&amp;#039;sticker&amp;#039;,(ctx)=&amp;gt;ctx.reply(&amp;#039;👍&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
// CUando recibimos unas coordenadas de localización...&lt;br /&gt;
bot.on(&amp;#039;location&amp;#039;,(ctx)=&amp;gt;{&lt;br /&gt;
    ctx.replyWithHTML(&amp;quot;Hemos recibido tus coordenadas en el Bot:&amp;quot;).then(()=&amp;gt;ctx.replyWithHTML(`&amp;lt;b&amp;gt;Latitud&amp;lt;/b&amp;gt;: ${ctx.message.location.latitude}\n&amp;lt;b&amp;gt;Longitud&amp;lt;/b&amp;gt;: ${ctx.message.location.longitude}`));&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Programamos un comando específico /fecha&lt;br /&gt;
bot.command(&amp;#039;fecha&amp;#039;, (ctx) =&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  let fecha = new Date();&lt;br /&gt;
  let dia = (&amp;quot;0&amp;quot; + fecha.getDate()).slice(-2);&lt;br /&gt;
  let mes = (&amp;quot;0&amp;quot; + (fecha.getMonth() + 1)).slice(-2);&lt;br /&gt;
  let anio = fecha.getFullYear();&lt;br /&gt;
  let horas = fecha.getHours();&lt;br /&gt;
  let minutos = fecha.getMinutes();&lt;br /&gt;
  let segundos = fecha.getSeconds();&lt;br /&gt;
&lt;br /&gt;
  ctx.replyWithHTML(&amp;quot;Fecha y hora en el sistema:&amp;lt;b&amp;gt; &amp;quot;+dia + &amp;quot;/&amp;quot; + mes + &amp;quot;/&amp;quot; + anio+&amp;quot; &amp;quot;+horas+ &amp;quot;:&amp;quot; +minutos+ &amp;quot;:&amp;quot; +segundos+&amp;quot;&amp;lt;/b&amp;gt;&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Si recibimos una fotografía la almacena en la carpeta descargas de mi bot.&lt;br /&gt;
bot.on(&amp;#039;photo&amp;#039;,(ctx)=&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    // Mostramos en consola para averiguar los datos de la foto que recibimos.&lt;br /&gt;
    //console.log(ctx.message);&lt;br /&gt;
    /*&lt;br /&gt;
  photo: [&lt;br /&gt;
    {&lt;br /&gt;
      file_id: &amp;#039;AgADBAADG7QxG_-SQFFH64BLw3Mki40othsABAEAAwIAA20AA6ENAgABFgQ&amp;#039;,&lt;br /&gt;
      file_unique_id: &amp;#039;AQADjSi2GwAEoQ0CAAE&amp;#039;,&lt;br /&gt;
      file_size: 14561,&lt;br /&gt;
      width: 240,&lt;br /&gt;
      height: 320&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      file_id: &amp;#039;AgADBAADG7QxG_-SQFFH64BLw3Mki40othsABAEAAwIAA3gAA6INAgABFgQ&amp;#039;,&lt;br /&gt;
      file_unique_id: &amp;#039;AQADjSi2GwAEog0CAAE&amp;#039;,&lt;br /&gt;
      file_size: 54461,&lt;br /&gt;
      width: 600,&lt;br /&gt;
      height: 800&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      file_id: &amp;#039;AgADBAADG7QxG_-SQFFH64BLw3Mki40othsABAEAAwIAA3kAA58NAgABFgQ&amp;#039;,&lt;br /&gt;
      file_unique_id: &amp;#039;AQADjSi2GwAEnw0CAAE&amp;#039;,&lt;br /&gt;
      file_size: 132642,&lt;br /&gt;
      width: 960,&lt;br /&gt;
      height: 1280&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
    */&lt;br /&gt;
    // Necesitamos averiguar la carpeta dónde se almacenó en Telegram la foto enviada por el cliente. Cogemos la de mayor calidad, la última del array photo.&lt;br /&gt;
    let urlInfoFichero = `https://api.telegram.org/bot${process.env.BOT_TOKEN}/getFile?file_id=${ctx.message.photo[ctx.message.photo.length-1].file_id}`;&lt;br /&gt;
&lt;br /&gt;
    // Nos conectamos a Telegram para averiguar la carpeta dónde se almacenó la foto.&lt;br /&gt;
    request(urlInfoFichero,function(err,response,body)&lt;br /&gt;
    {&lt;br /&gt;
        body= JSON.parse(body);&lt;br /&gt;
&lt;br /&gt;
        let urlDescargaFichero = `https://api.telegram.org/file/bot${process.env.BOT_TOKEN}/${body.result.file_path}`;&lt;br /&gt;
&lt;br /&gt;
        // Generamos un nombre único para ese fichero, para poder guardar en /descargas&lt;br /&gt;
        let nombreFinalFichero = uniqueFilename(&amp;#039;./descargas/&amp;#039;)+&amp;#039;.&amp;#039;+body.result.file_path.split(&amp;#039;.&amp;#039;).pop();&lt;br /&gt;
&lt;br /&gt;
        descargarFichero(urlDescargaFichero,nombreFinalFichero, function()&lt;br /&gt;
        {&lt;br /&gt;
            ctx.replyWithHTML(&amp;#039;Imagen recibida correctamente en el servidor. Le mandamos una copia&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
            // Esta foto ya está en TElegram, con lo que si ponemos el file_id es suficiente.&lt;br /&gt;
            ctx.replyWithPhoto(body.result.file_id);&lt;br /&gt;
&lt;br /&gt;
            // Si queremos enviar una foto sacada de Internet....&lt;br /&gt;
            // ctx.replyWithPhoto(&amp;#039;http://www.discovery-8.com/wp-content/uploads/2017/07/parapente-algodonales.jpeg&amp;#039;);&lt;br /&gt;
        })&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Ejemplo de teclado con un botón que apunta a una URL y un botón que borra la copia del mensaje.&lt;br /&gt;
const teclado = Markup.inlineKeyboard([&lt;br /&gt;
  Markup.urlButton(&amp;#039;❤️&amp;#039;, &amp;#039;https://www.iessanclemente.net&amp;#039;),&lt;br /&gt;
  Markup.callbackButton(&amp;#039;Borrar&amp;#039;, &amp;#039;accionborrar&amp;#039;)&lt;br /&gt;
])&lt;br /&gt;
&lt;br /&gt;
//Programación de accionborrar. Borra el mensaje y el teclado asociado.&lt;br /&gt;
bot.action(&amp;#039;accionborrar&amp;#039;, ({ deleteMessage }) =&amp;gt; deleteMessage());&lt;br /&gt;
&lt;br /&gt;
// Cuando reciba un mensaje que no está programado anteriormente entonces, responde con un teclado de ejemplo, que muestra un enlace y un botón de Borrar (que borra el mensaje actual)&lt;br /&gt;
bot.on(&amp;#039;message&amp;#039;, (ctx) =&amp;gt; ctx.telegram.sendCopy(ctx.chat.id, ctx.message, Extra.markup(teclado)));&lt;br /&gt;
&lt;br /&gt;
// Por último arrancamos el Bot.&lt;br /&gt;
bot.launch();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ATENCION&amp;#039;&amp;#039;&amp;#039;: Acordarse de &amp;#039;&amp;#039;&amp;#039;ejecutarlo como root&amp;#039;&amp;#039;&amp;#039; con sudo ya que tiene que leer los certificados SSL de nuestro dominio.&lt;br /&gt;
&lt;br /&gt;
== Ejecución permanente del servidor de Node.JS  ==&lt;br /&gt;
&lt;br /&gt;
* Cuando ya tenemos el servidor en &amp;#039;&amp;#039;&amp;#039;producción&amp;#039;&amp;#039;&amp;#039; funcionando correctamente, podemos emplear una herramienta que se llama &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039;, que se encarga de monitorizar la aplicación y si ésta se para por alguna razón, volver a arrancarla de forma automática.&lt;br /&gt;
* Atención &amp;#039;&amp;#039;&amp;#039;forever no monitoriza los cambios en la aplicación&amp;#039;&amp;#039;&amp;#039;, solamente se encarga de mantenerla en funcionamiento permanente.&lt;br /&gt;
* Más información sobre &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; en: &amp;#039;&amp;#039;&amp;#039;https://www.npmjs.com/package/forever&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Podemos &amp;#039;&amp;#039;&amp;#039;instalar forever de forma global&amp;#039;&amp;#039;&amp;#039; con el siguiente comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
npm install -g forever&lt;br /&gt;
&lt;br /&gt;
# Para arrancar de forma continua el fichero index.js haremos:&lt;br /&gt;
forever start index.js&lt;br /&gt;
&lt;br /&gt;
# Para ver la lista de procesos controlados por forever:&lt;br /&gt;
forever list&lt;br /&gt;
&lt;br /&gt;
# Para parar un proceso:&lt;br /&gt;
forever stop uid_del_proceso&lt;br /&gt;
&lt;br /&gt;
# Para reiniciar todos los procesos:&lt;br /&gt;
forever restartall&lt;br /&gt;
&lt;br /&gt;
# Si queremos que nuestro script de Node, se arranque cuando se inicia la máquina de Linux en Debian, haremos por ejemplo un script bash:&lt;br /&gt;
nano arrancarservidornode.sh&lt;br /&gt;
&lt;br /&gt;
# Con el siguiente contenido, por ejemplo:&lt;br /&gt;
---------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
clear&lt;br /&gt;
export PATH=/usr/bin:$PATH&lt;br /&gt;
RUTA=&amp;quot;/var/www/veiga.dynu.net/nodejs/bottelegram/&amp;quot;&lt;br /&gt;
LOG=&amp;quot;server.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd $ruta&lt;br /&gt;
# Inicializamos el log al arrancar el equipo:&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt; $RUTA$LOG&lt;br /&gt;
&lt;br /&gt;
forever start -o $RUTA$LOG --command node --sourceDir $RUTA index.js&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# Guardamos el fichero arrancarservidornode.sh&lt;br /&gt;
# Le aplicamos permisos:&lt;br /&gt;
chmod 755 arrancarservidornode.sh&lt;br /&gt;
&lt;br /&gt;
# A continuación metemos el script bash en el arranque del sistema:&lt;br /&gt;
crontab -e&lt;br /&gt;
&lt;br /&gt;
# Añadimos las 2 siguientes líneas:&lt;br /&gt;
&lt;br /&gt;
# Arranque de servidor de node con forever&lt;br /&gt;
@reboot /ruta_del_script_/arrancarservidornode.sh&lt;br /&gt;
&lt;br /&gt;
# Salimos guardando los cambios.&lt;br /&gt;
&lt;br /&gt;
# Probamos a reiniciar el servidor:&lt;br /&gt;
reboot&lt;br /&gt;
&lt;br /&gt;
# Y comprobaremos que el proceso de node está funcionando al reiniciar el sistema:&lt;br /&gt;
sudo su&lt;br /&gt;
&lt;br /&gt;
forever list&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Usuario:Veiga|Veiga]] ([[Usuario discusión:Veiga|discusión]]) 12:59 22 ene 2020 (CET)&lt;/div&gt;</summary>
		<author><name>Veiga</name></author>
	</entry>
</feed>