diff --git a/handler/rss/parse.go b/handler/rss/parse.go index 0e910c7..4e9bc72 100644 --- a/handler/rss/parse.go +++ b/handler/rss/parse.go @@ -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 }