前言🌟
两个月前我写了个摸鱼岛摸鱼网站,从 10 个小功能到现在 20~30个功能,少了不了摸鱼岛的用户的支持以及 pr ,大家的开源精神给我摸鱼岛加了很多助力,还被 DeepSeek 收录以及各个公众号转发,今天也是重新排版,带来摸鱼岛 2.0 的介绍文档,此项目开源,只希望获取各位的小小 star 🌟即是给我的最大鼓励。
!NOTE\] 本项目为开源项目,使用者必须在网站标注作者名称以及指向本项目的链接。如果不想保留署名,必须首先获得授权。不得用于非法用途。 \[!NOTE
在线体验地址🔗
最新版(域名 2025.09 过期):fish.codebug.icu/ 稳定版:yucoder.cn/
后端地址🌈:github.com/lhccong/fis...
前端地址🏖️:github.com/lhccong/fis...
!WARNING\] 私部署时记得修改后端接口地址路径指向。
✨ 开源🌟一站式摸鱼网 ✨
部署教程 · 目前现状 · 意见反馈 · 截图展示 · 在线演示 · 开源与贡献 · 相关项目 · 赞赏支持

-
DeepSeek
-
小红书

- 微信公众号

功能
-
支持多种数据源聚合:
-
✅\] 知乎热榜
-
✅\] 虎扑步行街热榜
-
✅\] CSDN 热榜
-
✅\] B 站热门
-
✅\] 网易云热歌榜(支持网站点击播放)
-
✅\] 待补充...
-
-
摸鱼聊天室:
-
✅\] 发送 emoji 表情包
-
✅\] 支持网站链接解析
-
✅\] 支持 AI 助手回答(接入硅基流动模型)
-
✅\] 用户地理位置显示功能
-
✅\] 五子棋、象棋对战邀请功能
-
✅\] 支持用户 CV 发送图片功能
-
✅\] 在线搜书功能
-
✅\] 支持自定义书源
-
✅\] 五子棋(人机/在线对战)
-
✅\] 2048
-
✅\] JSON 格式化
-
✅\] 聚合翻译
-
✅\] AI 智能体
-
-
头像框兑换功能。
-
其他:
-
✅\] 音乐播放器
-
✅\] 修改网站图标
-
✅\] 摸鱼初始页
-
信息聚合

每日待办

摸鱼室

摸鱼阅读


小游戏
- 五子棋

- 象棋

- 2048

工具箱
- JSON 格式化工具

- 文本比对

头像框兑换

目前现状
- 各大公众号转发。

-
用户突破 1k 的个人网站。
-
最高峰实时在线人数达 80 +。

