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