Livekit and Telegram Bot
Livekit and Telegram Bot
Livekit
Hace ya bastante tiempo se definio un estandar WebRTC y haciendo uso de ese estandar aparece Livekit que haciendo uso de la estupenda librearia Pion WebRTC.
Si una vez instalado arrancamos con la configuracion
Basicamente queda
livekit-server --dev --config config-sample.yml
Y la configuracion deberia ser
port: 7880
rtc:
port_range_start: 50000
port_range_end: 50100
tcp_port: 7881
use_external_ip: true
keys:
devkey: secret
Hay que tener en cuenta, que la comunicacion se hace usando websocket por lo que para exponer el puerto 7880 desde un servidor al exterior debemos usar un proxy reverso.
Si nos centramos en apache tenemos varias (una, dos y tres opciones de configuracion… y deberia quedar algo asi
<VirtualHost *:443>
ServerName livekit.domain.com
SSLEngine On
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:7880/$1" [P,L]
ProxyPreserveHost On
ProxyPass / ws://127.0.0.1:7880/
ProxyPassReverse / ws://127.0.0.1:7800/
ProxyRequests off
DocumentRoot /var/www/domain/livekit
DirectoryIndex index.html
ErrorLog /var/log/apache2/error-livekit-domain.log
CustomLog /var/log/apache2/access-livekit-domain.log combined
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "Authorization"
Header always set Access-Control-Allow-Methods "GET"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "600"
SSLCertificateFile /etc/letsencrypt/live/livekit.domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/livekit.domain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
y esto incluye los certificados ssl para securizarlo… porque, a parte de hacer un mapeo de puertos al exterior (en el ejemplo 7881 y 7882, no estoy 100% seguro pero si que seguro los 50000-50100) al estilo de como cuentan aqui
Una vez configurada la parte servidora, tenemos que montar un frontal
Com bola extra, estaria preparado para usar TURN (resumido, averiguar tu IP)… en este articulo cuentan de que van los turn server
Telegram Bot
Para montar un bot de telegram en Go, hay muchas opciones disponibles.
Una de las mas interesantes es esta con go-telegram-bot-api que deja todo el tratamiento muy conciso
Otras opciones pueden ser esta y esta que tiene una explicacion muy detallada incluso detalla la parte del despliegue del webhook
Ah, por cierto, la primera opcion de codigo… hace pooling, con lo que no necesitas exponer un webhook como tal, en la segunda describen como hacer con la parte del webhook.
Lo que me ha llevado a descubrir un par de “webhook” interesantes
El bot, simplemente recibe el comando y hace uso del codigo de livekit-cli para generar un token valido, y construye una url de conexion con los datos necesarios para conectarse al livekit.
Ejemplos de código
Respecto al codigo, es muy basico… usa variables de entorno para el token de Telegram y para la key y la secret de Livekit.
Obs Broadcaster
Y finalmente para la grabacion de todo el conjunto, la mejor herramienta es OBS Studio
Plugins
https://medium.com/@mhatrep/remove-video-background-without-a-green-screen-in-obs-studio-f73735b40c65 https://github.com/royshil/obs-backgroundremoval#linux https://github.com/royshil/obs-backgroundremoval/releases/tag/v0.3.0-beta tar –use-compress-program=unzstd -xvf archive.tar.zst
Bonus - Livekit - Egress
Como bonus, podemos ver como realizar la grabacion de las sesiones desde la parte servidora (el tipico boton de grabar la sesion)
La parte de “performance” se puede testear con el cli
$ livekit-cli create-token –api-key devkey –api-secret secret –join –room my-first-room –identity user1 –valid-for 24h
$ livekit-cli load-test –api-key devkey –api-secret secret –room my-first-room –publishers 8 $ livekit-cli load-test –api-key devkey –api-secret secret –room my-first-room –subscribers 8
Con esta opcion (y otras que se comentan) se pueden publicar videos (u otras fuentes…)
$ livekit-cli join-room –room yourroom –identity publisher
–publish path/to/video.ivf
–publish path/to/audio.ogg
–fps 23.98
Sobre la configuracion y envio de clips de video…
Y ahora la parte especifica de grabar: start room composite (recording of room UI) $ livekit-cli start-room-composite-egress –request request.json
{ “room_name”: “my-room”, “track_id”: “TR_XXXXXXXXXXXX”, “websocket_url”: “wss://my-service.com” }
La parte de instalacion de egress indica que se debe desplegar el codigo que antiguamente, con esta configuracion
Ejecucion en local
log_level: debug
api_key: your-api-key
api_secret: your-api-secret
ws_url: ws://192.168.65.2:7880
insecure: true
redis:
address: 192.168.65.2:6379
Para lo que se necesita un Redis con una configuracion minima de de por ejemplo 256mb
Grabacion de la sesion
Aunque se oye muy bajito, aqui queda algo del experimento…