Как я могу отправить фотографию, подпись и встроенную кнопку в боте Telegram с одним сообщением с помощью swift? - PullRequest
0 голосов
/ 10 октября 2019

Это результат, который я хочу

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": "Bad Request: не удается разобрать ответную разметку клавиатурыJSON-объект "}

1 Ответ

0 голосов
/ 10 октября 2019

В соответствии с это решение , reply_markup необходимо преобразовать в JSON-кодированный объект перед отправкой в ​​API.

Итак, это решит вашу проблему:

    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)!
...