- Added Handlers struct and methods for task operations - Implemented task progress tracking and storage - Created server setup with middleware for logging and recovery - Added support for Telegram file extraction and Telegraph image extraction - Introduced webhook functionality for task status updates - Defined request and response types for API interactions
81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/charmbracelet/log"
|
|
"github.com/krau/SaveAny-Bot/common/utils/tphutil"
|
|
"github.com/krau/SaveAny-Bot/pkg/telegraph"
|
|
)
|
|
|
|
// ExtractTelegraphImages 从 Telegraph URL 提取图片
|
|
func ExtractTelegraphImages(ctx context.Context, pageURL string) ([]string, string, error) {
|
|
logger := log.FromContext(ctx)
|
|
|
|
// 验证 URL 格式
|
|
if !isValidTelegraphURL(pageURL) {
|
|
return nil, "", fmt.Errorf("invalid telegraph URL format: %s", pageURL)
|
|
}
|
|
|
|
// 解析 URL 获取页面路径
|
|
pagepath, err := parseTelegraphPath(pageURL)
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
|
|
logger.Debugf("Fetching telegraph page: %s", pagepath)
|
|
|
|
client := telegraph.NewClient()
|
|
page, err := client.GetPage(ctx, pagepath)
|
|
if err != nil {
|
|
return nil, "", fmt.Errorf("failed to get telegraph page: %w", err)
|
|
}
|
|
|
|
var imgs []string
|
|
for _, elem := range page.Content {
|
|
imgs = append(imgs, tphutil.GetNodeImages(elem)...)
|
|
}
|
|
|
|
if len(imgs) == 0 {
|
|
return nil, "", fmt.Errorf("no images found in telegraph page")
|
|
}
|
|
|
|
return imgs, pagepath, nil
|
|
}
|
|
|
|
// parseTelegraphPath 解析 Telegraph URL 获取页面路径
|
|
func parseTelegraphPath(pageURL string) (string, error) {
|
|
u, err := url.Parse(pageURL)
|
|
if err != nil {
|
|
return "", fmt.Errorf("invalid telegraph URL: %w", err)
|
|
}
|
|
|
|
if !strings.HasSuffix(u.Host, "telegra.ph") && !strings.HasSuffix(u.Host, "telegraph.co") {
|
|
return "", fmt.Errorf("invalid telegraph URL host: %s", u.Host)
|
|
}
|
|
|
|
paths := strings.Split(strings.TrimPrefix(u.Path, "/"), "/")
|
|
if len(paths) == 0 || paths[0] == "" {
|
|
return "", fmt.Errorf("invalid telegraph URL path: %s", u.Path)
|
|
}
|
|
|
|
pagepath := paths[len(paths)-1]
|
|
pagepath, err = url.PathUnescape(pagepath)
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to unescape telegraph path: %w", err)
|
|
}
|
|
|
|
return strings.TrimSpace(pagepath), nil
|
|
}
|
|
|
|
// isValidTelegraphURL 检查是否是有效的 Telegraph URL
|
|
func isValidTelegraphURL(url string) bool {
|
|
return strings.HasPrefix(url, "https://telegra.ph/") ||
|
|
strings.HasPrefix(url, "http://telegra.ph/") ||
|
|
strings.HasPrefix(url, "https://telegraph.co/") ||
|
|
strings.HasPrefix(url, "http://telegraph.co/")
|
|
}
|