Skip to content

Instantly share code, notes, and snippets.

@zaz600
Last active February 16, 2022 19:02
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save zaz600/1e073c716b2b38254cc6 to your computer and use it in GitHub Desktop.
Save zaz600/1e073c716b2b38254cc6 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"github.com/Syfaro/telegram-bot-api"
"github.com/carbocation/go-instagram/instagram"
"log"
)
type InstagramResponse struct {
url string
m tgbotapi.Message
}
var (
// Канал, куда будем помещать запросы к инстаграму
instagram_req chan tgbotapi.Message
// Канал, куда будем помещать ответы на запросы к инстаграму
instagram_res chan InstagramResponse
)
func main() {
// создаем канал для запросов к инстаграму
instagram_req = make(chan tgbotapi.Message, 5)
go get_ig_popular()
instagram_res = make(chan InstagramResponse, 5)
// подключаемся к боту с помощью токена
bot, err := tgbotapi.NewBotAPI("ТОКЕН") // вставить свой
if err != nil {
log.Panic(err)
}
bot.Debug = true
log.Printf("Authorized on account %s", bot.Self.UserName)
// инициализируем канал, куда будут прилетать обновления от API
var ucfg tgbotapi.UpdateConfig = tgbotapi.NewUpdate(0)
ucfg.Timeout = 60
err = bot.UpdatesChan(ucfg)
// читаем обновления из канала
for {
select {
case update := <-bot.Updates:
// Пользователь, который написал боту
UserName := update.Message.From.UserName
UserID := update.Message.From.ID
// ID чата/диалога.
// Может быть идентификатором как чата с пользователем
// (тогда он равен UserID) так и публичного чата/канала
ChatID := update.Message.Chat.ID
// Текст сообщения
Text := update.Message.Text
log.Printf("[%s] %d %d %s", UserName, UserID, ChatID, Text)
var reply string
msg := tgbotapi.NewMessage(ChatID, "")
if update.Message.NewChatParticipant.UserName != "" {
// В чат вошел новый пользователь
// Поприветствуем его
reply = fmt.Sprintf(`Привет @%s! Я тут слежу за порядком. Веди себя хорошо.`,
update.Message.NewChatParticipant.UserName)
}
if Text == "/instarandom" {
instagram_req <- update.Message
//reply = get_ig_popular()
//msg.ReplyToMessageID = update.Message.MessageID
}
if reply != "" {
// Созадаем сообщение
msg.Text = reply
// и отправляем его
bot.SendMessage(msg)
}
case resp := <-instagram_res:
// отправляем инстаграм-ссылку пользователю
msg := tgbotapi.NewMessage(resp.m.Chat.ID, resp.url)
msg.ReplyToMessageID = resp.m.MessageID
bot.SendMessage(msg)
}
}
}
// Читает канал с запросами к инстаграму
// Получает популярное фото и отправляет в канал ответов ссылку
func get_ig_popular() {
// создаем и настраиваем клиента
instagram_client := instagram.NewClient(nil)
instagram_client.ClientID = "ClientID" // вставить свой
//opt := &instagram.Parameters{Count: 1}
for {
for msg := range instagram_req {
// запрашиваем популярные фото
media, _, err := instagram_client.Media.Popular() //Tags.RecentMedia("instasky", opt) //.Media.Popular()
if err != nil {
log.Println(err)
continue
}
// возвращаем ссылку на первое фото из списка
if len(media) > 0 {
instagram_res <- InstagramResponse{media[0].Link, msg}
}
}
}
}
@skywinder
Copy link

В новой версии:

https://gist.github.com/zaz600/1e073c716b2b38254cc6#file-go-tg-bot3-go-L40
updates, err := bot.GetUpdatesChan(ucfg)

@skywinder
Copy link

Спасибо большое за отличный гайд. Очень помог

@skywinder
Copy link

Еще не хватает инструкции, как задеплоить на хероку например :)

@achatina
Copy link

Хороший гайд, но, увы, уже не актуальный. Как и с инстаграмом (эта библиотека устарелаи ей никто не занимается), так и telegram bot api

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment