🔧 chore: 初始化番茄小说 API 项目结构
新增项目基础框架,包含核心 API 实现、算法模块、HTTP 处理器等完整功能模块
This commit is contained in:
commit
6981148727
107 files changed
+12463
No files matched your search
@@ -0,0 +1,159 @@
|
||||
package algos
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// AlgorithmInterface 算法接口
|
||||
type AlgorithmInterface interface {
|
||||
GetAlgorithmName() string
|
||||
GenerateHeaders(url string, headers map[string]string) (map[string]string, error)
|
||||
}
|
||||
|
||||
// AlgorithmSwitcher 算法切换器
|
||||
type AlgorithmSwitcher struct {
|
||||
mu sync.RWMutex
|
||||
currentAlgorithm string
|
||||
algorithms map[string]AlgorithmInterface
|
||||
}
|
||||
|
||||
// NewAlgorithmSwitcher 创建算法切换器
|
||||
func NewAlgorithmSwitcher() *AlgorithmSwitcher {
|
||||
switcher := &AlgorithmSwitcher{
|
||||
algorithms: make(map[string]AlgorithmInterface),
|
||||
}
|
||||
|
||||
// 注册所有算法
|
||||
switcher.algorithms["gorgon"] = &GorgonAlgorithmAdapter{}
|
||||
switcher.algorithms["8404"] = &Algo8404Adapter{}
|
||||
|
||||
// 设置默认算法为gorgon
|
||||
switcher.currentAlgorithm = "gorgon"
|
||||
|
||||
return switcher
|
||||
}
|
||||
|
||||
// SwitchAlgorithm 切换算法
|
||||
func (s *AlgorithmSwitcher) SwitchAlgorithm(algorithmType string) error {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
|
||||
if _, exists := s.algorithms[algorithmType]; !exists {
|
||||
return fmt.Errorf("不支持的算法类型: %s", algorithmType)
|
||||
}
|
||||
|
||||
s.currentAlgorithm = algorithmType
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetCurrentAlgorithm 获取当前算法名称
|
||||
func (s *AlgorithmSwitcher) GetCurrentAlgorithm() string {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
return s.currentAlgorithm
|
||||
}
|
||||
|
||||
// GetAvailableAlgorithms 获取可用算法列表
|
||||
func (s *AlgorithmSwitcher) GetAvailableAlgorithms() []string {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
|
||||
algorithms := make([]string, 0, len(s.algorithms))
|
||||
for name := range s.algorithms {
|
||||
algorithms = append(algorithms, name)
|
||||
}
|
||||
return algorithms
|
||||
}
|
||||
|
||||
// GetCurrentAlgorithmInstance 获取当前算法实例
|
||||
func (s *AlgorithmSwitcher) GetCurrentAlgorithmInstance() AlgorithmInterface {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
|
||||
return s.algorithms[s.currentAlgorithm]
|
||||
}
|
||||
|
||||
// GetAlgorithmInstance 获取指定算法实例
|
||||
func (s *AlgorithmSwitcher) GetAlgorithmInstance(algorithmType string) (AlgorithmInterface, error) {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
|
||||
algorithm, exists := s.algorithms[algorithmType]
|
||||
if !exists {
|
||||
return nil, fmt.Errorf("不支持的算法类型: %s", algorithmType)
|
||||
}
|
||||
|
||||
return algorithm, nil
|
||||
}
|
||||
|
||||
// GorgonAlgorithmAdapter Gorgon算法适配器(兼容旧版)
|
||||
type GorgonAlgorithmAdapter struct{}
|
||||
|
||||
func (g *GorgonAlgorithmAdapter) GetAlgorithmName() string {
|
||||
return "Gorgon算法"
|
||||
}
|
||||
|
||||
func (g *GorgonAlgorithmAdapter) GenerateHeaders(url string, headers map[string]string) (map[string]string, error) {
|
||||
// 使用Gorgon算法
|
||||
parts := strings.Split(url, "?")
|
||||
if len(parts) < 2 {
|
||||
return headers, fmt.Errorf("URL格式错误")
|
||||
}
|
||||
|
||||
xSSStub := headers["x-ss-stub"]
|
||||
cookie := headers["Cookie"]
|
||||
if cookie == "" {
|
||||
cookie = headers["cookie"]
|
||||
}
|
||||
|
||||
gorgon := NewGorgon(parts[1], time.Now().Unix(), xSSStub, cookie)
|
||||
result := gorgon.GetValue()
|
||||
|
||||
finalHeaders := make(map[string]string)
|
||||
for k, v := range headers {
|
||||
finalHeaders[k] = v
|
||||
}
|
||||
|
||||
for k, v := range result {
|
||||
finalHeaders[k] = v
|
||||
}
|
||||
|
||||
return finalHeaders, nil
|
||||
}
|
||||
|
||||
// Algo8404Adapter 8404算法适配器
|
||||
type Algo8404Adapter struct{}
|
||||
|
||||
func (a *Algo8404Adapter) GetAlgorithmName() string {
|
||||
return "8404算法"
|
||||
}
|
||||
|
||||
func (a *Algo8404Adapter) GenerateHeaders(url string, headers map[string]string) (map[string]string, error) {
|
||||
// 使用8404算法
|
||||
parts := strings.Split(url, "?")
|
||||
if len(parts) < 2 {
|
||||
return headers, fmt.Errorf("URL格式错误")
|
||||
}
|
||||
|
||||
xSSStub := headers["x-ss-stub"]
|
||||
algo := NewAlgo8404(parts[1], time.Now().Unix(), xSSStub)
|
||||
result := algo.GetValue()
|
||||
|
||||
finalHeaders := make(map[string]string)
|
||||
for k, v := range headers {
|
||||
finalHeaders[k] = v
|
||||
}
|
||||
|
||||
for k, v := range result {
|
||||
finalHeaders[k] = v
|
||||
}
|
||||
|
||||
return finalHeaders, nil
|
||||
}
|
||||
|
||||
// GlobalAlgorithmSwitcher 全局算法切换器实例
|
||||
var GlobalAlgorithmSwitcher = NewAlgorithmSwitcher()
|
||||
|
||||
Reference in new issue
Block a user