Guía: Telegram bot usando Swift

#1

Por pedido de @alan (y supongo que a alguien más le puede interesar), sale una guía para hacer un bot de Telegram con Swift.

Como estoy muy manija con Avengers: Endgame, vamos a hacer un bot muy sencillo de Groot.

1. Crear un ejecutable usando Swift Package Manager

Vamos a usar Swift Package Manager porque necesitamos que nuestro bot corra en Ubuntu, pues los servers en macOS no son muy comunes.

Swift Package Manager es un dependency manager y en este momento NO soporta iOS ni macOS. Por otro lado, es muy usado para hacer cli (Command-line interface) tools y frameworks.

mkdir groot-bot
cd groot-bot
swift package init --type executable


Con esto ya tenemos un template de un ejecutable.

El parámetro --type executable es para que dentro de nuestro source cree un main.swift y el target sea un ejecutable. De lo contrario nos va a generar un package que genera un framework.

Lo interesante de SPM es que no hace falta que usemos Xcode: podemos manejarnos con swift build, swift run y swift test si así quisiéramos.

Si queremos usar Xcode, podemos usar swift package generate-xcodeproj y eso va a generar un proyecto con las dependencias.

Dato interesante: SPM no modifica el .xcodeproj como Cocoapods, así que cada vez que cambio dependencias borro el project y lo genero de nuevo. Además, el .gitignore que genera SPM, tiene ignorado a los projects así que asumo que esa es una forma de trabajar aceptada.

A este punto recomiendo que miren las estructuras de las carpetas y se familiaricen un poco.

2. Agregar dependencias en Swift Package Manager

De las libraries de Telegram (en Swift), la que más me gustó fue givip/Telegrammer.

Tenemos que editar nuestro Package.swift:

// swift-tools-version:5.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "groot-bot",
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(url: "https://github.com/givip/Telegrammer.git", from: "0.5.0")
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "groot-bot",
            dependencies: ["Telegrammer"]),
        .testTarget(
            name: "groot-botTests",
            dependencies: ["groot-bot"]),
    ]
)

Buildeamos de nuevo (swift build) y …

3. ¡Código para el bot! :robot:

Modificamos Sources/groot-bot/main.swift

import Foundation
import Telegrammer

let token = "TBD NOS FALTA CONSEGUIR EL TOKEN..."
var settings = Bot.Settings(token: token, debugMode: true)
let bot = try! Bot(settings: settings)

// Callback for handler, that sends "I AM GROOT"
func grootHandler(_ update: Update, _ context: BotContext?) throws {
    guard let message = update.message else {
        return
    }

    let params = Bot.SendMessageParams(chatId: .chat(message.chat.id), text: "I AM GROOT")
    try bot.sendMessage(params: params)
}

do {
    let dispatcher = Dispatcher(bot: bot)

    let handler = MessageHandler(filters: .text, callback: grootHandler)
    dispatcher.add(handler: handler)

    // Longpolling updates
    _ = try Updater(bot: bot, dispatcher: dispatcher).startLongpolling().wait()

} catch {
    print(error.localizedDescription)
}

4. Bueno Telegram, dame el token

Telegram tiene un bot que administra y crea otros bots.

How meta is that?

El bot se llama BotFather y el comando para empezar todo es /newbot.

Sigan las instrucciones y si todo sale bien, van a obtener un token.

Con eso ya tienen todo lo necesario para correr localmente el bot.

3 me gusta

Guía: Deployar un bot de Telegram con Dokku
#2

¿Dudas hasta acá? :slight_smile:

UPDATE: Para aprender cómo deployar el bot en un server con Dokku, pueden leer esta otra guía.

1 me gusta