为什么用 C++ 开发 Telegram 机器人?这并非疯狂之举
\n当谈到创建 Telegram 机器人时,首先想到的往往是 Python、Node.js 或 Go。它们简单易用,拥有成千上万的现成库和庞大的社区。但如果您的项目需要极致性能呢?或者您正在编写一个高负载的解析器?又或者,您只是 C++ 的狂热爱好者,想以“硬核”方式完成一切?
\n用 C++ 编写 Telegram 机器人是完全可行的任务。是的,这不是最流行的途径,但它有显著的优点:运行速度快、内存占用低,并且能完全控制每一个字节。在本指南中,我们将从安装库开始,一直到构建一个能够响应命令和解析数据的完整机器人。让我们开始吧!
\n\n我们需要什么?
\n我们需要以下工具:
\n- \n
- C++17/20 编译器 — Linux/macOS 上的 g++ 或 Windows 上的 MSVC。 \n
- CMake — 构建系统(版本 3.10+)。 \n
- tgbot-cpp 库 — 最流行的 Telegram Bot API C++ 封装。 \n
- libcurl — 用于 HTTP 请求(包含在 tgbot-cpp 中)。 \n
- nlohmann/json — 用于处理 JSON(也包含在依赖中)。 \n
- 机器人令牌 — 从 Telegram 的 @BotFather 获取。 \n
所有代码将在 Linux (Ubuntu 22.04) 下编写,但可以轻松通过 vcpkg 或 Conan 适配到 Windows。
\n\n步骤 1:安装库
\n首先安装依赖项。在终端中执行:
\nsudo apt update\nsudo apt install git cmake g++ libcurl4-openssl-dev libssl-dev nlohmann-json3-dev\n现在克隆并构建 tgbot-cpp:
\ngit clone https://github.com/reo7sp/tgbot-cpp.git\ncd tgbot-cpp\nmkdir build && cd build\ncmake ..\nmake -j4\nsudo make install\n如果一切顺利,库已安装到系统中。可以通过命令 ls /usr/local/include/tgbot/ 验证——您将看到头文件。
步骤 2:项目结构和 CMakeLists.txt
\n为项目创建一个文件夹:
\nmkdir my_telegram_bot && cd my_telegram_bot\ntouch main.cpp CMakeLists.txt\n在 CMakeLists.txt 中编写构建配置:
\ncmake_minimum_required(VERSION 3.10)\nproject(MyTelegramBot)\n\nset(CMAKE_CXX_STANDARD 17)\n\nfind_package(TgBot REQUIRED)\nfind_package(OpenSSL REQUIRED)\nfind_package(CURL REQUIRED)\n\nadd_executable(my_bot main.cpp)\ntarget_link_libraries(my_bot TgBot::TgBot OpenSSL::SSL OpenSSL::Crypto CURL::libcurl)\n注意:我们链接了 OpenSSL 和 libcurl——它们用于加密和 HTTP 请求。
\n\n步骤 3:编写 C++ 机器人核心
\n打开 main.cpp 并编写最小结构:
\n#include <tgbot/tgbot.h>\n#include <iostream>\n\nint main() {\n // 替换为您的令牌\n std::string token = "1234567890:ABCdefGHIjklMNOpqrsTUVwxyz";\n\n TgBot::Bot bot(token);\n\n // /start 命令处理器\n bot.getEvents().onCommand("start", [&bot](TgBot::Message::Ptr message) {\n bot.getApi().sendMessage(message->chat->id, "你好!我是 C++ 机器人。有什么可以帮您的?");\n });\n\n // 任何文本消息的处理器\n bot.getEvents().onAnyMessage([&bot](TgBot::Message::Ptr message) {\n if (message->text == "/start") return; // 忽略重复\n bot.getApi().sendMessage(message->chat->id, "您写道:" + message->text);\n });\n\n try {\n std::cout << "机器人已启动。等待消息..." << std::endl;\n TgBot::TgLongPoll longPoll(bot);\n while (true) {\n longPoll.start();\n }\n } catch (TgBot::TgException& e) {\n std::cerr << "错误:" << e.what() << std::endl;\n }\n\n