refactor and add videos
This commit is contained in:
parent
4568ea3913
commit
2c44abde3c
10 changed files with 2818 additions and 173 deletions
30
internal/config/config.go
Normal file
30
internal/config/config.go
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
package config
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Workers int
|
||||
TgAPIKey string
|
||||
TgChatID int64
|
||||
VkAPIKey string
|
||||
}
|
||||
|
||||
// MustLoad loads the config.
|
||||
func MustLoad() *Config {
|
||||
var Conf Config
|
||||
var err error
|
||||
Conf.Workers, err = strconv.Atoi(os.Getenv("Workers"))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
Conf.TgAPIKey = os.Getenv("TgAPIKey")
|
||||
Conf.VkAPIKey = os.Getenv("VkAPIKey")
|
||||
Conf.TgChatID, err = strconv.ParseInt(os.Getenv("TgChatID"), 10, 64)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return &Conf
|
||||
}
|
||||
79
internal/telegram/telegram.go
Normal file
79
internal/telegram/telegram.go
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
package telegram
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"strings"
|
||||
|
||||
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
||||
"github.com/s32x/httpclient"
|
||||
)
|
||||
|
||||
type TG struct {
|
||||
api *tgbotapi.BotAPI
|
||||
video_links chan string
|
||||
logger *slog.Logger
|
||||
chat_id int64
|
||||
}
|
||||
|
||||
func New(logger *slog.Logger, api_key string, chat_id int64, video_links chan string) (*TG, error) {
|
||||
const op = "telegram.New"
|
||||
bot, err := tgbotapi.NewBotAPI(api_key)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%s: %w", op, err)
|
||||
}
|
||||
|
||||
bot.Debug = false
|
||||
|
||||
u := tgbotapi.NewUpdate(0)
|
||||
u.Timeout = 60
|
||||
|
||||
return &TG{
|
||||
api: bot,
|
||||
video_links: video_links,
|
||||
logger: logger,
|
||||
chat_id: chat_id,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (tg *TG) Run(count int) {
|
||||
for i := 0; i < count; i++ {
|
||||
go tg.new_tg_worker(i + 1)
|
||||
}
|
||||
}
|
||||
|
||||
const PCUserAgent string = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
|
||||
const MobileUserAgent string = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36"
|
||||
|
||||
func (tg *TG) new_tg_worker(id int) {
|
||||
for link := range tg.video_links {
|
||||
tg.logger.Info(fmt.Sprintf("[%d]", id), "Получена ссылка, загружаю:", link)
|
||||
// get video by link
|
||||
var client *httpclient.Client
|
||||
if strings.Contains(link, "VK_ANDROID") {
|
||||
// create mobile client
|
||||
client = httpclient.New().WithHeader("User-Agent", MobileUserAgent)
|
||||
} else {
|
||||
// create Desktop client
|
||||
client = httpclient.New().WithHeader("User-Agent", PCUserAgent)
|
||||
}
|
||||
|
||||
resp, err := client.Get(link).Do()
|
||||
if err != nil {
|
||||
tg.logger.Error("Error with get media", "err", err)
|
||||
continue
|
||||
}
|
||||
body, err := resp.Bytes()
|
||||
if err != nil {
|
||||
tg.logger.Error("Error with get body", "err", err)
|
||||
continue
|
||||
}
|
||||
msg := tgbotapi.NewVideo(tg.chat_id, tgbotapi.FileBytes{Name: "story", Bytes: body})
|
||||
tg.logger.Info(fmt.Sprintf("[%d] Отправляю видео в телеграм...", id))
|
||||
_, err = tg.api.Send(msg)
|
||||
if err != nil {
|
||||
tg.logger.Error("Error with send message", "err", err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
1
internal/vk/story.go
Normal file
1
internal/vk/story.go
Normal file
|
|
@ -0,0 +1 @@
|
|||
package vk
|
||||
2525
internal/vk/video.go
Normal file
2525
internal/vk/video.go
Normal file
File diff suppressed because one or more lines are too long
90
internal/vk/vk.go
Normal file
90
internal/vk/vk.go
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
package vk
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
|
||||
"github.com/SevereCloud/vksdk/v2/api"
|
||||
"github.com/SevereCloud/vksdk/v2/events"
|
||||
"github.com/SevereCloud/vksdk/v2/longpoll-bot"
|
||||
)
|
||||
|
||||
type VK struct {
|
||||
api *api.VK
|
||||
lp *longpoll.LongPoll
|
||||
}
|
||||
|
||||
func New(logger *slog.Logger, api_key string, video_links chan string) (*VK, error) {
|
||||
const op = "vk.New"
|
||||
|
||||
vk := api.NewVK(api_key)
|
||||
|
||||
// get information about the group
|
||||
group, err := vk.GroupsGetByID(nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get group info: %s: %w", op, err)
|
||||
}
|
||||
|
||||
// Initializing Long Poll
|
||||
lp, err := longpoll.NewLongPoll(vk, group[0].ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%s: %w", op, err)
|
||||
}
|
||||
// New message event
|
||||
lp.MessageNew(func(_ context.Context, obj events.MessageNewObject) {
|
||||
logger.Info("Message", "peer", obj.Message.PeerID, "text", obj.Message.Text)
|
||||
for _, obj := range obj.Message.Attachments {
|
||||
objectsw:
|
||||
switch obj.Type {
|
||||
case "story":
|
||||
// fmt.Printf("Story %+v\n", obj.Story.Video.Files)
|
||||
// get video link from struct
|
||||
var videolink string
|
||||
switch {
|
||||
case obj.Story.Video.Files.Mp4_720 != "":
|
||||
videolink = obj.Story.Video.Files.Mp4_720
|
||||
case obj.Story.Video.Files.Mp4_480 != "":
|
||||
videolink = obj.Story.Video.Files.Mp4_480
|
||||
case obj.Story.Video.Files.Mp4_360 != "":
|
||||
videolink = obj.Story.Video.Files.Mp4_360
|
||||
case obj.Story.Video.Files.Mp4_240 != "":
|
||||
videolink = obj.Story.Video.Files.Mp4_240
|
||||
default:
|
||||
logger.Error("cannot find video link")
|
||||
break objectsw
|
||||
}
|
||||
// fmt.Println("Story:", videolink)
|
||||
if err != nil {
|
||||
logger.Error("vk error", "err", err)
|
||||
}
|
||||
// send video to tg
|
||||
video_links <- videolink
|
||||
case "video":
|
||||
// logger.Info("Video", "owner", obj.Video.OwnerID, "id", obj.Video.ID)
|
||||
owner := obj.Video.OwnerID
|
||||
video_id := obj.Video.ID
|
||||
videolink, err := fetchVideoURL(owner, video_id)
|
||||
if err != nil {
|
||||
logger.Error("cannot get video link", "err", err)
|
||||
}
|
||||
video_links <- videolink
|
||||
default:
|
||||
logger.Debug("Message type not found", "type", obj.Type, "obj", fmt.Sprintf("%+v", obj))
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return &VK{
|
||||
api: vk,
|
||||
lp: lp,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Run starts message listening.
|
||||
func (vk *VK) MustRun() {
|
||||
// Run Bots Long Poll
|
||||
if err := vk.lp.Run(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue