twitchlib

Cómo hacer un bot para Twitch en C# con TwitchLib

Hoy vamos a ver cómo hacer un bot que se conecte e interactúe con un canal de Twitch, desarrollado en una aplicación de .NET 6 en C#.

Este es un proyecto bastante común en la actualidad, porque es habitual que cualquier desarrollador que haga directos en Twitch quiera tener su propio bot del canal, y dar un aspecto más profesional y personalizado.

Este tipo de desarrollos son más frecuente en lenguajes como JavaScript o Python, que en lenguajes como C#. Afortunadamente, hacer un bot para Twitch en .NET es muy sencillo gracias a la librería TwitchLib.

TwitchLib es una librería con alto grado de madurez. De hecho las primeras versiones tienen más de 5 años, aunque está actualizada activamente. Es compatible con los servicios de chat, susurros, API v5, y la nueva API Helix.

Esta desarrollada en .NET Standard 2.0, por lo que es compatible con aplicaciones de .NET Framework 4.6.1 a 4.8, .NET Core 2.x, 3.x, .NET 5.0 y 6.0, Mono, Xamarin, UWP. Por lo que es compatible con Windows, Linux y MacOS, Android y Unity.

Toda la librería TwitchLib es Open Source y el código está disponible en la página del proyecto https://github.com/TwitchLib/TwitchLib. Os recomiendo echarle un ojo porque, tras las últimas refactorizaciones, ha quedado un código muy ordenado e interesante.

Cómo usar TwitchLib

TwitchLib se encuentra disponible como paquete NuGet, por lo que añadirlo a nuestro proyecto es muy sencillo. Simplemente tenemos que hacer,

Install-Package TwitchLib

TwitchLib se divide en diversos módulos, cada uno de los cuales se permite conectarse con uno de los servicios de Twitch. módulos

  • TwitchLib.Client
  • TwitchLib.Api
  • TwitchLib.PubSub
  • TwitchLib.Unity
  • TwitchLib.Extension
  • TwitchLib.Webhook

Cada uno de estos módulos / servicios permite realizar una serie de acciones. Asi mismo, tienen diferentes requisitos de autentificación.

Estas diferencias están muy bien documentadas en la web del proyecto. Pero, de forma resumida,

  • Client, permite hacer la mayoría de acciones asociadas al chat. Leer y escribir mensajes, banear usuarios, cambiar el modo del chat, detección de suscripciones, host, y raid.
  • API, permite hacer acciones más avanzadas, como badges, bits, blocks, followers, tren del hype.

Y los otros módulos son para Funcionalidades más avanzadas y menos frecuentes.

Autentificación del bot en Twitch

Para poder conectar nuestro bot a Twitch necesitaremos crearle su propia cuenta. Esto resulta un requisito según los términos de servicio y, además, nos evitamos la preocupación de que por un fallo terminemos con nuestra cuenta principal baneada.

Una vez que tengamos la cuenta de nuestro bot registrada, debemos obtener los parámetros para autorizar la conexión por OAuth2.

Para ello tienes que registrar tu aplicación en la consola de desarrollador https://dev.twitch.tv/console. Al registrar nuestra App obtendremos un ClientId y un Secret.

A continuación, tenéis que elegir una de las formas de autenticación, como explican en https://dev.twitch.tv/docs/authentication/. Existen distintos flujos de autenticación, recomendados para cada uno de los casos.

El flujo “Authorization code grant flow” es suficiente para nuestro caso. Por tanto, debemos hacer una petición a una URL, usando el ClientId y el Secret que hemos obtenido al registrar nuestra App.

Alternativamente, en el caso de que unicamente estemos usando las funcionalidades de Client, alternativamente podemos emplear un servicio de terceros como https://twitchapps.com/tmi/. Esto recoge la funciones más comunes en un bot de Twitch, y simplifica mucho el proceso de autenticación.

Usar una aplicación de terceros siempre da un reparo desde el punto de vista de seguridad. Pero TwitchApp es conocida y por tanto tiene cierta fiabilidad.

