@vadimuar

Как в golang с помощью tgbotapi переслать отправителю его же сообщение?

Здравствуйте, собственно сам вопрос в шапке. Сложности с reply обычных сообщений (текстовых) не возникает. Но, хотелось бы реализовать reply картинок, голосовых сообщений и стикеров. Но тут бы я хотел узнать конкретно каким образом реализовать отправку голосовых сообщений отправителю
  • Вопрос задан
  • 2705 просмотров
Решения вопроса 1
@ghostiam
На Go писатель, серверов пинатель.
Старый ответ

как и с сообщениями, у созданных объектов есть свойство ReplyToMessageID в которое нужно записать ID сообщения из update.Message.MessageID
audioUpload := tgbotapi.NewAudioUpload(update.Message.Chat.ID, ...)
audioUpload.ReplyMarkup = update.Message.MessageID
_, err := bot.Send(audioUpload)


Если возникает вопрос, как вообще отправить файл, то нужно передать структуру tgbotapi.FileBytes или tgbotapi.FileReader вторым параметром в функцию и заполнить её.
Для примера, отправляем файл с диска:
file, err := os.Open("audio.mp3")
		if err != nil {
			panic(err)
		}
		defer file.Close()

		audioUpload := tgbotapi.NewAudioUpload(update.Message.Chat.ID, tgbotapi.FileReader{
			Name:   "audio.mp3",
			Reader: file,
			Size:   -1, // If Size is -1, it will read the entire Reader into memory to calculate a Size.
		})
		audioUpload.ReplyToMessageID = update.Message.MessageID
		_, err := bot.Send(audioUpload)
		if err != nil {
			panic(err)
		}



UPD: После общения в ЛС, оказалось, что вопрос заключался в создании Echo бота, который мог бы пересылать не только текст, но и картинки, аудио и прочее.

В данном примере реализована отправка только текста и картинок. Чтобы добавить обработку других типов сообщений, нужно добавить новый `case` в `switch` в функции `OnMessage`:
Код
package main

import (
	"log"

	"github.com/davecgh/go-spew/spew"
	"github.com/go-telegram-bot-api/telegram-bot-api"
)

func main() {
	// подключаемся к боту с помощью токена
	bot, err := tgbotapi.NewBotAPI("ТОКЕН")
	if err != nil {
		log.Panic(err)
	}

	bot.Debug = true
	log.Printf("Authorized on account %s", bot.Self.UserName)

	// инициализируем канал, куда будут прилетать обновления от API
	u := tgbotapi.NewUpdate(0)
	u.Timeout = 60

	updates, err := bot.GetUpdatesChan(u)
	if err != nil {
		log.Fatal(err)
	}

	// читаем обновления из канала
	for update := range updates {
		switch {
		case update.Message != nil: // Если было прислано сообщение, то обрабатываем, так как могут приходить не только сообщения.
			OnMessage(bot, update.Message)
		}
	}
}

func OnMessage(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
	// Пользователь, который написал боту
	userName := message.From.UserName

	// ID чата/диалога.
	// Может быть идентификатором как чата с пользователем
	// (тогда он равен UserID) так и публичного чата/канала
	chatID := message.Chat.ID

	log.Printf("[%s] %d", userName, chatID)

	spew.Dump(message) // выводим то что пришло (Для отладки!!!)

	var msg tgbotapi.Chattable
	switch {
	case message.Text != "": // Текстовое ли сообщение?
		msg = tgbotapi.NewMessage(chatID, message.Text)

	case message.Photo != nil: // Это фото?
		photoArray := *message.Photo
		photoLastIndex := len(photoArray) - 1
		photo := photoArray[photoLastIndex] // Получаем последний элемент массива (самую большую картинку)
		msg = tgbotapi.NewPhotoShare(chatID, photo.FileID)

	default:                                                 // Если не одно условие не сработало
		msg = tgbotapi.NewMessage(chatID, "Не реализовано") // Отправляется на тот тип сообщения, который ещё не реализован выше ^
	}

	// и отправляем его
	_, err := bot.Send(msg)
	if err != nil {
		log.Println(err)
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы