【问题标题】:How can I send photo, caption and inline button in a single message telegram bot with swift?如何使用 swift 在单个消息电报机器人中发送照片、标题和内联按钮?
【发布时间】:2019-10-11 01:31:38
【问题描述】:

This is the result that I want

func getOffers(_ page: Int, _ i: Int) {
    getOfferProducts(category: [""], sort: -1, page: page) { (products) in

        let keyboard = [ "inline_keyboard" : [
                                [
                                    ["text" : "Amazon", "url" : products[i].detailedPageURL]
                                ]
                            ]
                        ]

        var url = "https://api.telegram.org/bot" + apiToken + "/sendPhoto?" +
            "chat_id=" + chatId +
            "&caption=" + products[i].title + "\n\n" +
            "????Prezzo iniziale: " + String(products[i].startingPrice) + " €\n" +
            "????Prezzo attuale: " + String(products[i].price) + " €\n" +
            "????Risparmi il " + String(Double(products[i].percentOff!)) + "%\n\n" +
            "►" + String(products[i].detailedPageURL) +
            "&photo=" + String(products[i].largeImageURL!) +
            "&reply_markup=" + keyboard

        DispatchQueue.main.async {
            let url = URL(string: url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
            let downloadTask = URLSession.shared.dataTask(with: url!) { (data : Data?, response : URLResponse?, error : Error?) in
                // Do what you want with data
            }
            downloadTask.resume()
        }

    }
}

如果我不包含参数“reply_markup”,它可以工作(显然没有按钮)。相反,如果我尝试添加一个按钮,它会返回错误:

{"ok":false,"error_code":400,"description":"错误请求:无法解析回复键盘标记 JSON 对象"}

【问题讨论】:

  • 这可能是由于 url 标题中的表情符号 (????, ????, ????, ►)。您是否尝试过在没有他们的情况下发送请求?
  • 问题与“reply_markup”有关,因为没有它,它可以工作。

标签: swift telegram telegram-bot


【解决方案1】:

根据this solutionreply_markup需要在发送到API之前转换为JSON编码的对象。

所以,这会解决你的问题:

    let keyboard = [ "inline_keyboard" : [
                    [
                        ["text" : "Amazon", "url" : products[i].detailedPageURL]
                    ]
                   ]]

    guard let keyboardData = try? JSONSerialization.data(withJSONObject: keyboard, options: []) else {
        return
   }

    var url = "https://api.telegram.org/bot" + apiToken + "/sendPhoto?" +
        "chat_id=" + chatId +
        "&caption=" + products[i].title + "\n\n" +
        "?Prezzo iniziale: " + String(products[i].startingPrice) + " €\n" +
        "?Prezzo attuale: " + String(products[i].price) + " €\n" +
        "?Risparmi il " + String(Double(products[i].percentOff!)) + "%\n\n" +
        "►" + String(products[i].detailedPageURL) +
        "&photo=" + String(products[i].largeImageURL!) +
        "&reply_markup=" + String(data: keyboardData, encoding: String.Encoding.utf8)!

【讨论】:

  • 完美!像魅力一样工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2016-08-15
  • 2020-07-09
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多