部署教程
后端
-
执行初始化 SQL create_table.sql
-
更改 MySQL 地址、Redis 地址、Minio 地址、邮箱发送配置
-
Maven 打包
-
docker 部署
-
dockerfile 文件
bashFROM openjdk:8 ENV workdir=/cong/fish COPY . ${workdir} WORKDIR ${workdir} EXPOSE 8123 CMD ["java","-jar","-Duser.timezone=GMT+08","fish-island-backend-0.0.1-SNAPSHOT.jar"]
-
打包命令
inidocker build -f ./dockerfile -t fish . 启动命令:docker run -d -e TZ=CST -p 8123:8123 -p 8090:8090 --name "fish" fish:latest
-
nginx 配置
iniserver { listen 80; listen [::]:80; server_name moyuapi.codebug.icu; rewrite ^(.*) https://$server_name$1 permanent; } server { listen 443 ssl; server_name moyuapi.codebug.icu; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /usr/share/nginx/fish; index index.html; try_files $uri $uri/ /index.html; } location /fish/ { proxy_pass http://fish:8123/; } # WebSocket代理配置,处理 wss:// 请求 location /ws/ { proxy_pass http://fish:8090/; # 后端 WebSocket 服务地址 proxy_http_version 1.1; # 使用 HTTP/1.1 协议,WebSocket 需要这个版本 proxy_set_header Upgrade $http_upgrade; # 必须设置这些头来支持 WebSocket 协议的升级 proxy_set_header Connection 'upgrade'; # 维持 WebSocket 连接 proxy_set_header Host $host; # 确保 Host 头部传递正确 proxy_cache_bypass $http_upgrade; # 禁用缓存 } location /sogou-api/ { proxy_pass https://pic.sogou.com/; proxy_set_header Host pic.sogou.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_ssl_server_name on; # 解决 CORS 问题 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"; add_header Access-Control-Expose-Headers "Content-Length,Content-Range"; # 处理 OPTIONS 预检请求 if ($request_method = OPTIONS) { return 204; } } location /holiday/ { proxy_pass https://date.appworlds.cn/; # 保持目标 API 的 Host,避免返回默认网页 proxy_set_header Host date.appworlds.cn; # 伪装成浏览器,防止服务器根据 User-Agent 返回 HTML proxy_set_header User-Agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; # 强制服务器返回 JSON,而不是 HTML proxy_set_header Accept "application/json"; # CORS 允许跨域 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"; add_header Access-Control-Expose-Headers "Content-Length,Content-Range"; # 处理 OPTIONS 预检请求 if ($request_method = OPTIONS) { return 204; } } location /img-api/ { proxy_pass https://i.111666.best/; proxy_set_header Host pic.sogou.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_ssl_server_name on; # 解决 CORS 问题 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"; add_header Access-Control-Expose-Headers "Content-Length,Content-Range"; # 处理 OPTIONS 预检请求 if ($request_method = OPTIONS) { return 204; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
前端
- 修改 src/constants/index.ts 的接口地址。
- max build --打包命令。
- 部署 dist 文件。
开源与贡献
项目支持者 🔥

前端贡献者 🌟

后端贡献者 🌟:

📌 贡献方式
如果你也有希望聚合的数据源不妨来参加一下贡献,将你的数据源爬取出来放入其中。
1️⃣ 页面元素抓取
📌 适用于:目标网站未提供 API,数据嵌入在 HTML 结构中。
✅ 贡献要求
-
推荐使用:
Jsoup
(Java)BeautifulSoup
(Python)Cheerio
(Node.js)
-
选择器精准:避免因页面结构变化导致抓取失败。
-
减少 HTTP 请求:优化抓取效率,避免重复请求。
-
遵守网站爬取规则 (
robots.txt
)。
💡 示例代码
ini
Document doc = Jsoup.connect("https://example.com").get();
String title = doc.select("h1.article-title").text();
2️⃣ 页面接口返回数据抓取
📌 适用于:目标网站提供 API,可直接调用接口获取 JSON/XML 数据。
✅ 贡献要求
-
推荐使用:
HttpClient
(Java)axios
(Node.js)requests
(Python)
-
分析 API 请求 :确保请求参数完整(
headers
、cookies
、token
)。 -
减少不必要的请求:优化调用频率,避免触发反爬机制。
-
异常处理:确保代码稳定运行。
💡 示例代码
ini
String apiUrl = "https://api.example.com/data";
String response = HttpRequest.get(apiUrl).execute().body();
JSONObject json = JSON.parseObject(response);
🔗 数据源注册
数据抓取完成后,需要注册数据源,以便系统能够正确使用。
🚀 注册流程
-
添加数据源 Key :
/src/main/java/com/cong/fishisland/model/enums/HotDataKeyEnum.java
定义新的数据源 Key。 -
更新数据源映射:
/src/main/java/com/lhccong/fish/backend/config/DatabaseConfig.java
文件中,添加新的数据源配置。
-
创建数据源类:
src/main/java/com/cong/fishisland/datasource
目录下,新建数据源类,继承DataSource
,实现getHotPost
方法。
-
实现数据获取逻辑:
- 按照
HotPostDataVO
格式返回数据。 - 使用
@Builder
注解,确保数据能正确解析。
- 按照
💡 示例代码
scss
HotPostDataVO.builder()
.title(title)
.url(url)
.followerCount(followerCount)
.excerpt(excerpt)
.build();
🚀 贡献流程
- Fork 仓库 ➜ 点击 GitHub 右上角
Fork
按钮。 - 创建分支 ➜ 推荐使用有意义的分支名,如
feature/data-scraper-optimization
。 - 提交代码 ➜ 确保代码可读性高,符合规范。
- 提交 Pull Request(PR) ➜ 详细描述您的更改内容,并关联相关 issue(如有)。
- 等待审核 ➜ 维护者会进行代码审核并合并。
以上讲解如果对你有帮助,不妨给我的项目点个小小的 star 🌟,成为一下我的精神股东呢
🎉 感谢您的贡献!
您的每一份贡献都让 fish-island 变得更好!💪