mirror of
https://github.com/krau/SaveAny-Bot.git
synced 2026-07-12 16:02:05 +08:00
feat: parse message link via userbot, close #70
This commit is contained in:
@@ -62,12 +62,19 @@ func tryFetchFileFromMessage(ctx *ext.Context, chatID int64, messageID int, file
|
|||||||
if (strings.Contains(err.Error(), "peer not found") || strings.Contains(err.Error(), "unexpected message type")) && userclient.UC != nil {
|
if (strings.Contains(err.Error(), "peer not found") || strings.Contains(err.Error(), "unexpected message type")) && userclient.UC != nil {
|
||||||
common.Log.Warnf("无法获取文件 %d:%d, 尝试使用 userbot: %s", chatID, messageID, err)
|
common.Log.Warnf("无法获取文件 %d:%d, 尝试使用 userbot: %s", chatID, messageID, err)
|
||||||
uctx := userclient.GetCtx()
|
uctx := userclient.GetCtx()
|
||||||
// TODO: 群组支持
|
peer := uctx.PeerStorage.GetInputPeerById(chatID)
|
||||||
file, err = FileFromMessage(uctx, chatID, messageID, fileName)
|
if peer == nil {
|
||||||
if err == nil {
|
return nil, true, fmt.Errorf("failed to get peer for chat %d: %w", chatID, err)
|
||||||
return file, true, nil
|
|
||||||
}
|
}
|
||||||
return nil, true, err
|
msg, err := GetSingleHistoryMessage(uctx, uctx.Raw, peer, messageID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, true, err
|
||||||
|
}
|
||||||
|
file, err = FileFromMedia(msg.Media, fileName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, true, fmt.Errorf("failed to get file from userbot message %d:%d: %w", chatID, messageID, err)
|
||||||
|
}
|
||||||
|
return file, true, nil
|
||||||
}
|
}
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
|
|||||||
34
bot/utils.go
34
bot/utils.go
@@ -1,6 +1,7 @@
|
|||||||
package bot
|
package bot
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -12,6 +13,7 @@ import (
|
|||||||
"github.com/gabriel-vasile/mimetype"
|
"github.com/gabriel-vasile/mimetype"
|
||||||
"github.com/gotd/td/telegram/message/entity"
|
"github.com/gotd/td/telegram/message/entity"
|
||||||
"github.com/gotd/td/telegram/message/styling"
|
"github.com/gotd/td/telegram/message/styling"
|
||||||
|
"github.com/gotd/td/telegram/query"
|
||||||
"github.com/gotd/td/tg"
|
"github.com/gotd/td/tg"
|
||||||
"github.com/krau/SaveAny-Bot/common"
|
"github.com/krau/SaveAny-Bot/common"
|
||||||
"github.com/krau/SaveAny-Bot/dao"
|
"github.com/krau/SaveAny-Bot/dao"
|
||||||
@@ -235,6 +237,38 @@ func GetTGMessage(ctx *ext.Context, chatId int64, messageID int) (*tg.Message, e
|
|||||||
return tgMessage, nil
|
return tgMessage, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/iyear/tdl/blob/fbb396da774ba544e527c3ef41c44921ad74ee98/core/util/tutil/tutil.go#L174
|
||||||
|
func GetSingleHistoryMessage(ctx context.Context, client *tg.Client, peer tg.InputPeerClass, msg int) (*tg.Message, error) {
|
||||||
|
it := query.Messages(client).GetHistory(peer).OffsetID(msg + 1).BatchSize(1).Iter()
|
||||||
|
|
||||||
|
if !it.Next(ctx) {
|
||||||
|
return nil, fmt.Errorf("failed to get message %d from %s: %w", msg, peer, it.Err())
|
||||||
|
}
|
||||||
|
|
||||||
|
m, ok := it.Value().Msg.(*tg.Message)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("invalid message %d", msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.GetID() != msg {
|
||||||
|
return nil, fmt.Errorf("the message %d/%d may be deleted", GetInputPeerID(peer), msg)
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetInputPeerID(peer tg.InputPeerClass) int64 {
|
||||||
|
switch p := peer.(type) {
|
||||||
|
case *tg.InputPeerUser:
|
||||||
|
return p.UserID
|
||||||
|
case *tg.InputPeerChat:
|
||||||
|
return p.ChatID
|
||||||
|
case *tg.InputPeerChannel:
|
||||||
|
return p.ChannelID
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
func ProvideSelectMessage(ctx *ext.Context, update *ext.Update, fileName string, chatID int64, fileMsgID, toEditMsgID int) error {
|
func ProvideSelectMessage(ctx *ext.Context, update *ext.Update, fileName string, chatID int64, fileMsgID, toEditMsgID int) error {
|
||||||
entityBuilder := entity.Builder{}
|
entityBuilder := entity.Builder{}
|
||||||
var entities []tg.MessageEntityClass
|
var entities []tg.MessageEntityClass
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import (
|
|||||||
"github.com/krau/SaveAny-Bot/config"
|
"github.com/krau/SaveAny-Bot/config"
|
||||||
"github.com/krau/SaveAny-Bot/storage"
|
"github.com/krau/SaveAny-Bot/storage"
|
||||||
"github.com/krau/SaveAny-Bot/types"
|
"github.com/krau/SaveAny-Bot/types"
|
||||||
|
"github.com/krau/SaveAny-Bot/userclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
func saveFileWithRetry(ctx context.Context, storagePath string, taskStorage storage.Storage, cacheFilePath string) error {
|
func saveFileWithRetry(ctx context.Context, storagePath string, taskStorage storage.Storage, cacheFilePath string) error {
|
||||||
@@ -61,7 +62,11 @@ func saveFileWithRetry(ctx context.Context, storagePath string, taskStorage stor
|
|||||||
}
|
}
|
||||||
|
|
||||||
func processPhoto(task *types.Task, taskStorage storage.Storage) error {
|
func processPhoto(task *types.Task, taskStorage storage.Storage) error {
|
||||||
res, err := bot.Client.API().UploadGetFile(task.Ctx, &tg.UploadGetFileRequest{
|
api := bot.Client.API()
|
||||||
|
if task.UseUserClient && userclient.UC != nil {
|
||||||
|
api = userclient.UC.API()
|
||||||
|
}
|
||||||
|
res, err := api.UploadGetFile(task.Ctx, &tg.UploadGetFileRequest{
|
||||||
Location: task.File.Location,
|
Location: task.File.Location,
|
||||||
Offset: 0,
|
Offset: 0,
|
||||||
Limit: 1024 * 1024,
|
Limit: 1024 * 1024,
|
||||||
|
|||||||
@@ -69,6 +69,10 @@ func Login(ctx context.Context) (*gotgproto.Client, error) {
|
|||||||
return nil, r.err
|
return nil, r.err
|
||||||
}
|
}
|
||||||
UC = r.client
|
UC = r.client
|
||||||
|
// disp := UC.Dispatcher
|
||||||
|
// disp.AddHandler(handlers.NewAnyUpdate(func(ctx *ext.Context, u *ext.Update) error {
|
||||||
|
// return dispatcher.EndGroups
|
||||||
|
// }))
|
||||||
return UC, nil
|
return UC, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user