用Swift创建聊天机器人:从构思到首次对话

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Swift是聊天机器人的绝佳选择?

\n

谈到创建聊天机器人时,很多人首先想到的是Python或JavaScript。这很合理:那里有大量现成的库和示例。但如果你的技术栈是Apple生态系统呢?或者你想创建一个直接在Vapor服务器上运行的机器人?又或者你只是想在iOS开发之外尝试一下Swift?

\n

Swift不仅拥有优美的语法和类型安全,还具备极快的速度、出色的网络处理能力以及强大的数据解析工具。在本文中,我们不会编写另一个“hello-world”机器人。我们将一步步用Swift构建一个功能完整的Telegram机器人,它能够响应命令、处理文本消息并解析JSON。开始吧!

\n\n

我们需要什么?

\n

在深入代码之前,让我们先了解一下所需的工具。对于我们的项目,我们将使用:

\n
    \n
  • Swift 5.9+ — 最新的稳定版本。
  • \n
  • Foundation — 用于网络和JSON处理的内置库。
  • \n
  • Telegram Bot API — 我们需要调用的REST API。
  • \n
  • SwiftBot库 — 用于处理Telegram的轻量级封装(或者我们编写自己的最小客户端)。
  • \n
\n

如果你想走最大控制权的路线,我们将只使用Foundation的标准工具。没有任何第三方依赖——只有纯Swift。

\n\n

步骤1:在BotFather处注册机器人

\n

这是最简单的一步。打开Telegram,找到BotFather,输入/newbot并按照说明操作。最后你会得到一个令牌——一串类似123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11的长字符串。将其保存到环境变量或配置文件中。如果你计划将项目上传到GitHub,切勿将令牌直接硬编码到代码中。

\n

令牌是访问你机器人的密钥。通过它,我们将向Telegram API发送请求。

\n\n

步骤2:创建用于API交互的结构

\n

首先,我们需要编写一个简单的HTTP客户端。Telegram API通过GET和POST请求工作。我们将使用URLSession——Swift中用于网络处理的标准工具。

\n\n

创建基础类BotClient

\n
import Foundation\n\nclass BotClient {\n    private let token: String\n    private let baseURL = "https://api.telegram.org/bot"\n    \n    init(token: String) {\n        self.token = token\n    }\n    \n    // 发送请求的方法\n    private func sendRequest(method: String, parameters: [String: Any] = [:], completion: @escaping (Data?, Error?) -> Void) {\n        let urlString = "\\(baseURL)\\(token)/\\(method)"\n        guard let url = URL(string: urlString) else {\n            completion(nil, NSError(domain: "Invalid URL", code: -1))\n            return\n        }\n        \n        var request = URLRequest(url: url)\n        request.httpMethod = "POST"\n        request.setValue("application/json", forHTTPHeaderField: "Content-Type")\n        \n        if !parameters.isEmpty {\n            request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)\n        }\n        \n        let task = URLSession.shared.dataTask(with: request) { data, response, error in\n            completion(data, error)\n        }\n        task.resume()\n    }\n    \n    // 获取更新(新消息)\n    func getUpdates(offset: Int? = nil, completion: @escaping ([Update]?) -> Void) {\n        var params: [String: Any] = [:]\n        if let offset = offset {\n            params["offset"] = offset\n        }\n        \n        sendRequest(method: "getUpdates", parameters: params) { data, error in\n            guard let data = data else {\n                completion(nil)\n                return\n            }\n            \n            do {\n                let response = try JSONDecoder().decode(TelegramRespons                

博客

书籍推荐