JS : 自动购买每天&3天&每周刷新食材 3.0 (#2752)

* JS : 自动购买每天&3天&每周刷新食材 2.0.1

補充月之四新NPC

* Delete repo/js/自动购买每天&3天&每周刷新食材 directory

* 自动购买每天&3天&每周刷新食材

改用input-text輸入要買商品
減少頁面長度

* 調整說明
This commit is contained in:
this-Fish
2026-01-21 12:02:06 +08:00
committed by GitHub
parent d477b61ffa
commit 2427291982
13 changed files with 452 additions and 501 deletions

View File

@@ -1,248 +1,197 @@
# 自动购买每天&3天&每周刷新食材 - 使用说明
# 自动购买商品 - 使用说明
## 功能说明
## 🚀 快速开始
这个脚本可以自动购买原神游戏中各个商人的食材,支持三种刷新周期:
- **每天刷新食材**每天凌晨4点刷新
- **3天刷新食材**每3天刷新一次
- **每周刷新食材**:每周刷新,可指定购买日
- **智能记录系统**:避免重复购买,只购买刷新后的商品
### 1. 基本设置
1. **账号名**:填写账号名,用于区分不同账号的购买记录
2. **要购买的商品**:输入商品名称,用空格分隔(支援的商人与商品请查看下方表格)
```
示例:盐 胡椒 螃蟹 圣水 松茸 沉玉仙茗 蟹黄
```
3. **每周商品购买方式**
- 0跟随游戏系统周期自动判断
- 1-7指定周几购买1=周一7=周日)
4. **要禁用的NPC**不想购买的NPC用空格分隔
```
示例:阿扎莱 皮托
```
5. **无视购买记录强制购买**:开启后会忽略购买记录,重新购买所有商品
6. **调试模式**:开启后显示详细执行日志
## 快速开始
### 2. 智能购买记录系统
脚本会自动记录购买时间,避免重复购买:
- **每天商品**购买后24小时凌晨4点刷新
- **3天商品**购买后3天刷新
- **每周商品**购买后7天刷新可设置购买日
### 1. 准备工作
- 游戏分辨率:**1920×1080 解析度**
- 游戏内时间需可调整(非多人模式)
- 准备足够的摩拉购买食材
购买记录保存在:`record/你填的账号名/records.json`
- 下次执行时只购买已刷新商品
- 可通过"无视购买记录强制购买"选项重置
### 2. 首次使用
1. 打开脚本设置界面
2. 勾选要购买的食材
3. 设置每周食材购买日
4. 保存设置
5. 在主界面运行脚本
### 3. 运行脚本
1. 确保游戏分辨率设置为 **1920×1080**
2. 游戏角色需在单人模式
3. 确保有足够的摩拉和背包空间
4. 运行脚本即可自动购买
## 设置说明
- **账号名**:区分不同账号的记录
- **无视记录强制购买**:不推荐开启,会重复购买
- **记录调试模式**:显示详细日志信息
- **禁用NPC功能**可以输入要禁用的NPC名称空格分隔
```
布兰琪 东升 莎拉
```
## 📋 商人与商品支持表
禁用后脚本会跳过这些NPC不会前往购买。
### 如何查看支持的商品?
- **查看本文件下方表格**:包含所有支持的商人与商品
- **查看`assets/data/foods.json`**:所有商品的中文名称
### 食材设置
食材分为三类,可以单独选择是否购买:
1. **每天刷新食材** - 每天凌晨4点刷新
2. **3天刷新食材** - 每3天刷新一次
3. **每周刷新食材** - 每周固定週一购买
### 商人信息总览
| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 备注 |
|--------|--------|-------------|------------|-------------|------|
| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | 白天出现 |
| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | 晚上出现 |
| 蒙德-蒙德城 | 莎拉 | - | - | 蟹黄 | - |
| 璃月-璃月港 | 东升 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁、盐、胡椒、番茄 | - | - | |
| 璃月-璃月港 | 卯师父 | 鱼肉、螃蟹 | 胡萝卜、松茸、绝云椒椒 | - | |
| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | 白天出现 |
| 璃月-璃月港 | 老高 | 鱼肉 | - | - | |
| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋 | - | 晚上出现 |
| 璃月-望舒客栈 | 菲尔戈黛特 | - | 松茸、琉璃袋 | - | |
| 璃月-遗珑埠 | 丰泰 | - | 沉玉仙茗、琉璃袋、绝云椒椒 | 蟹黄 | |
| 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | |
| 稻妻-离岛 | 小畑 | 螃蟹、鱼肉、虾仁 | - | - | |
| 稻妻-稻妻城 | 葵 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、盐、胡椒、番茄 | - | - | |
| 稻妻-稻妻城 | 志村勘兵卫 | 鱼肉、螃蟹 | 堇瓜 | - | |
| 稻妻-海祇岛 | 清子 | - | - | 牛奶、番茄、土豆、小麦、豆腐 | |
| 须弥-须弥城 | 朱特 | - | 帕蒂沙兰 | - | |
| 须弥-奥摩斯港 | 布特罗斯 | 鱼肉、螃蟹、虾仁 | - | - | |
| 须弥-须弥城 | 珀姆 | 鱼肉、螃蟹、虾仁 | - | - | |
| 须弥-须弥城 | 哈马维 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、盐、胡椒、番茄 | - | - | |
| 须弥-须弥城 | 兰巴德 | 鱼肉、螃蟹 | - | - | 独立地图 |
| 须弥-须弥城 | 恩忒卡 | 咖啡豆 | - | - | 独立地图 |
| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | - | - | 晚上出现 |
| 须弥-奥摩斯港 | 巴巴克 | - | 清心、琉璃袋 | - | |
| 枫丹-枫丹廷 | 布希柯 | 枫达、洋葱、牛奶、卷心菜、土豆、小麦、秃秃豆、杏仁、发酵果实汁、盐、胡椒、番茄 | - | - | |
| 枫丹-枫丹廷 | 阿鲁埃 | 咖啡豆、枫达 | - | - | |
| 枫丹-白淞镇 | 安特曼 | 鱼肉、螃蟹 | 海露花、汐藻 | - | |
| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | |
| 纳塔-圣火竞技场 | 钦特利 | - | 青蜜莓、苦种 | - | |
| 纳塔-圣火竞技场 | 夏安卡 | - | - | 蟹黄 | |
| 纳塔-圣火竞技场 | 布纳马 | 盐、胡椒、小麦、洋葱、牛奶、番茄、卷心菜、土豆、秃秃豆 | - | - | |
| 挪德卡莱-那夏镇 | 采若 | 黑麦、盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | |
| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | |
### 购买日设置
- **0**:跟随游戏系统周期自动判断
- **1-7**指定週几购买1=週一7=週日)
## 🔧 添加新商品
## 调试模式
### 1. 添加商品图片
1. 截图商品图标,尺寸建议 90×90 像素
2. 保存为 PNG 格式,放在 `assets/images/` 目录下
3. 文件名建议使用英文或拼音,如:`new_food.png`
开启`记录调试模式`后,会显示详细执行信息:
```
[调试] 开始处理NPC: 布兰琪
[调试] NPC当前记录: {npcname: "布兰琪", 1d_time: "2024-12-10T04:00:00+08:00"}
[调试] 购买判断结果:
[调试] 1天商品: 盐, 胡椒, 洋葱
[调试] 开始购买第 1 页
[调试] 尝试购买: 盐
[调试] 找到物品: 盐 位置(100,200,90,90)
购买成功: 盐
交互或拾取:"盐"
```
```json
## 数据文件说明
脚本使用外部数据文件,方便维护:
### 食材数据 (assets/data/foods.json)
```json
{
"盐": {
"id": "盐",
"name": "盐",
"file": "assets/images/salt.png"
}
}
```
### NPC数据 (assets/data/npcs.json)
```json
{
"布兰琪": {
"name": "布兰琪",
"enable": true,
"page": 2,
"time": "night",
"path": "assets/path/蒙德-蒙德城-布兰琪.json",
"_1d_foods": ["盐", "胡椒", "洋葱"]
}
}
```
### 图片要求
- 尺寸90×90像素
- 格式PNG
- 路径assets/images/
### 路径文件
- 格式JSON
- 路径assets/path/
## 添加新食材
### 1. 添加食材图片
将食材截图保存为`assets/images/新食材.png`
- 食材图片85×85像素PNG格式
### 2. 添加食材设置
在`settings.json`中添加:
```json
{
"name": "新食材",
"type": "checkbox",
"label": "新食材",
"default": false
}
```
### 3. 添加食材数据
在`assets/data/foods.json`中添加:
```json
"新食材": {
"id": "新食材",
"name": "新食材",
"file": "assets/images/新食材.png"
}
```
### 4. 添加NPC数据
在`assets/data/npcs.json`中为对应的NPC添加
```json
"_1d_foods": ["新食材"] // 根据刷新周期选择
```
## 如何添加新的NPC商人
### 准备工作
1. 路径文件錄製前往NPC的路径JSON文件
2. 命名规则:`国家-地区-NPC名称.json`
### 添加步骤
#### 1. 添加食材数据(如未添加)
### 2. 添加商品数据
在 `assets/data/foods.json` 中添加:
```json
"新食材": {
"id": "新食材",
"name": "新食材",
"file": "assets/images/新食材.png"
"new_food": {
"id": "new_food",
"name": "新商品",
"file": "assets/images/new_food.png"
}
```
在 `settings.json` 对应区域添加食材选项。
### 3. 添加到商人
在 `assets/data/npcs.json` 中找到对应商人,添加到相应的商品列表中:
#### 2. 添加NPC数据
```json
"_1d_foods": ["新商品"] // 每天刷新商品
"_3d_foods": ["新商品"] // 3天刷新商品
"_7d_foods": ["新商品"] // 每周刷新商品
```
### 4. 更新商人与商品支持表
将新商品添加到本文件的商人与商品支持表中,方便其他用户查看。
## 🆕 添加新商人
### 1. 录制路径
1. 使用路径录制工具录制前往商人的路径
2. 保存为 JSON 文件,命名格式:`地区-位置-商人名.json`
3. 放在 `assets/path/` 目录下
### 2. 添加商人数据
在 `assets/data/npcs.json` 中添加:
```json
"新NPC名称": {
"name": "新NPC名称",
"enable": true,
"page": 2,
"time": "any",
"path": "assets/path/国家-地区-新NPC名称.json",
"_1d_foods": ["食材1", "食材2"],
"_3d_foods": ["食材3"],
"_7d_foods": ["食材4"]
"new_npc": {
"name": "新商人名",
"enable": true,
"page": 2, // 商店总页数
"time": "any", // any/day/night
"path": "assets/path/地区-位置-新商人名.json",
"_1d_foods": ["商品1", "商品2"], // 每天刷新
"_3d_foods": ["商品3"], // 3天刷新
"_7d_foods": ["商品4"] // 每周刷新
}
```
**参数说明**
- `page`商店总页数
- `time``any`(任何时间)/`day`(白天)/`night`(晚上)
- `_1d_foods`:每天刷新食材列表
- `_3d_foods`3天刷新食材列表
- `_7d_foods`:每周刷新食材列表
### 3. 参数说明
- `page`: 商店总页数
- `time`: 商人出现时间
- `any`: 全天出现
- `day`: 白天出现
- `night`: 晚上出现
- `path`: 路径文件位置
#### 3. 放置相关文件
- 食材图片:`assets/images/新食材.png`
- 路径文件:`assets/path/国家-地区-NPC名称.json`
### 4. 更新商人与商品支持表
将新商人添加到本文件的商人与商品支持表中。
#### 4. 测试验证
1. 重新加载脚本设置
2. 勾选新食材
3. 运行脚本测试购买流程
4. 检查日志确认执行成功
## ❓ 常见问题
### 注意事项
- NPC名称需与路径文件名称对应
- 食材名称需与foods.json中的name一致
- 首次添加建议开启调试模式检查
### Q: 脚本不购买任何商品?
A: 检查:
1. 是否在设置中填写了要购买的商品
2. 商品名称是否正确(参考上方表格)
3. 游戏分辨率是否为 1920×1080
4. 角色是否在单人模式
5. 是否有购买记录导致商品未刷新
### Q: 如何知道支持哪些商品名称?
A: 查看:
1. 本文件中的"商人与商品支持表"
2. `assets/data/foods.json` 文件中的 `name` 字段
3. 运行脚本时的日志输出会显示"用户启用了以下食材"
## 常见问题
### Q: 为什么跳过某些商人?
A: 可能原因:
1. 该商人没有你要购买的商品
2. 商人在禁用列表中
3. 购买记录显示商品还未到刷新时间
### 1. 脚本不购买食材
- 检查游戏是否在主界面
- 确认解析度设定正确1920×1080
- 检查NPC是否在正确时间出现白天/晚上)
- 查看是否有足够的摩拉
### Q: 如何重置购买记录?
A: 有几种方法:
1. 启用"无视购买记录强制购买"选项
2. 删除 `record/你的账号名/records.json` 文件
3. 等待商品自然刷新
### 2. 记录不更新
- 检查`record/账号名/records.json`文件权限
- 开启调试模式查看详细日志
### Q: 每天什么时候刷新?
A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间点:
- 如果当前时间在4点前视为前一天
- 购买记录基于4点刷新时间计算
### 3. 图片识别失败
- 确认图片尺寸为90×90
- 检查图片路径是否正确
- 尝试重新截图
## 📝 注意事项
### 4. 路径执行失败
- 确认路径文件存在
- 检查NPC是否被障碍物阻挡
- 尝试重新录制路径
## 记录系统
脚本会自动记录购买时间,保存在`record/账号名/records.json`
```json
[
{
"npcname": "布兰琪",
"1d": ["盐", "胡椒", "洋葱"],
"1d_time": "2024-12-10T04:00:00+08:00",
"3d": [],
"3d_time": null,
"7d": [],
"7d_time": null
}
]
```
## 注意事项
1. 脚本运行时不要操作游戏
2. 确保背包有足够空间
3. 每个NPC购买完成后会返回主界面
4. 脚本会自动调整游戏时间(白天/晚上)
5. 每周食材购买日设置后只在指定日期购买4. 逐一添加食材测试
1. **游戏时间**:脚本会自动调整白天/晚上时间
2. **背包空间**:确保有足够空间购买商品
3. **摩拉**:确保有足够的摩拉
4. **记录系统**:购买记录保存在 `record/账号名/` 目录下
5. **多人模式**:脚本只能在单人模式下运行
6. **刷新时间**基于游戏服务器时间GMT+8每天4点刷新
## 🤝 贡献指南
欢迎提交新的食材配置!请遵循以下格式:
欢迎提交新的商人和商品配置!
1. **提交新的NPC**:包含路径文件和图片
2. **提交新的食材**:包含图片和设定
3. **问题回报**:提供详细的重现步骤和日志
1. **提交新的商人**:包含路径文件和商人数据
2. **提交新的商品**:包含图片和商品数据
3. **更新文档**记得更新本README中的商人信息表
4. **问题反馈**:提供详细的重现步骤和日志
---
> 注意:本脚本仅供学习与研究使用,请遵守游戏使用条款。
> 注意:本脚本仅供学习与研究使用,请遵守游戏使用条款。
```

View File

@@ -119,10 +119,10 @@
"name": "沉玉仙茗",
"file": "assets/images/沉玉仙茗.png"
},
"青蜜": {
"id": "青蜜",
"name": "青蜜",
"file": "assets/images/青蜜.png"
"青蜜": {
"id": "青蜜",
"name": "青蜜",
"file": "assets/images/青蜜.png"
},
"苦种": {
"id": "苦种",
@@ -163,11 +163,20 @@
"id": "黑麦",
"name": "黑麦",
"file": "assets/images/黑麦.png"
}
,
"絶云椒椒": {
"id": "云椒椒",
"name": "絶云椒椒",
"file": "assets/images/絶云椒椒.png"
},
"绝云椒椒": {
"id": "绝云椒椒",
"name": "云椒椒",
"file": "assets/images/绝云椒椒.png"
},
"微光角菌": {
"id": "微光角菌",
"name": "微光角菌",
"file": "assets/images/微光角菌.png"
},
"琉鳞石": {
"id": "琉鳞石",
"name": "琉鳞石",
"file": "assets/images/琉鳞石.png"
}
}

View File

@@ -38,7 +38,7 @@
"time": "any",
"path": "assets/path/璃月-璃月港-卯师父.json",
"_1d_foods": ["鱼肉", "螃蟹"],
"_3d_foods": ["胡萝卜", "松茸", "云椒椒"]
"_3d_foods": ["胡萝卜", "松茸", "云椒椒"]
},
"UncleSun": {
"name": "老孙",
@@ -78,7 +78,7 @@
"page": 2,
"time": "any",
"path": "assets/path/璃月-遗珑埠-丰泰.json",
"_3d_foods": ["沉玉仙茗", "琉璃袋", "云椒椒"],
"_3d_foods": ["沉玉仙茗", "琉璃袋", "云椒椒"],
"_7d_foods": ["蟹黃"]
},
"连芳": {
@@ -95,7 +95,7 @@
"page": 1,
"time": "any",
"path": "assets/path/稻妻-离岛-小畑.json",
"_1d_foods": ["螃蟹"]
"_1d_foods": ["螃蟹","鱼肉", "虾仁"]
},
"Aoi": {
"name": "葵",
@@ -229,7 +229,7 @@
"page": 1,
"time": "any",
"path": "assets/path/纳塔-圣火竞技场-钦特利.json",
"_3d_foods": ["青蜜", "苦种"]
"_3d_foods": ["青蜜", "苦种"]
},
"夏安卡": {
"name": "夏安卡",
@@ -256,5 +256,16 @@
"path": "assets/path/挪德卡莱-那夏镇-采若.json",
"_1d_foods": ["黑麦", "盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦"]
}
,
"科菲策": {
"name": "科菲策",
"enable": true,
"page": 1,
"time": "any",
"path": "assets/path/挪德卡莱-皮拉米达城-科菲策.json",
"_1d_foods": ["牛奶", "咖啡豆"],
"_3d_foods": ["微光角菌", "琉鳞石"]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,58 @@
{
"info": {
"authors": [
{
"links": "",
"name": "蜜柑魚"
}
],
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1768924602203,
"map_match_method": "SIFT",
"map_name": "Teyvat",
"name": "挪德卡莱-皮拉米达城-科菲策",
"tags": [],
"type": "collect",
"version": "1.0"
},
"positions": [
{
"action": "",
"action_params": "",
"id": 1,
"move_mode": "walk",
"type": "teleport",
"x": 9452.2978515625,
"y": 5235.1337890625
},
{
"action": "",
"action_params": "",
"id": 2,
"move_mode": "walk",
"type": "path",
"x": 9435.392578125,
"y": 5236.27099609375
},
{
"action": "",
"action_params": "",
"id": 3,
"move_mode": "walk",
"type": "path",
"x": 9432.2568359375,
"y": 5225.869140625
},
{
"action": "",
"action_params": "",
"id": 4,
"move_mode": "walk",
"type": "target",
"x": 9434.470703125,
"y": 5222.7021484375
}
]
}

View File

@@ -116,18 +116,48 @@ function logConditional(message) {
let foodsData = {};
let npcData = {};
// 存储用户要购买的商品ID集合
let userFoodsToBuy = new Set();
async function loadExternalData() {
try {
// 加载食材数据
// 加载商品数据
const foodsContent = await file.readText("assets/data/foods.json");
foodsData = JSON.parse(foodsContent);
logConditional(`已加载食材数据: ${Object.keys(foodsData).length}食材`);
logConditional(`已加载商品数据: ${Object.keys(foodsData).length}商品`);
// 加载NPC数据
const npcsContent = await file.readText("assets/data/npcs.json");
npcData = JSON.parse(npcsContent);
logConditional(`已加载NPC数据: ${Object.keys(npcData).length} 个NPC`);
// 解析用户要购买的商品列表
const foodsInput = (settings.foodsToBuy || "").trim();
if (foodsInput) {
const foodNames = foodsInput.split(/\s+/);
const enabledFoodsList = [];
for (const foodName of foodNames) {
// 查找商品对应的ID
const foodEntry = Object.values(foodsData).find(
food => food.name === foodName || food.id === foodName
);
if (foodEntry) {
userFoodsToBuy.add(foodEntry.id);
enabledFoodsList.push(foodEntry.name); // 保存商品名称用于显示
} else {
log.warn(`未找到商品: ${foodName}`);
}
}
// 输出用户启用的商品列表
if (enabledFoodsList.length > 0) {
log.info(`用户启用了下列商品:${enabledFoodsList.join(", ")}`);
} else {
log.warn("用户未启用任何商品");
}
} else {
log.warn("用户未指定要购买的商品");
}
return true;
} catch (error) {
log.error(`加载外部数据失败: ${error.message}`);
@@ -135,6 +165,34 @@ async function loadExternalData() {
}
}
// ==================== 辅助函数:过滤用户要购买的商品 ====================
function filterUserFoods(foodList) {
if (!foodList || !Array.isArray(foodList)) {
return [];
}
return foodList.filter(food => {
// 查找商品对应的ID
const foodEntry = Object.values(foodsData).find(
f => f.name === food || f.id === food
);
if (!foodEntry) {
if (recordDebug) {
log.info(`[调试] 商品列表中未找到: ${food}`);
}
return false;
}
// 检查是否在用户要购买的商品集合中
const shouldBuy = userFoodsToBuy.has(foodEntry.id);
if (recordDebug && shouldBuy) {
log.info(`[调试] 用户选择购买: ${foodEntry.name} (ID: ${foodEntry.id})`);
}
return shouldBuy;
});
}
// ==================== 辅助函数获取调整后的星期几1-7周一为1 ====================
function getAdjustedDayOfWeek() {
const now = new Date();
@@ -190,10 +248,10 @@ let followSystem = false;
if (AKFValue === 0) {
// 0 表示跟随系统判定
followSystem = true;
log.info("7天食材购买: 跟随系统判定");
log.info("7天商品购买: 跟随系统判定");
} else {
AFKDay = AKFValue === 7 ? 0 : AKFValue;
log.info(`7天食材购买: 每周${AFKDay === 0 ? "日" : AFKDay}购买`);
log.info(`7天商品购买: 每周${AFKDay === 0 ? "日" : AFKDay}购买`);
}
// 获取账号记录路径
@@ -294,26 +352,26 @@ function updateNpcRecord(records, npcName, refreshType, purchasedItems) {
// 3天商品基于基准日的3天周期计算
// 基准时间2025-08-09 04:00 GMT+8 (转换为本地时间)
const baseTime = new Date(2025, 7, 9, 4, 0, 0); // 2025-08-09 04:00
// 调整当前时间到4点基准
const adjustedNow = new Date(now);
if (adjustedNow.getHours() < 4) {
adjustedNow.setDate(adjustedNow.getDate() - 1);
}
adjustedNow.setHours(4, 0, 0, 0);
// 计算距离基准日的天数
const timeDiff = adjustedNow.getTime() - baseTime.getTime();
const daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24));
// 计算当前3天周期
const currentPeriod = Math.floor(daysDiff / 3);
// 下一个3天周期的开始时间
const nextPeriod = currentPeriod + 1;
refreshTime = new Date(baseTime);
refreshTime.setDate(baseTime.getDate() + (nextPeriod * 3));
// 确保刷新时间是04:00
refreshTime.setHours(4, 0, 0, 0);
} else if (refreshType === "7d") {
@@ -372,15 +430,15 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) {
if (forceRefresh) {
// 强制刷新,但只购买已启用的商品
if (npc._1d_foods) foodsToBuy["1d"] = filterEnabledFoods(npc._1d_foods);
if (npc._3d_foods) foodsToBuy["3d"] = filterEnabledFoods(npc._3d_foods);
if (npc._7d_foods) foodsToBuy["7d"] = filterEnabledFoods(npc._7d_foods);
if (npc._1d_foods) foodsToBuy["1d"] = filterUserFoods(npc._1d_foods);
if (npc._3d_foods) foodsToBuy["3d"] = filterUserFoods(npc._3d_foods);
if (npc._7d_foods) foodsToBuy["7d"] = filterUserFoods(npc._7d_foods);
return foodsToBuy;
}
// 1天商品逻辑
if (npc._1d_foods) {
const enabledFoods = filterEnabledFoods(npc._1d_foods);
const enabledFoods = filterUserFoods(npc._1d_foods);
if (enabledFoods.length > 0) {
if (!npcRecord || !npcRecord["1d_time"]) {
// 没有记录,需要购买已启用的商品
@@ -401,7 +459,7 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) {
// 3天商品逻辑
if (npc._3d_foods) {
const enabledFoods = filterEnabledFoods(npc._3d_foods);
const enabledFoods = filterUserFoods(npc._3d_foods);
if (enabledFoods.length > 0) {
if (!npcRecord || !npcRecord["3d_time"]) {
// 没有记录,直接购买
@@ -428,7 +486,7 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) {
// 7天商品逻辑
if (npc._7d_foods) {
const enabledFoods = filterEnabledFoods(npc._7d_foods);
const enabledFoods = filterUserFoods(npc._7d_foods);
if (enabledFoods.length > 0) {
if (!npcRecord || !npcRecord["7d_time"]) {
// 没有记录,直接购买
@@ -472,22 +530,6 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) {
return foodsToBuy;
}
// ==================== 新增函数:过滤已启用的食材 ====================
function filterEnabledFoods(foodList) {
if (!foodList || !Array.isArray(foodList)) {
return [];
}
return foodList.filter(food => {
// 检查食材是否在 settings 中被启用
const foodId = translationList[food] || food;
return settings[foodId] === true;
});
}
const translationList = {};
const enableFoods = new Set([]);
const othrtRo = {
"buy": {
"name": "购买按钮",
@@ -831,27 +873,27 @@ async function buyFoods(npcName, npcRecords, currentPeriod) {
if (recordDebug) {
log.info(`[调试] 尝试购买: ${item}`);
}
// 将中文食材名转换为对应的英文ID
// 查找商品对应的ID支持中文名和英文ID
let foodId = null;
// 首先在translationList中查找中文名->英文ID
if (translationList[item]) {
foodId = translationList[item];
} else {
// 如果没有找到直接在foodsData中查找是否有中文键
foodId = Object.keys(foodsData).find(key =>
foodsData[key].name === item || foodsData[key].id === item
);
let foodName = item;
// 直接在foodsData中查找
for (const [id, food] of Object.entries(foodsData)) {
if (food.name === item || food.id === item) {
foodId = id;
foodName = food.name;
break;
}
}
if (!foodId) {
log.warn(`未找到食材 "${item}" 的识别数据,跳过`);
log.warn(`未找到商品 "${item}" 的识别数据,跳过`);
continue;
}
if (!foodsData[foodId] || !foodsData[foodId].ro) {
log.warn(`食材 "${item}" (ID: ${foodId}) 未启用或没有识别对象,跳过`);
log.warn(`商品 "${foodName}" (ID: ${foodId}) 未启用或没有识别对象,跳过`);
continue;
}
@@ -907,7 +949,7 @@ async function buyFoods(npcName, npcRecords, currentPeriod) {
}
}
}
if (purchasedFoods.length > 0) {
log.info(`${npc.name} 购买完成,成功购买: ${purchasedFoods.join(", ")}`);
} else {
@@ -959,17 +1001,14 @@ async function initNpcData(records) {
// 加载识别对象
async function initRo() {
try {
// 加载识别对象
// 加载识别对象 - 只加载用户选择的商品
for (let [key, item] of Object.entries(foodsData)) {
// 填充中英文对照表
translationList[item.name] = item.id;
// 判断启动商品、加载识别对象
if (settings[item.id]) {
enableFoods.add(item.id);
// 判断是否在用户选择的商品中
if (userFoodsToBuy.has(item.id)) {
item.ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync(item.file));
item.ro.Threshold = 0.75;
item.ro.Use3Channels = true;
logConditional(`已启用食材: ${item.name} (${item.id})`);
logConditional(`已启用商品: ${item.name} (${item.id})`);
}
}
// 加载其他识别对象
@@ -978,7 +1017,7 @@ async function initRo() {
item.ro.Threshold = 0.85;
}
logConditional(`总共启用了 ${enableFoods.size}食材`);
logConditional(`总共启用了 ${userFoodsToBuy.size}商品`);
return true;
}
catch (error) {
@@ -992,22 +1031,22 @@ async function initRo() {
// ==================== 初始化账号 ====================
log.info(`当前账户: ${userName}`);
// ==================== 加载外部数据 ====================
// ==================== 加载外部数据 ====================
if (!await loadExternalData()) {
log.error("食材或NPC数据加载失败脚本终止");
log.error("商品或NPC数据加载失败脚本终止");
return;
}
// ==================== 初始化识别对象 ====================
await initRo();
logConditional("识别对象初始化完成");
// ==================== 加载NPC购买记录 ====================
let npcRecords = await loadNpcRecords();
logConditional(`已加载 ${npcRecords.length} 个NPC的购买记录`);
if (recordDebug && npcRecords.length > 0) {
log.info("[调试] 当前NPC记录:");
npcRecords.forEach(record => {
@@ -1083,7 +1122,7 @@ async function initRo() {
}
}
log.info("=== 食材购买脚本执行完成 ===");
log.info("=== 商品购买脚本执行完成 ===");
} catch (error) {
log.error(`执行时发生错误: ${error.message}`);

View File

@@ -1,8 +1,8 @@
{
"manifest_version": 1,
"name": "自动购买每天&3天&每周刷新食材",
"version": "2.0.0",
"description": "自动购买每天&3天&每周刷新食材\n每天刷新食材:自动购买食材\n3天刷新食材:未到刷新日不购买该食材\n每周刷新食材:可指定每周购买食材",
"name": "自动购买每天&3天&每周刷新商品",
"version": "3.0.0",
"description": "自动购买每天&3天&每周刷新商品\n每天刷新商品:自动购买商品\n3天刷新商品:未到刷新日不购买该商品\n每周刷新商品:可指定每周购买商品",
"authors": [
{
"name": "蜜柑魚",
@@ -10,7 +10,7 @@
}
],
"tags": [
"购买食材",
"购买商品",
"模拟点击"
],
"saved_files": [

View File

@@ -6,219 +6,15 @@
"default": "默认账户"
},
{
"name": "ignoreRecords",
"type": "checkbox",
"label": "-----------------\n无视记录强制购买不推荐",
"default": false
},
{
"name": "recordDebug",
"type": "checkbox",
"label": "记录调试模式(显示详细日志)",
"default": false
},
{
"name": "disabledNpcs",
"name": "foodsToBuy",
"type": "input-text",
"label": "禁用 NPC\n多個NPC以空格隔)",
"default": "阿扎莱 皮托"
},
{
"name": "圣水",
"type": "checkbox",
"label": "每天刷新食材\n\n圣水",
"default": false
},
{
"name": "crab",
"type": "checkbox",
"label": "螃蟹",
"default": false
},
{
"name": "salt",
"type": "checkbox",
"label": "盐",
"default": false
},
{
"name": "pepper",
"type": "checkbox",
"label": "胡椒",
"default": false
},
{
"name": "onion",
"type": "checkbox",
"label": "洋葱",
"default": false
},
{
"name": "milk",
"type": "checkbox",
"label": "牛奶",
"default": false
},
{
"name": "tomato",
"type": "checkbox",
"label": "番茄",
"default": false
},
{
"name": "potato",
"type": "checkbox",
"label": "土豆",
"default": false
},
{
"name": "wheat",
"type": "checkbox",
"label": "小麦",
"default": false
},
{
"name": "rice",
"type": "checkbox",
"label": "稻米",
"default": false
},
{
"name": "shrimp",
"type": "checkbox",
"label": "虾仁",
"default": false
},
{
"name": "almond",
"type": "checkbox",
"label": "杏仁",
"default": false
},
{
"name": "cabbage",
"type": "checkbox",
"label": "卷心菜",
"default": false
},
{
"name": "tofu",
"type": "checkbox",
"label": "豆腐",
"default": false
},
{
"name": "fish",
"type": "checkbox",
"label": "鱼肉",
"default": false
},
{
"name": "coffeeBeans",
"type": "checkbox",
"label": "咖啡豆",
"default": false
},
{
"name": "glabrousBeans",
"type": "checkbox",
"label": "秃秃豆",
"default": false
},
{
"name": "rawMeat",
"type": "checkbox",
"label": "兽肉",
"default": false
},
{
"name": "fermentedJuice",
"type": "checkbox",
"label": "发酵果实汁",
"default": false
},
{
"name": "黑麦",
"type": "checkbox",
"label": "黑麦",
"default": false
},
{
"name": "松茸",
"type": "checkbox",
"label": "-----------------\n3天刷新食材\n\n松茸",
"default": false
},
{
"name": "huMengbu",
"type": "checkbox",
"label": "胡萝卜",
"default": false
},
{
"name": "沉玉仙茗",
"type": "checkbox",
"label": "沉玉仙茗",
"default": false
},
{
"name": "清心",
"type": "checkbox",
"label": "清心",
"default": false
},
{
"name": "琉璃袋",
"type": "checkbox",
"label": "琉璃袋",
"default": false
},
{
"name": "viola",
"type": "checkbox",
"label": "堇瓜",
"default": false
},
{
"name": "Padisarah",
"type": "checkbox",
"label": "帕蒂沙兰",
"default": false
},
{
"name": "romaritimeFlower",
"type": "checkbox",
"label": "海露花",
"default": false
},
{
"name": "tidalga",
"type": "checkbox",
"label": "汐藻",
"default": false
},
{
"name": "苦种",
"type": "checkbox",
"label": "苦种",
"default": false
},
{
"name": "青蜜梅",
"type": "checkbox",
"label": "青蜜梅",
"default": false
},
{
"name": "絶云椒椒",
"type": "checkbox",
"label": "絶云椒椒",
"default": false
"label": "要购买的商品(多个商品用空格隔)\n示例\"小麦 黑麦\"\n支援的 商人与商品详细 请前往 README.md 查看",
"default": "小麦 黑麦"
},
{
"name": "AKF",
"type": "select",
"label": "-----------------\n每周刷新食材\n\n可选购买方式\n0=跟随系统周期自动判定\n1-7=指定星期几购买(1=周一,7=周日)",
"label": "每周商品购买方式\n0=跟随系统周期自动判定\n1-7=指定星期几购买(1=周一,7=周日)",
"options": [
"0",
"1",
@@ -232,9 +28,21 @@
"default": "0"
},
{
"name": "蟹黃",
"name": "disabledNpcs",
"type": "input-text",
"label": "要禁用的NPC\n多个NPC用空格分隔\n示例阿扎莱 皮托",
"default": "阿扎莱 皮托"
},
{
"name": "ignoreRecords",
"type": "checkbox",
"label": "蟹黃",
"label": "-----------------\n无视记录强制购买不推荐",
"default": false
},
{
"name": "recordDebug",
"type": "checkbox",
"label": "记录调试模式(显示详细日志)",
"default": false
}
]

View File

@@ -0,0 +1,41 @@
## 📋 商人与商品支持表
### 如何查看支持的商品?
- **查看本文件下方表格**:包含所有支持的商人与商品
- **查看`assets/data/foods.json`**:所有商品的中文名称
### 商人信息总览
| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 备注 |
|--------|--------|-------------|------------|-------------|------|
| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | 白天出现 |
| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | 晚上出现 |
| 蒙德-蒙德城 | 莎拉 | - | - | 蟹黄 | - |
| 璃月-璃月港 | 东升 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁、盐、胡椒、番茄 | - | - | |
| 璃月-璃月港 | 卯师父 | 鱼肉、螃蟹 | 胡萝卜、松茸、绝云椒椒 | - | |
| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | 白天出现 |
| 璃月-璃月港 | 老高 | 鱼肉 | - | - | |
| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋 | - | 晚上出现 |
| 璃月-望舒客栈 | 菲尔戈黛特 | - | 松茸、琉璃袋 | - | |
| 璃月-遗珑埠 | 丰泰 | - | 沉玉仙茗、琉璃袋、绝云椒椒 | 蟹黄 | |
| 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | |
| 稻妻-离岛 | 小畑 | 螃蟹、鱼肉、虾仁 | - | - | |
| 稻妻-稻妻城 | 葵 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、盐、胡椒、番茄 | - | - | |
| 稻妻-稻妻城 | 志村勘兵卫 | 鱼肉、螃蟹 | 堇瓜 | - | |
| 稻妻-海祇岛 | 清子 | - | - | 牛奶、番茄、土豆、小麦、豆腐 | |
| 须弥-须弥城 | 朱特 | - | 帕蒂沙兰 | - | |
| 须弥-奥摩斯港 | 布特罗斯 | 鱼肉、螃蟹、虾仁 | - | - | |
| 须弥-须弥城 | 珀姆 | 鱼肉、螃蟹、虾仁 | - | - | |
| 须弥-须弥城 | 哈马维 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、盐、胡椒、番茄 | - | - | |
| 须弥-须弥城 | 兰巴德 | 鱼肉、螃蟹 | - | - | 独立地图 |
| 须弥-须弥城 | 恩忒卡 | 咖啡豆 | - | - | 独立地图 |
| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | - | - | 晚上出现 |
| 须弥-奥摩斯港 | 巴巴克 | - | 清心、琉璃袋 | - | |
| 枫丹-枫丹廷 | 布希柯 | 枫达、洋葱、牛奶、卷心菜、土豆、小麦、秃秃豆、杏仁、发酵果实汁、盐、胡椒、番茄 | - | - | |
| 枫丹-枫丹廷 | 阿鲁埃 | 咖啡豆、枫达 | - | - | |
| 枫丹-白淞镇 | 安特曼 | 鱼肉、螃蟹 | 海露花、汐藻 | - | |
| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | |
| 纳塔-圣火竞技场 | 钦特利 | - | 青蜜莓、苦种 | - | |
| 纳塔-圣火竞技场 | 夏安卡 | - | - | 蟹黄 | |
| 纳塔-圣火竞技场 | 布纳马 | 盐、胡椒、小麦、洋葱、牛奶、番茄、卷心菜、土豆、秃秃豆 | - | - | |
| 挪德卡莱-那夏镇 | 采若 | 黑麦、盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | |
| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | |

View File

@@ -0,0 +1,36 @@
商人信息表
| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 备注 |
|--------|--------|-------------|------------|-------------|------|
| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | 白天出现 |
| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | 晚上出现 |
| 蒙德-蒙德城 | 莎拉 | - | - | 蟹黄 | - |
| 璃月-璃月港 | 东升 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁、盐、胡椒、番茄 | - | - | |
| 璃月-璃月港 | 卯师父 | 鱼肉、螃蟹 | 胡萝卜、松茸、绝云椒椒 | - | |
| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | 白天出现 |
| 璃月-璃月港 | 老高 | 鱼肉 | - | - | |
| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋 | - | 晚上出现 |
| 璃月-望舒客栈 | 菲尔戈黛特 | - | 松茸、琉璃袋 | - | |
| 璃月-遗珑埠 | 丰泰 | - | 沉玉仙茗、琉璃袋、绝云椒椒 | 蟹黄 | |
| 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | |
| 稻妻-离岛 | 小畑 | 螃蟹、鱼肉、虾仁 | - | - | |
| 稻妻-稻妻城 | 葵 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、盐、胡椒、番茄 | - | - | |
| 稻妻-稻妻城 | 志村勘兵卫 | 鱼肉、螃蟹 | 堇瓜 | - | |
| 稻妻-海祇岛 | 清子 | - | - | 牛奶、番茄、土豆、小麦、豆腐 | |
| 须弥-须弥城 | 朱特 | - | 帕蒂沙兰 | - | |
| 须弥-奥摩斯港 | 布特罗斯 | 鱼肉、螃蟹、虾仁 | - | - | |
| 须弥-须弥城 | 珀姆 | 鱼肉、螃蟹、虾仁 | - | - | |
| 须弥-须弥城 | 哈马维 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、盐、胡椒、番茄 | - | - | |
| 须弥-须弥城 | 兰巴德 | 鱼肉、螃蟹 | - | - | 独立地图 |
| 须弥-须弥城 | 恩忒卡 | 咖啡豆 | - | - | 独立地图 |
| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | - | - | 晚上出现 |
| 须弥-奥摩斯港 | 巴巴克 | - | 清心、琉璃袋 | - | |
| 枫丹-枫丹廷 | 布希柯 | 枫达、洋葱、牛奶、卷心菜、土豆、小麦、秃秃豆、杏仁、发酵果实汁、盐、胡椒、番茄 | - | - | |
| 枫丹-枫丹廷 | 阿鲁埃 | 咖啡豆、枫达 | - | - | |
| 枫丹-白淞镇 | 安特曼 | 鱼肉、螃蟹 | 海露花、汐藻 | - | |
| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | |
| 纳塔-圣火竞技场 | 钦特利 | - | 青蜜莓、苦种 | - | |
| 纳塔-圣火竞技场 | 夏安卡 | - | - | 蟹黄 | |
| 纳塔-圣火竞技场 | 布纳马 | 盐、胡椒、小麦、洋葱、牛奶、番茄、卷心菜、土豆、秃秃豆 | - | - | |
| 挪德卡莱-那夏镇 | 采若 | 黑麦、盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | |
| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | |