Создаем Telegram бота на Swift: от идеи до деплоя

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Telegram бот на Swift: пошаговый гайд для смелых

Привет, разработчик! Если ты думаешь, что Telegram-ботов пишут только на Python или JavaScript, — у меня для тебя новость. Swift, который ты так любишь за элегантность и производительность, отлично подходит для серверной разработки. Да-да, тот самый Swift, на котором ты пишешь приложения под iOS, может работать и на бэкенде. В этом гайде мы создадим Telegram бота на Swift с нуля, используя Vapor — мощный веб-фреймворк. Бот будет отвечать на команды, обрабатывать сообщения и даже отправлять картинки. Поехали!

Почему Swift для Telegram бота? Разрушаем стереотипы

Прежде чем нырять в код, давай разберемся, зачем вообще писать бота на Swift. Во-первых, если ты iOS-разработчик, ты уже знаешь язык. Тебе не нужно учить Python или JS с нуля. Во-вторых, Swift — это безопасность типов и скорость. Бот будет работать быстро и без сюрпризов. В-третьих, экосистема Vapor позволяет легко интегрироваться с базами данных, отправлять уведомления и даже парсить JSON. И да, Telegram Bot API на Swift работает отлично. Главное — правильно настроить окружение.

Шаг 1: Подготовка окружения

Нам понадобится Xcode (минимум версия 14), Homebrew и Vapor. Если у тебя уже есть Xcode — отлично. Если нет — скачай с Mac App Store. Теперь установим Vapor:

brew install vapor

После установки проверим версию:

vapor --version

Видишь номер версии? Отлично. Теперь создадим новый проект:

vapor new TelegramBotSwift --template web
cd TelegramBotSwift

Флаг --template web создаст каркас серверного приложения. Если хочешь минимализм — используй --template api. Мы пойдем по пути веб-приложения, чтобы было больше гибкости.

Шаг 2: Подключаем Telegram Bot API

Для работы с Telegram нам понадобится библиотека. Есть несколько вариантов: TelegramBotSDK от Vapor, SwiftTelegramBot или сырые HTTP-запросы. Я рекомендую TelegramBotSDK — он стабильный и документированный. Добавим его в Package.swift:

// swift-tools-version:5.9
import PackageDescription

let package = Package(
    name: "TelegramBotSwift",
    platforms: [.macOS(.v12)],
    dependencies: [
        .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
        .package(url: "https://github.com/vapor/telegram-bot-sdk.git", from: "2.0.0")
    ],
    targets: [
        .executableTarget(
            name: "App",
            dependencies: [
                .product(name: "Vapor", package: "vapor"),
                .product(name: "TelegramBotSDK", package: "telegram-bot-sdk")
            ]
        )
    ]
)

Теперь получим токен для бота. Открой Telegram, найди BotFather, напиши /newbot, следуй инструкциям. Сохрани токен — он понадобится через минуту.

Шаг 3: Пишем первого бота на Swift

Открой файл Sources/App/configure.swift. Это точка входа. Напишем базовую структуру:

import Vapor
import TelegramBotSDK

public func configure(_ app: Application) throws {
    // Получаем токен из переменных окружения
    guard let token = Environment.get("TELEGRAM_BOT_TOKEN") else {
        fatalError("TELEGRAM_BOT_TOKEN не найден")
    }
    
    // Инициализируем бота
    let bot = TelegramBot(token: token, app: app)
    
    // Обработчик команды /start
    bot.onCommand("start") { context in
        try await context.sendMessage("Привет! Я бот на Swift. Чем могу помочь?")
    }
    
    // Обработчик команды /help
    bot.onCommand("help") { context in
        try await context.sendMessage("Доступные команды:\n/start - начать\n/help - помощь\n/echo [текст] - повторить сообщение")
    }
    
    // Обработчик команды /echo
    bot.onCommand("echo") { context in
        guard let text = context.args.joined(separator: " ").removingPercentEncoding, !text.isEmpty else {
            try await context.sendMessage("Пожалуйста, укажи текст после команды /echo")
            return
        }
        try await context.sendMessage("Вы сказали: \(text)")
    }
    
    // Запускаем бота
    try bot.start()
    
    // Настраиваем Vapor
    app.get { req in
        return "Бот работает!"
    }
}

Теперь нужно передать токен. Создай файл .env в корне проекта:

TELEGRAM_BOT_TOKEN=твой_токен_сюда

Запускаем:

vapor run

Открой Telegram, найди своего бота, напиши /start. Если все сделано правильно — бот ответит. Поздравляю, ты только что создал Telegram бота на Swift!

Шаг 4: Расширяем функционал — отправляем картинки и кнопки

Бот, который только отвечает текстом, — скучно. Давай добавим отправку изображений и инлайн-кнопок. Для этого используем Telegram Bot API напрямую.

Создадим новый файл Sources/App/Controllers/BotController.swift:

import Vapor
import TelegramBotSDK

struct BotController {
    let bot: TelegramBot
    
    // Отправка фото
    func sendPhoto(chatId: Int64, photoUrl: String) async throws {
        let photo = InputFile(url: URL(string: photoUrl)!)
        try await bot.sendPhoto(chatId: chatId, photo: photo, caption: "Красивая картинка, правда?")
    }
    
    // Отправка инлайн-кнопок
    func sendInlineKeyboard(chatId: Int64) async throws {
        let keyboard = InlineKeyboardMarkup(inlineKeyboard: [
            [InlineKeyboardButton(text: "Нажми меня", callbackData: "button_1")],
            [InlineKeyboardButton(text: "Узнать погоду", callbackData: "weather")]
        ])
        try await bot.sendMessage(chatId: chatId, text: "Выбери действие:", replyMarkup: keyboard)
    }
    
    // Обработка нажатий на кнопки
    func handleCallbackQuery(context: CallbackQueryContext) async throws {
        let data = context.callbackQuery.data ?? "unknown"
        let chatId = context.callbackQuery.message?.chat.id ?? 0
        
        switch data {
        case "button_1":
            try await bot.sendMessage(chatId: chatId, text: "Ты нажал кнопку! 🎉")
        case "weather":
            try await bot.sendMessage(chatId: chatId, text: "Сегодня солнечно! 🌞")
        default:
            try await bot.sendMessage(chatId: chatId, text: "Неизвестная команда")
        }
    }
}

Теперь зарегистрируем эти обработчики в configure.swift:

// Добавляем после существующих обработчиков
let controller = BotController(bot: bot                

Блоги

Рекомендаций по книгам