feat: 添加支持代理的HTTP客户端以优化RSS和OPML请求

This commit is contained in:
lixiangwuxian 2025-07-21 01:14:10 +08:00
parent 527998db49
commit 3811049f30

View File

@ -6,15 +6,59 @@ import (
"errors"
"fmt"
"io"
"log"
"net"
"net/http"
"net/url"
"sort"
"strings"
"time"
"git.lxtend.com/lixiangwuxian/qqbot/config"
"golang.org/x/net/proxy"
)
// createHTTPClient 创建支持代理的HTTP客户端
func createHTTPClient() *http.Client {
client := &http.Client{
Timeout: 30 * time.Second,
}
// 检查是否配置了代理
if config.ConfigManager.GetConfig().Management.ProxyAddr != "" {
proxyURL, err := url.Parse(config.ConfigManager.GetConfig().Management.ProxyAddr)
if err != nil {
log.Printf("解析代理地址失败: %v\n", err)
return client
}
if proxyURL.Scheme == "socks5" {
log.Printf("使用SOCKS5代理: %s\n", proxyURL.Host)
dialer, err := proxy.SOCKS5("tcp", proxyURL.Host, nil, proxy.Direct)
if err == nil {
client.Transport = &http.Transport{
Dial: func(network, addr string) (net.Conn, error) {
return dialer.Dial(network, addr)
},
}
} else {
log.Printf("创建SOCKS5代理失败: %v\n", err)
}
} else {
log.Printf("使用HTTP/HTTPS代理: %s\n", proxyURL.Host)
client.Transport = &http.Transport{
Proxy: http.ProxyURL(proxyURL),
}
}
}
return client
}
func CheckRssFeed(feedURL string) error {
//确认返回头
resp, err := http.Head(feedURL)
client := createHTTPClient()
resp, err := client.Head(feedURL)
if err != nil {
return err
}
@ -58,7 +102,8 @@ func ParseFeed(feedURL string) (string, []RssItem, error) {
// }
//获取rss数据
resp, err := http.Get(feedURL)
client := createHTTPClient()
resp, err := client.Get(feedURL)
if err != nil {
return "", nil, err
}
@ -242,7 +287,8 @@ func parseTimeString(timeStr string) time.Time {
// CheckOPMLFile 检查OPML文件是否有效
func CheckOPMLFile(opmlURL string) error {
//确认返回头
resp, err := http.Head(opmlURL)
client := createHTTPClient()
resp, err := client.Head(opmlURL)
if err != nil {
return err
}
@ -275,7 +321,8 @@ func CheckOPMLFile(opmlURL string) error {
// ParseOPML 解析OPML文件返回RSS源列表
func ParseOPML(opmlURL string) ([]OPMLFeedInfo, error) {
//确认大小
resp, err := http.Head(opmlURL)
client := createHTTPClient()
resp, err := client.Head(opmlURL)
if err != nil {
return nil, err
}
@ -287,7 +334,7 @@ func ParseOPML(opmlURL string) ([]OPMLFeedInfo, error) {
}
//获取OPML数据
resp, err = http.Get(opmlURL)
resp, err = client.Get(opmlURL)
if err != nil {
return nil, err
}