package main import ( "log" "net/url" "os" "strings" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" "github.com/kkdai/youtube/v2" "mvdan.cc/xurls/v2" ) func main() { bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_TOKEN")) bot.SetAPIEndpoint("https://tg.neonxp.ru/bot%s/%s") if err != nil { log.Panic(err) } bot.Debug = true log.Printf("Authorized on account %s", bot.Self.UserName) u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates := bot.GetUpdatesChan(u) for update := range updates { if update.Message != nil { // If we got a message message := update.Message xRelaxed := xurls.Relaxed() linkString := xRelaxed.FindString(message.Text) if linkString == "" { msg := tgbotapi.NewMessage(message.Chat.ID, "Сообщение должно содержать ссылку") log.Println(err) msg.ReplyToMessageID = message.MessageID bot.Send(msg) continue } link, err := url.Parse(linkString) if err != nil { msg := tgbotapi.NewMessage(message.Chat.ID, "Сообщение должно содержать корректную ссылку на youtube") log.Println(err) msg.ReplyToMessageID = message.MessageID bot.Send(msg) continue } go func(message *tgbotapi.Message) { if strings.HasSuffix(link.Host, "youtube.com") && link.Query().Get("v") != "" { if err := download(bot, message, link.Query().Get("v")); err != nil { msg := tgbotapi.NewMessage(message.Chat.ID, "Ошибка: "+err.Error()) log.Println(err) msg.ReplyToMessageID = message.MessageID bot.Send(msg) } } else if strings.HasSuffix(link.Host, "youtu.be") && link.Path != "" { pathParts := strings.SplitN(link.Path, "?", 2) if err := download(bot, message, pathParts[0]); err != nil { msg := tgbotapi.NewMessage(message.Chat.ID, "Ошибка: "+err.Error()) log.Println(err) msg.ReplyToMessageID = message.MessageID bot.Send(msg) } } else { msg := tgbotapi.NewMessage(message.Chat.ID, "Сообщение должно содержать корректную ссылку на youtube") log.Println(err) msg.ReplyToMessageID = message.MessageID bot.Send(msg) } }(message) } } } func download(bot *tgbotapi.BotAPI, message *tgbotapi.Message, videoID string) error { client := youtube.Client{} video, err := client.GetVideo(videoID) if err != nil { return err } formats := video.Formats.WithAudioChannels() stream, _, err := client.GetStream(video, &formats[0]) if err != nil { return err } defer stream.Close() msg := tgbotapi.NewMessage(message.Chat.ID, "Начинаю скачивать: "+video.Title+"\nАдрес файла") msg.ParseMode = "html" msg.ReplyToMessageID = message.MessageID if _, err := bot.Send(msg); err != nil { return err } file := tgbotapi.FileReader{ Name: "video.mp4", Reader: stream, } _, err = bot.Send(tgbotapi.NewVideo(message.From.ID, file)) return err }