Ejemplo de uso TwichLib

Finalmente, vamos a ver un par de ejemplos sencillos de de TwitchLib Client y API. Estos están basado en los ejemplos proporcionados por la propia página del proyecto.

Ejemplo de Twichlib.Client

Para emplear Twichlib.Client necesitaremos el UserName del bot, y la clave de OAuth que hemos obtenido bien a traves del request indicado en la documentación de Twitch, o a través de una App de terceros (tiene la forma oauth).

Console.WriteLine("Twitchlib Client demo");

var bot = new BotTwitch();
bot.Start();

Console.ReadLine();

public class BotTwitch
{
    TwitchClient? client;

    public BotTwitch()
    {           
    }

    private void Init()
    {
        var clientOptions = new ClientOptions
        {
            MessagesAllowedInPeriod = 750,
            ThrottlingPeriod = TimeSpan.FromSeconds(30)
        };

        WebSocketClient customClient = new WebSocketClient(clientOptions);
        client = new TwitchClient(customClient);

        ConnectionCredentials credentials = new ConnectionCredentials(Resources.username, Resources.oauth);
        client.Initialize(credentials);
    }

    public void Start()
    {
        if (client == null) Init();

        client.OnLog += Client_OnLog;
        client.OnConnected += Client_OnConnected;            
        client.OnJoinedChannel += Client_OnJoinedChannel;
        client.OnMessageReceived += Client_OnMessageReceived;
        client.OnChatCommandReceived += Client_OnChatCommandReceived;
        client.OnWhisperReceived += Client_OnWhisperReceived;
        client.OnNewSubscriber += Client_OnNewSubscriber;

        client.Connect();

        string channel_to_join = "luisllamas_es";
        client.JoinChannel(channel_to_join);
    }

    public void Stop()
    {
        client?.Disconnect();
        client = null;
    }

    private void Client_OnLog(object sender, OnLogArgs e)
    {
        //Console.WriteLine($"{e.DateTime.ToString()}: {e.BotUsername} - {e.Data}");
    }

    private void Client_OnConnected(object sender, OnConnectedArgs e)
    {
        Console.WriteLine($"Connected");
    }

    private void Client_OnJoinedChannel(object sender, OnJoinedChannelArgs e)
    {
        Console.WriteLine($"Joined to {e.Channel}");
        client?.SendMessage(e.Channel, "Hey guys! I am a bot connected via TwitchLib!");
    }

    private void Client_OnMessageReceived(object sender, OnMessageReceivedArgs e)
    {
        Console.WriteLine($"Message received: {e.ChatMessage.Message}");
    }

    private void Client_OnChatCommandReceived(object sender, OnChatCommandReceivedArgs e)
    {
        Console.WriteLine($"Command received: {e.Command.CommandText}");
    }

    private void Client_OnWhisperReceived(object sender, OnWhisperReceivedArgs e)
    {
        Console.WriteLine($"Whisper received: {e.WhisperMessage.Message}");
    }
    
    private void Client_OnNewSubscriber(object sender, OnNewSubscriberArgs e)
    {
        Console.WriteLine($"Suscribed: {e.Subscriber.DisplayName}");
    }
}

Ejemplo de Twichlib.API

Para emplear Twichlib.API necesitaremos necesariamente el ClientId y el Secret que hemos obtenido al registrar nuestra App. Con estos valores generaremos un Token de conexión para poder usar el API.

Console.WriteLine("Twitchlib API demo");

TwitchLib.Api.TwitchAPI api = new TwitchLib.Api.TwitchAPI();
api.Settings.ClientId = Resources.client_id;
api.Settings.Secret = Resources.secret;

var token = await api.Auth.GetAccessTokenAsync();
api.Settings.AccessToken = token;

string channel_name = "luisllamas_es";
ExtFollowerService service = new ExtFollowerService(api);
var followersCount = await service.GetFollowersCountAsync(channel_name);

Console.Write(followersCount);
Console.ReadLine();

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full