6.9 · 2020 · 美国 · 科幻 机战
《变形金刚:赛博坦之战 第二季》讲述的是: 《赛博坦之战》推出第二章"地出"!...
```
- 标题:`.hl-item-title a`的文本内容
- 评分:`.hl-text-conch.score`的文本内容
- 年份、地区、类型:第一个`.hl-item-sub`中的信息,以`·`分隔
- 简介:最后一个`.hl-item-sub`的文本内容
#### 3. 分页信息
分页信息位于`.hl-page-wrap`元素中:
```html
剧情简介
《赛博坦之战》推出第二章"地出"!随着火种源的消失,威震天被迫面对残酷的现实...
```
## 提取逻辑
### 搜索结果页面提取逻辑
1. 定位所有的`.hl-list-item`元素
2. 对于每个元素:
- 从`.hl-item-pic a`的`href`属性提取详情页链接
- 从链接中提取资源ID(格式:`/video/(\d+)\.html`)
- 从`.hl-item-title a`提取标题
- 从`.hl-pic-text .remarks`提取资源状态
- 从`.hl-text-conch.score`提取评分
- 从第一个`.hl-item-sub`提取年份、地区、类型信息
- 从最后一个`.hl-item-sub`提取简介
- 从`data-original`属性提取封面图片URL
3. 检查分页:
- 从`.hl-page-wrap`中提取分页链接,用于继续抓取后续页面
### 详情页面提取逻辑
1. 获取资源基本信息:
- 标题:`h2.hl-dc-title`的文本内容
- 评分:`.hl-pic-tag .douban`的文本内容
- 封面图片:`.hl-dc-pic .hl-item-thumb`的`data-original`属性
2. 提取详细信息:
- 从`.hl-vod-data ul li`中提取类型、地区、语言、上映日期、时长等信息
3. 提取磁力链接:
- 定位`.hl-rb-downlist`区域
- 遍历所有`.hl-tabs-btn`获取不同质量版本
- 从`.hl-downs-list li`中提取磁力链接:
- 磁力链接:`.down-name`的`href`属性或`.down-copy`的`data-clipboard-text`属性
- 文件名:`.filename`的文本内容
- 文件大小:`.filesize`的文本内容
4. 提取剧情简介:
- 从`.hl-content-wrap .hl-content-text`提取剧情简介
## 注意事项
1. **搜索URL格式**: `https://www.4kfox.com/search/{关键词}-------------.html`,关键词需要URL编码
2. **详情页URL格式**: `https://www.4kfox.com/video/{ID}.html`
3. **资源类型**: 主要提供磁力链接,以4K高清资源为主
4. **分页处理**: 搜索结果支持分页,需要根据`.hl-page-wrap`中的链接继续抓取
5. **图片延迟加载**: 封面图片使用`data-original`属性进行延迟加载
6. **ID提取**: 从URL中提取ID的正则表达式:`/video/(\d+)\.html`
7. **磁力链接**: 提供多种质量版本(720P、1080P等),每个版本可能有多集
8. **播放源**: 提供多个在线播放源(天堂源、暴风源、非凡源等)
9. **网站编码**: 页面使用UTF-8编码
10. **反爬虫**: 需要设置合适的User-Agent和请求头,避免被反爬虫机制拦截
================================================
FILE: plugin/gying/README.md
================================================
# Gying 搜索插件
## 📖 简介
Gying是PanSou的搜索插件,用于从 www.gying.net 网站搜索影视资源。支持多用户登录并配置账户,在搜索时自动聚合所有用户的搜索结果。
## ✨ 核心特性
- ✅ **多用户支持** - 每个用户独立配置,互不干扰
- ✅ **用户名密码登录** - 支持使用用户名和密码登录
- ✅ **智能去重** - 多用户搜索时自动去重
- ✅ **负载均衡** - 任务均匀分配,避免单用户限流
- ✅ **内存缓存** - 用户数据缓存到内存,搜索性能极高
- ✅ **持久化存储** - Cookie和用户配置自动保存,重启不丢失
- ✅ **Web管理界面** - 一站式配置,简单易用
- ✅ **RESTful API** - 支持程序化调用
- ✅ **默认账户自动登录** - 插件启动时自动使用默认账户登录
## 🚀 快速开始
### 步骤1: 启动服务
```bash
cd /Users/macbookpro/Desktop/fish2018/pansou
go run main.go
# 或者编译后运行
go build -o pansou main.go
./pansou
```
### 步骤2: 访问管理页面
如果需要添加更多账户或管理现有账户,可以访问管理页面:
```
http://localhost:8888/gying/你的用户名
```
**示例**:
```
http://localhost:8888/gying/myusername
```
系统会自动:
1. 根据用户名生成专属64位hash(不可逆)
2. 重定向到专属管理页面:`http://localhost:8888/gying/{hash}`
3. 显示登录表单供手动登录
**📌 提示**:请收藏hash后的URL(包含你的专属hash),方便下次访问。
### 步骤3: 手动登录
在"登录状态"区域输入:
- 用户名
- 密码
点击"**登录**"按钮。
### 步骤4: 开始搜索
在PanSou主页搜索框输入关键词,系统会**自动聚合所有用户**的Gying搜索结果!
```bash
# 通过API搜索
curl "http://localhost:8888/api/search?kw=遮天"
# 只搜索插件(包括gying)
curl "http://localhost:8888/api/search?kw=遮天&src=plugin"
```
## 📡 API文档
### 统一接口
所有操作通过统一的POST接口:
```
POST /gying/{hash}
Content-Type: application/json
{
"action": "操作类型",
...其他参数
}
```
### API列表
| Action | 说明 | 需要登录 |
|--------|------|---------|
| `get_status` | 获取状态 | ❌ |
| `login` | 登录 | ❌ |
| `logout` | 退出登录 | ✅ |
| `test_search` | 测试搜索 | ✅ |
---
### 1️⃣ get_status - 获取用户状态
**请求**:
```bash
curl -X POST "http://localhost:8888/gying/{hash}" \
-H "Content-Type: application/json" \
-d '{"action": "get_status"}'
```
**成功响应(已登录)**:
```json
{
"success": true,
"message": "获取成功",
"data": {
"hash": "abc123...",
"logged_in": true,
"status": "active",
"username_masked": "pa****ou",
"login_time": "2025-10-28 12:00:00",
"expire_time": "2026-02-26 12:00:00",
"expires_in_days": 121
}
}
```
**成功响应(未登录)**:
```json
{
"success": true,
"message": "获取成功",
"data": {
"hash": "abc123...",
"logged_in": false,
"status": "pending"
}
}
```
---
### 2️⃣ login - 登录
**请求**:
```bash
curl -X POST "http://localhost:8888/gying/{hash}" \
-H "Content-Type: application/json" \
-d '{"action": "login", "username": "xxx", "password": "xxx"}'
```
**成功响应**:
```json
{
"success": true,
"message": "登录成功",
"data": {
"status": "active",
"username_masked": "pa****ou"
}
}
```
**失败响应**:
```json
{
"success": false,
"message": "登录失败: 用户名或密码错误"
}
```
---
### 3️⃣ logout - 退出登录
**请求**:
```bash
curl -X POST "http://localhost:8888/gying/{hash}" \
-H "Content-Type: application/json" \
-d '{"action": "logout"}'
```
**成功响应**:
```json
{
"success": true,
"message": "已退出登录",
"data": {
"status": "pending"
}
}
```
---
### 4️⃣ test_search - 测试搜索
**请求**:
```bash
curl -X POST "http://localhost:8888/gying/{hash}" \
-H "Content-Type: application/json" \
-d '{"action": "test_search", "keyword": "遮天"}'
```
**成功响应**:
```json
{
"success": true,
"message": "找到 5 条结果",
"data": {
"keyword": "遮天",
"total_results": 5,
"results": [
{
"title": "遮天:禁区",
"links": [
{
"type": "quark",
"url": "https://pan.quark.cn/s/89f7aeef9681",
"password": ""
}
]
}
]
}
}
```
---
## 🔧 配置说明
### 环境变量(可选)
```bash
# Hash Salt(推荐自定义,增强安全性)
export GYING_HASH_SALT="your-custom-salt-here"
# Cookie加密密钥(32字节,推荐自定义)
export GYING_ENCRYPTION_KEY="your-32-byte-key-here!!!!!!!!!!"
```
### 代码内配置
在 `gying.go` 第20-24行修改:
```go
const (
MaxConcurrentUsers = 10 // 最多使用的用户数(搜索时)
MaxConcurrentDetails = 50 // 最大并发详情请求数
DebugLog = false // 调试日志开关
)
```
### 默认账户配置
在 `gying.go` 第27-32行修改默认账户:
```go
var DefaultAccounts = []struct {
Username string
Password string
}{
// 可以添加更多默认账户
// {"user2", "password2"},
}
```
**参数说明**:
| 参数 | 默认值 | 说明 | 建议 |
|------|--------|------|------|
| `MaxConcurrentUsers` | 10 | 单次搜索最多使用的用户数 | 10-20足够 |
| `MaxConcurrentDetails` | 50 | 最大并发详情请求数 | 50-100 |
| `DebugLog` | false | 是否开启调试日志 | 生产环境false |
## 📂 数据存储
### 存储位置
```
cache/gying_users/{hash}.json
```
### 数据结构
```json
{
"hash": "abc123...",
"username": "pansou",
"username_masked": "pa****ou",
"cookie": "BT_auth=xxx; BT_cookietime=xxx",
"status": "active",
"created_at": "2025-10-28T12:00:00+08:00",
"login_at": "2025-10-28T12:00:00+08:00",
"expire_at": "2026-02-26T12:00:00+08:00",
"last_access_at": "2025-10-28T13:00:00+08:00"
}
```
**字段说明**:
- `hash`: 用户唯一标识(SHA256,不可逆推用户名)
- `username`: 原始用户名(存储)
- `username_masked`: 脱敏用户名(如`pa****ou`)
- `cookie`: 登录Cookie(明文存储,建议配置加密)
- `status`: 用户状态(`pending`/`active`/`expired`)
- `expire_at`: Cookie过期时间(121天)
================================================
FILE: plugin/gying/gying.go
================================================
package gying
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"os"
"path/filepath"
"reflect"
"regexp"
"sort"
"strconv"
"strings"
"sync"
"time"
"unsafe"
"github.com/gin-gonic/gin"
"pansou/model"
"pansou/plugin"
"pansou/util/json"
cloudscraper "github.com/Advik-B/cloudscraper/lib"
)
// 插件配置参数
const (
MaxConcurrentUsers = 10 // 最多使用的用户数
MaxConcurrentDetails = 50 // 最大并发详情请求数
DebugLog = false // 调试日志开关(排查问题时改为true)
)
// 默认账户配置(可通过Web界面添加更多账户)
// 用户数据会保存到文件,重启后自动恢复
var DefaultAccounts = []struct {
Username string
Password string
}{
// 请使用 Web 接口添加用户:
// POST /gying/add_user?username=xxx&password=xxx
}
// 存储目录
var StorageDir string
// 初始化存储目录
// HTML模板
const HTMLTemplate = `