JS : 自动购买每天&3天&每周刷新食材 改名 商品& 3.1.0 (#2754)

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

* JS : 自动购买每天&3天&每周刷新食材 改名 商品& 3.1.0

改名
增加禁用tag功能
修正部份商品名稱
修改說明
璃月-璃月港-老高,支援買完兩種魚
This commit is contained in:
this-Fish
2026-01-21 15:48:34 +08:00
committed by GitHub
parent d3073e20de
commit 921f8c87aa
77 changed files with 239 additions and 167 deletions

View File

@@ -1,10 +1,40 @@
# 自动购买商品 - 使用说明
# 自动购买每天&3天&每周刷新食材 - 使用说明
## 🚀 快速开始
## 📝 功能说明
### 1. 基本设置
这个脚本可以自动购买原神游戏中各个商人的食材,支持三种刷新周期:
- **每天刷新食材**每天凌晨4点刷新
- **3天刷新食材**每3天刷新一次
- **每周刷新食材**:每周刷新,可指定购买日
- **记录系统**:避免重复购买,只购买刷新后的商品
- **标签系统**:支持按标签批量禁用商人
## ⚡ 快速开始
### 1. 准备工作 & 注意事项
1. **游戏分辨率**1920×1080 解析度**
2. **游戏时间**:脚本会自动调整白天/晚上时间
3. **背包空间**:确保有足够空间购买商品
4. **摩拉**:确保有足够的摩拉
5. **记录系统**:购买记录保存在 `record/账号名/` 目录下
6. **多人模式**:脚本只能在单人模式下运行
7. **刷新时间**基于游戏服务器时间GMT+8每天4点刷新
### 2. 首次使用
1. 打开脚本设置界面
2. 输入要购买的食材
3. 设置每周食材购买模式
4. 设置要禁用的NPC或标签
5. 保存设置
6. 在主界面运行脚本
## ⚙️ 设置说明
1. **账号名**:填写账号名,用于区分不同账号的购买记录
2. **要购买的商品**:输入商品名称,用空格分隔(支援的商人与商品请查看下方表格)
- 建议直接复制商品名称贴上输入栏
```
示例:盐 胡椒 螃蟹 圣水 松茸 沉玉仙茗 蟹黄
```
@@ -15,24 +45,27 @@
```
示例:阿扎莱 皮托
```
5. **无视购买记录强制购买**:开启后会忽略购买记录,重新购买所有商品
6. **调试模式**:开启后显示详细执行日志
5. **禁用标签功能**:可以输入要禁用的标签(空格分隔),如:
```
示例:黑心商人 挪德卡莱
```
禁用后脚本会跳过这些NPC或带有指定标签的NPC不会前往购买。
可以使用国家/地区(如"蒙德"、"璃月")或其他标签(如商人信息总览中的标签)
6. **无视购买记录强制购买**:开启后会忽略购买记录,重新购买所有商品
7. **调试模式**:开启后显示详细执行日志
### 2. 智能购买记录系统
### 购买记录系统说明
脚本会自动记录购买时间,避免重复购买:
- **每天商品**购买后24小时凌晨4点刷新
- **3天商品**:购买后3天刷新
- **每周商品**购买后7天刷新可设置购买日
1. **每天刷新食材** - 每天凌晨4点刷新
2. **3天刷新食材** - 每3天刷新一次
3. **每周刷新食材** - 每周固定週一购买
购买记录保存在:`record/你填的账号名/records.json`
- 下次执行时只购买已刷新商品
- 可通过"无视购买记录强制购买"选项重置
### 3. 运行脚本
1. 确保游戏分辨率设置为 **1920×1080**
2. 游戏角色需在单人模式
3. 确保有足够的摩拉和背包空间
4. 运行脚本即可自动购买
## 📋 商人与商品支持表
@@ -41,16 +74,16 @@
- **查看`assets/data/foods.json`**:所有商品的中文名称
### 商人信息总览
| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 备注 |
| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 标签 |
|--------|--------|-------------|------------|-------------|------|
| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | 白天出现 |
| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | 晚上出现 |
| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | |
| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | |
| 蒙德-蒙德城 | 莎拉 | - | - | 蟹黄 | - |
| 璃月-璃月港 | 东升 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁、盐、胡椒、番茄 | - | - | |
| 璃月-璃月港 | 卯师父 | 鱼肉、螃蟹 | 胡萝卜、松茸、绝云椒椒 | - | |
| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | 白天出现 |
| 璃月-璃月港 | 老高 | 鱼肉 | - | - | |
| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋 | - | 晚上出现 |
| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | |
| 璃月-璃月港 | 老高 | 鱼肉、鱼肉2 | - | - | |
| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋 | - | |
| 璃月-望舒客栈 | 菲尔戈黛特 | - | 松茸、琉璃袋 | - | |
| 璃月-遗珑埠 | 丰泰 | - | 沉玉仙茗、琉璃袋、绝云椒椒 | 蟹黄 | |
| 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | |
@@ -64,17 +97,22 @@
| 须弥-须弥城 | 哈马维 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、盐、胡椒、番茄 | - | - | |
| 须弥-须弥城 | 兰巴德 | 鱼肉、螃蟹 | - | - | 独立地图 |
| 须弥-须弥城 | 恩忒卡 | 咖啡豆 | - | - | 独立地图 |
| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | - | - | 晚上出现 |
| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | - | - | 黑心商人 |
| 须弥-奥摩斯港 | 巴巴克 | - | 清心、琉璃袋 | - | |
| 枫丹-枫丹廷 | 布希柯 | 枫达、洋葱、牛奶、卷心菜、土豆、小麦、秃秃豆、杏仁、发酵果实汁、盐、胡椒、番茄 | - | - | |
| 枫丹-枫丹廷 | 阿鲁埃 | 咖啡豆、枫达 | - | - | |
| 枫丹-白淞镇 | 安特曼 | 鱼肉、螃蟹 | 海露花、汐藻 | - | |
| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | |
| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | 黑心商人 |
| 纳塔-圣火竞技场 | 钦特利 | - | 青蜜莓、苦种 | - | |
| 纳塔-圣火竞技场 | 夏安卡 | - | - | 蟹黄 | |
| 纳塔-圣火竞技场 | 布纳马 | 盐、胡椒、小麦、洋葱、牛奶、番茄、卷心菜、土豆、秃秃豆 | - | - | |
| 挪德卡莱-那夏镇 | 采若 | 黑麦、盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | |
| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | |
| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | 黑心商人 |
- 独立地图:指需要进入独立空间的特殊地图,这些地图部份路径无法使用地图追踪功能
- 黑心商人:指没有折扣的商人,价格较贵的商人
### **标签系统尚未完全添加,欢迎补充标签**
## 🔧 添加新商品
@@ -125,7 +163,8 @@
"path": "assets/path/地区-位置-新商人名.json",
"_1d_foods": ["商品1", "商品2"], // 每天刷新
"_3d_foods": ["商品3"], // 3天刷新
"_7d_foods": ["商品4"] // 每周刷新
"_7d_foods": ["商品4"], // 每周刷新
"tags": ["地区", "黑心商人"] // 商人标签
}
```
@@ -133,8 +172,8 @@
- `page`: 商店的总页数
- `time`: 商人出现时间
- `any`: 全天出现
- `day`: 白天出现
- `night`: 晚上出现
- `day`:
- `night`:
- `path`: 路径文件位置
### 4. 更新商人与商品支持表
@@ -173,15 +212,6 @@ A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间
- 如果当前时间在4点前视为前一天
- 购买记录基于4点刷新时间计算
## 📝 注意事项
1. **游戏时间**:脚本会自动调整白天/晚上时间
2. **背包空间**:确保有足够空间购买商品
3. **摩拉**:确保有足够的摩拉
4. **记录系统**:购买记录保存在 `record/账号名/` 目录下
5. **多人模式**:脚本只能在单人模式下运行
6. **刷新时间**基于游戏服务器时间GMT+8每天4点刷新
## 🤝 贡献指南
欢迎提交新的商人和商品配置!
@@ -189,9 +219,10 @@ A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间
1. **提交新的商人**:包含路径文件和商人数据
2. **提交新的商品**:包含图片和商品数据
3. **更新文档**记得更新本README中的商人信息表
4. **问题反馈**提供详细的重现步骤和日志
4. **标签补充**欢迎为现有NPC添加合适的标签
5. **问题反馈**:提供详细的重现步骤和日志
---
> 注意:本脚本仅供学习与研究使用,请遵守游戏使用条款。
```
``

View File

@@ -89,6 +89,11 @@
"name": "鱼肉",
"file": "assets/images/fish.png"
},
"fish2": {
"id": "fish",
"name": "鱼肉2",
"file": "assets/images/fish.png"
},
"huMengbu": {
"id": "huMengbu",
"name": "胡萝卜",
@@ -139,10 +144,10 @@
"name": "琉璃袋",
"file": "assets/images/琉璃袋.png"
},
"蟹": {
"id": "蟹",
"name": "蟹",
"file": "assets/images/蟹.png"
"蟹": {
"id": "蟹",
"name": "蟹",
"file": "assets/images/蟹.png"
},
"crab": {
"id": "crab",

View File

@@ -5,7 +5,8 @@
"page": 2,
"time": "day",
"path": "assets/path/蒙德-清泉镇-神奇的霍普金斯.json",
"_1d_foods": ["圣水"]
"_1d_foods": ["圣水"],
"tags": ["蒙德"]
},
"Blanche": {
"name": "布兰琪",
@@ -13,7 +14,8 @@
"page": 2,
"time": "night",
"path": "assets/path/蒙德-蒙德城-布兰琪.json",
"_1d_foods": ["盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦"]
"_1d_foods": ["盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦"],
"tags": ["蒙德"]
},
"莎拉": {
"name": "莎拉",
@@ -21,7 +23,8 @@
"page": 4,
"time": "night",
"path": "assets/path/蒙德-蒙德城-莎拉.json",
"_7d_foods": ["蟹"]
"_7d_foods": ["蟹"],
"tags": ["蒙德"]
},
"DongSheng": {
"name": "东升",
@@ -29,7 +32,8 @@
"page": 2,
"time": "any",
"path": "assets/path/璃月-璃月港-东升.json",
"_1d_foods": ["洋葱", "牛奶", "卷心菜", "土豆", "小麦", "稻米", "虾仁", "豆腐", "杏仁", "盐", "胡椒", "番茄"]
"_1d_foods": ["洋葱", "牛奶", "卷心菜", "土豆", "小麦", "稻米", "虾仁", "豆腐", "杏仁", "盐", "胡椒", "番茄"],
"tags": ["璃月"]
},
"ChefMao": {
"name": "卯师父",
@@ -38,7 +42,8 @@
"time": "any",
"path": "assets/path/璃月-璃月港-卯师父.json",
"_1d_foods": ["鱼肉", "螃蟹"],
"_3d_foods": ["胡萝卜", "松茸", "绝云椒椒"]
"_3d_foods": ["胡萝卜", "松茸", "绝云椒椒"],
"tags": ["璃月"]
},
"UncleSun": {
"name": "老孙",
@@ -46,7 +51,8 @@
"page": 1,
"time": "day",
"path": "assets/path/璃月-璃月港-老孙.json",
"_1d_foods": ["鱼肉", "螃蟹", "虾仁"]
"_1d_foods": ["鱼肉", "螃蟹", "虾仁"],
"tags": ["璃月"]
},
"UncleGao": {
"name": "老高",
@@ -54,7 +60,8 @@
"page": 1,
"time": "any",
"path": "assets/path/璃月-璃月港-老高.json",
"_1d_foods": ["鱼肉"]
"_1d_foods": ["鱼肉","鱼肉2"],
"tags": ["璃月"]
},
"阿桂": {
"name": "阿桂",
@@ -62,7 +69,8 @@
"page": 2,
"time": "night",
"path": "assets/path/璃月-璃月港-阿桂.json",
"_3d_foods": ["清心", "琉璃袋"]
"_3d_foods": ["清心", "琉璃袋"],
"tags": ["璃月"]
},
"菲尔戈黛特": {
"name": "菲尔戈黛特",
@@ -70,7 +78,8 @@
"page": 2,
"time": "any",
"path": "assets/path/璃月-望舒客栈-菲尔戈黛特.json",
"_3d_foods": ["松茸", "琉璃袋"]
"_3d_foods": ["松茸", "琉璃袋"],
"tags": ["璃月"]
},
"丰泰": {
"name": "丰泰",
@@ -79,7 +88,8 @@
"time": "any",
"path": "assets/path/璃月-遗珑埠-丰泰.json",
"_3d_foods": ["沉玉仙茗", "琉璃袋", "绝云椒椒"],
"_7d_foods": ["蟹"]
"_7d_foods": ["蟹"],
"tags": ["璃月"]
},
"连芳": {
"name": "连芳",
@@ -87,7 +97,8 @@
"page": 2,
"time": "any",
"path": "assets/path/璃月-遗珑埠-连芳.json",
"_3d_foods": ["沉玉仙茗"]
"_3d_foods": ["沉玉仙茗"],
"tags": ["璃月"]
},
"Obata": {
"name": "小畑",
@@ -95,7 +106,8 @@
"page": 1,
"time": "any",
"path": "assets/path/稻妻-离岛-小畑.json",
"_1d_foods": ["螃蟹","鱼肉", "虾仁"]
"_1d_foods": ["螃蟹","鱼肉", "虾仁"],
"tags": ["稻妻"]
},
"Aoi": {
"name": "葵",
@@ -103,7 +115,8 @@
"page": 2,
"time": "any",
"path": "assets/path/稻妻-稻妻城-葵.json",
"_1d_foods": ["洋葱", "牛奶", "卷心菜", "土豆", "小麦", "稻米", "虾仁", "豆腐", "盐", "胡椒", "番茄"]
"_1d_foods": ["洋葱", "牛奶", "卷心菜", "土豆", "小麦", "稻米", "虾仁", "豆腐", "盐", "胡椒", "番茄"],
"tags": ["稻妻"]
},
"ShimuraKanbei": {
"name": "志村勘兵卫",
@@ -112,7 +125,8 @@
"time": "any",
"path": "assets/path/稻妻-稻妻城-志村勘兵卫.json",
"_1d_foods": ["鱼肉", "螃蟹"],
"_3d_foods": ["堇瓜"]
"_3d_foods": ["堇瓜"],
"tags": ["稻妻"]
},
"清子": {
"name": "清子",
@@ -120,7 +134,8 @@
"page": 1,
"time": "any",
"path": "assets/path/稻妻-海祇岛-清子.json",
"_7d_foods": ["牛奶", "番茄", "土豆", "小麦", "豆腐"]
"_7d_foods": ["牛奶", "番茄", "土豆", "小麦", "豆腐"],
"tags": ["稻妻"]
},
"Zhute": {
"name": "朱特",
@@ -128,7 +143,8 @@
"page": 1,
"time": "any",
"path": "assets/path/须弥-须弥城-朱特.json",
"_3d_foods": ["帕蒂沙兰"]
"_3d_foods": ["帕蒂沙兰"],
"tags": ["须弥"]
},
"Butrus": {
"name": "布特罗斯",
@@ -136,8 +152,8 @@
"page": 1,
"time": "any",
"path": "assets/path/须弥-奥摩斯港-布特罗斯.json",
"_1d_foods": ["鱼肉", "螃蟹", "虾仁"]
"_1d_foods": ["鱼肉", "螃蟹", "虾仁"],
"tags": ["须弥"]
},
"Pam": {
"name": "珀姆",
@@ -145,8 +161,8 @@
"page": 1,
"time": "any",
"path": "assets/path/须弥-须弥城-珀姆.json",
"_1d_foods": ["鱼肉", "螃蟹", "虾仁"]
"_1d_foods": ["鱼肉", "螃蟹", "虾仁"],
"tags": ["须弥"]
},
"Hamawi": {
"name": "哈马维",
@@ -154,7 +170,8 @@
"page": 2,
"time": "any",
"path": "assets/path/须弥-须弥城-哈马维.json",
"_1d_foods": ["洋葱", "牛奶", "卷心菜", "土豆", "小麦", "稻米", "虾仁", "豆腐", "盐", "胡椒", "番茄"]
"_1d_foods": ["洋葱", "牛奶", "卷心菜", "土豆", "小麦", "稻米", "虾仁", "豆腐", "盐", "胡椒", "番茄"],
"tags": ["须弥"]
},
"Lambad": {
"name": "兰巴德",
@@ -162,7 +179,8 @@
"page": 3,
"time": "any",
"path": "assets/path/须弥-须弥城-兰巴德酒馆-兰巴德.json",
"_1d_foods": ["鱼肉", "螃蟹"]
"_1d_foods": ["鱼肉", "螃蟹"],
"tags": ["须弥","独立地图"]
},
"Enteka": {
"name": "恩忒卡",
@@ -170,16 +188,17 @@
"page": 2,
"time": "any",
"path": "assets/path/须弥-须弥城-普斯帕咖啡馆-恩忒卡.json",
"_1d_foods": ["咖啡豆"]
}
,
"_1d_foods": ["咖啡豆"],
"tags": ["须弥","独立地图"]
},
"Azalai": {
"name": "阿扎莱",
"enable": true,
"page": 2,
"time": "night",
"path": "assets/path/须弥-阿如村-阿扎莱.json",
"_1d_foods": ["鱼肉", "兽肉", "秃秃豆"]
"_1d_foods": ["鱼肉", "兽肉", "秃秃豆"],
"tags": ["须弥", "黑心商人"]
},
"巴巴克": {
"name": "巴巴克",
@@ -187,7 +206,8 @@
"page": 1,
"time": "any",
"path": "assets/path/须弥-奥摩斯港-巴巴克.json",
"_3d_foods": ["清心", "琉璃袋"]
"_3d_foods": ["清心", "琉璃袋"],
"tags": ["须弥"]
},
"Boucicaut": {
"name": "布希柯",
@@ -195,7 +215,8 @@
"page": 2,
"time": "any",
"path": "assets/path/枫丹-枫丹廷-布希柯.json",
"_1d_foods": ["枫达", "洋葱", "牛奶", "卷心菜", "土豆", "小麦", "秃秃豆", "杏仁", "发酵果实汁", "盐", "胡椒", "番茄"]
"_1d_foods": ["枫达", "洋葱", "牛奶", "卷心菜", "土豆", "小麦", "秃秃豆", "杏仁", "发酵果实汁", "盐", "胡椒", "番茄"],
"tags": ["枫丹"]
},
"Arouet": {
"name": "阿鲁埃",
@@ -203,7 +224,8 @@
"page": 2,
"time": "any",
"path": "assets/path/枫丹-枫丹廷-阿鲁埃.json",
"_1d_foods": ["咖啡豆", "枫达"]
"_1d_foods": ["咖啡豆", "枫达"],
"tags": ["枫丹"]
},
"Antman": {
"name": "安特曼",
@@ -212,7 +234,8 @@
"time": "any",
"path": "assets/path/枫丹-白淞镇-安特曼.json",
"_1d_foods": ["鱼肉", "螃蟹"],
"_3d_foods": ["海露花", "汐藻"]
"_3d_foods": ["海露花", "汐藻"],
"tags": ["枫丹"]
},
"皮托": {
"name": "皮托",
@@ -221,7 +244,8 @@
"time": "any",
"path": "assets/path/枫丹-锈舵酒馆-皮托.json",
"_1d_foods": ["牛奶"],
"_7d_foods": ["培根", "火腿", "香肠", "奶酪"]
"_7d_foods": ["培根", "火腿", "香肠", "奶酪"],
"tags": ["枫丹", "黑心商人"]
},
"钦特利": {
"name": "钦特利",
@@ -229,7 +253,8 @@
"page": 1,
"time": "any",
"path": "assets/path/纳塔-圣火竞技场-钦特利.json",
"_3d_foods": ["青蜜莓", "苦种"]
"_3d_foods": ["青蜜莓", "苦种"],
"tags": ["纳塔"]
},
"夏安卡": {
"name": "夏安卡",
@@ -237,7 +262,8 @@
"page": 3,
"time": "any",
"path": "assets/path/纳塔-圣火竞技场-夏安卡.json",
"_7d_foods": ["蟹"]
"_7d_foods": ["蟹"],
"tags": ["纳塔"]
},
"Bunama": {
"name": "布纳马",
@@ -245,18 +271,18 @@
"page": 2,
"time": "any",
"path": "assets/path/纳塔-圣火竞技场-布纳马.json",
"_1d_foods": ["盐", "胡椒", "小麦", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "秃秃豆"]
}
,
"_1d_foods": ["盐", "胡椒", "小麦", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "秃秃豆"],
"tags": ["纳塔"]
},
"采若": {
"name": "采若",
"enable": true,
"page": 3,
"time": "any",
"path": "assets/path/挪德卡莱-那夏镇-采若.json",
"_1d_foods": ["黑麦", "盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦"]
}
,
"_1d_foods": ["黑麦", "盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦"],
"tags": ["挪德卡莱"]
},
"科菲策": {
"name": "科菲策",
"enable": true,
@@ -264,8 +290,7 @@
"time": "any",
"path": "assets/path/挪德卡莱-皮拉米达城-科菲策.json",
"_1d_foods": ["牛奶", "咖啡豆"],
"_3d_foods": ["微光角菌", "琉鳞石"]
"_3d_foods": ["微光角菌", "琉鳞石"],
"tags": ["挪德卡莱"]
}
}

View File

@@ -126,10 +126,10 @@ async function loadExternalData() {
foodsData = JSON.parse(foodsContent);
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`);
logConditional(`已加载商人数据: ${Object.keys(npcData).length}商人`);
// 解析用户要购买的商品列表
const foodsInput = (settings.foodsToBuy || "").trim();
@@ -234,10 +234,16 @@ let userName = settings.userName || "默认账户";
const ignoreRecords = settings.ignoreRecords || false;
const recordDebug = settings.recordDebug || false;
// 解析禁用的NPC列表
// 解析禁用的商人列表
const disabledNpcs = (settings.disabledNpcs || "").split(/\s+/).filter(npc => npc.trim() !== "");
if (disabledNpcs.length > 0) {
log.info(`已禁用NPC: ${disabledNpcs.join(", ")}`);
log.info(`已禁用商人: ${disabledNpcs.join(", ")}`);
}
// 解析禁用的标签列表
const disabledTags = (settings.disabledTags || "").split(/\s+/).filter(tag => tag.trim() !== "");
if (disabledTags.length > 0) {
log.info(`已禁用标签: ${disabledTags.join(", ")}`);
}
// 修改AKF设置处理
@@ -283,7 +289,7 @@ async function ensureAccountDirectory(accountName) {
}
}
// ==================== 新增函数:读取NPC记录文件 ====================
// ==================== 新增函数:读取商人记录文件 ====================
async function loadNpcRecords() {
const recordPath = getRecordPath(userName);
try {
@@ -297,7 +303,20 @@ async function loadNpcRecords() {
return [];
}
// ==================== 保存NPC记录 ====================
// ==================== 辅助函数:从路径中提取显示名称 ====================
function getDisplayNameFromPath(path) {
try {
// 从路径中提取文件名(不带.json扩展名
// 例如assets/path/璃月-璃月港-阿桂.json → 璃月-璃月港-阿桂
const fileName = path.split('/').pop(); // 获取最后一部分
return fileName.replace('.json', ''); // 移除.json扩展名
} catch (error) {
// 如果解析失败,返回原始路径或默认值
return path || "未知位置";
}
}
// ==================== 保存商人记录 ====================
async function saveNpcRecords(records) {
const recordPath = getRecordPath(userName);
try {
@@ -309,12 +328,12 @@ async function saveNpcRecords(records) {
}
}
// ==================== 获取NPC记录 ====================
// ==================== 获取商人记录 ====================
function getNpcRecord(records, npcName) {
return records.find(record => record.npcname === npcName);
}
// ==================== 更新NPC记录 ====================
// ==================== 更新商人记录 ====================
function updateNpcRecord(records, npcName, refreshType, purchasedItems) {
// 如果没有购买任何商品,不更新记录
if (!purchasedItems || purchasedItems.length === 0) {
@@ -393,7 +412,7 @@ function updateNpcRecord(records, npcName, refreshType, purchasedItems) {
return records;
}
// ==================== 新增函数:计算基准日周期 ====================
// ==================== 计算3天刷新商品基准日周期 ====================
function getBasePeriod(currentDate) {
// 基准时间2025-08-08 20:00 UTC (对应2025-08-09 04:00 GMT+8)
const baseTime = Date.UTC(2025, 7, 8, 20, 0, 0);
@@ -797,19 +816,22 @@ async function spikChat(npcName) {
}
}
// 修改后的购买逻辑
// 主要购买逻辑
async function buyFoods(npcName, npcRecords, currentPeriod) {
// 设置脚本环境的游戏分辨率和DPI缩放
setGameMetrics(3840, 2160, 1.5);
// 获取NPC数据
// 获取商人数据
const npc = npcData[npcName];
const npcRecord = getNpcRecord(npcRecords, npc.name);
// 获取显示名称
const displayName = getDisplayNameFromPath(npc.path);
if (recordDebug) {
log.info(`[调试] 开始处理NPC: ${npc.name}`);
log.info(`[调试] 开始处理: ${displayName}`);
if (npcRecord) {
log.info(`[调试] NPC当前记录: 1d=${npcRecord["1d_time"] || "无"}, 3d=${npcRecord["3d_time"] || "无"}, 7d=${npcRecord["7d_time"] || "无"}`);
log.info(`[调试] 当前记录: 1d=${npcRecord["1d_time"] || "无"}, 3d=${npcRecord["3d_time"] || "无"}, 7d=${npcRecord["7d_time"] || "无"}`);
}
}
@@ -817,7 +839,7 @@ async function buyFoods(npcName, npcRecords, currentPeriod) {
const foodsToBuy = shouldBuyFoods(npc, npcRecord, currentPeriod, ignoreRecords);
if (recordDebug) {
log.info(`[调试] ${npc.name} 购买判断结果:`);
log.info(`[调试] ${displayName} 购买判断结果:`);
log.info(`[调试] 1天商品: ${foodsToBuy["1d"].join(", ")}`);
log.info(`[调试] 3天商品: ${foodsToBuy["3d"].join(", ")}`);
log.info(`[调试] 7天商品: ${foodsToBuy["7d"].join(", ")}`);
@@ -830,7 +852,7 @@ async function buyFoods(npcName, npcRecords, currentPeriod) {
if (foodsToBuy["7d"]) allFoodsToBuy.push(...foodsToBuy["7d"]);
if (allFoodsToBuy.length === 0) {
logConditional(`${npc.name} 没有需要购买的商品`);
logConditional(`${displayName} 没有需要购买的商品`);
return {
purchased: [],
"1d": [],
@@ -839,7 +861,7 @@ async function buyFoods(npcName, npcRecords, currentPeriod) {
};
}
logConditional(`${npc.name} 购买列表: ${allFoodsToBuy.join(", ")}`);
logConditional(`${displayName} 购买列表: ${allFoodsToBuy.join(", ")}`);
let tempFoods = [...allFoodsToBuy];
const purchasedFoods = [];
@@ -951,9 +973,9 @@ async function buyFoods(npcName, npcRecords, currentPeriod) {
}
if (purchasedFoods.length > 0) {
log.info(`${npc.name} 购买完成,成功购买: ${purchasedFoods.join(", ")}`);
log.info(`${displayName} 购买完成,成功购买: ${purchasedFoods.join(", ")}`);
} else {
logConditional(`${npc.name} 没有成功购买任何商品`);
logConditional(`${displayName} 没有成功购买任何商品`);
}
// 返回购买结果
@@ -965,16 +987,27 @@ async function buyFoods(npcName, npcRecords, currentPeriod) {
};
}
// 修改后的初始化NPC商品
// 初始化商人商品
async function initNpcData(records) {
for (let [key, npc] of Object.entries(npcData)) {
// 检查是否在禁用列表中
if (disabledNpcs.includes(npc.name)) {
npc.enable = false;
logConditional(`已禁用NPC: ${npc.name}`);
const displayName = getDisplayNameFromPath(npc.path);
logConditional(`已禁用: ${displayName}`);
continue;
}
// 检查是否通过标签禁用
if (npc.tags && Array.isArray(npc.tags)) {
const hasDisabledTag = npc.tags.some(tag => disabledTags.includes(tag));
if (hasDisabledTag) {
npc.enable = false;
logConditional(`按标签禁用NPC: ${npc.name} (标签: ${npc.tags.join(", ")})`);
continue;
}
}
const npcRecord = getNpcRecord(records, npc.name);
// 判断是否需要强制刷新
@@ -993,7 +1026,8 @@ async function initNpcData(records) {
npc.enable = npc.enable && hasFoodsToBuy;
if (recordDebug && !npc.enable && hasFoodsToBuy) {
log.info(`${npc.name} 有商品需要购买但NPC被禁用`);
const displayName = getDisplayNameFromPath(npc.path);
log.info(`${displayName} 有商品需要购买但商人被禁用`);
}
}
}
@@ -1033,7 +1067,7 @@ async function initRo() {
// ==================== 加载外部数据 ====================
if (!await loadExternalData()) {
log.error("商品或NPC数据加载失败,脚本终止");
log.error("商品或商人数据加载失败,脚本终止");
return;
}
@@ -1042,13 +1076,13 @@ async function initRo() {
logConditional("识别对象初始化完成");
// ==================== 加载NPC购买记录 ====================
// ==================== 加载商人购买记录 ====================
let npcRecords = await loadNpcRecords();
logConditional(`已加载 ${npcRecords.length}NPC的购买记录`);
logConditional(`已加载 ${npcRecords.length}商人的购买记录`);
if (recordDebug && npcRecords.length > 0) {
log.info("[调试] 当前NPC记录:");
log.info("[调试] 当前商人记录:");
npcRecords.forEach(record => {
log.info(`[调试] ${record.npcname}:`);
if (record["1d_time"]) log.info(`[调试] 1天刷新: ${record["1d_time"]}`);
@@ -1057,14 +1091,14 @@ async function initRo() {
});
}
// ==================== 初始化NPC数据 ====================
// ==================== 初始化商人数据 ====================
await initNpcData(npcRecords);
logConditional("NPC数据初始化完成");
logConditional("商人数据初始化完成");
// 统计启用的NPC数量
// 统计启用的商人数量
const enabledNpcs = Object.values(npcData).filter(npc => npc.enable);
log.info(`本次执行将处理 ${enabledNpcs.length}NPC`);
log.info(`本次执行将处理 ${enabledNpcs.length}商人`);
// ==================== 自动购买 ====================
// 获取当前时间和周期
@@ -1080,13 +1114,15 @@ async function initRo() {
for (let [key, npc] of Object.entries(npcData)) {
if (npc.enable) {
npcIndex++;
// 获取显示名称(从路径中提取)
const displayName = getDisplayNameFromPath(npc.path);
log.info(`当前进度:${npcIndex}/${enabledNpcs.length}`);
log.info(`开始前往NPC ${npc.name} 购买`);
log.info(`开始前往: ${displayName}`); // 修改这里
await genshin.returnMainUi();
// 地图追踪开始
await fakeLog(npc.name, false, true, 0);
await fakeLog(displayName, false, true, 0);
// 设置游戏时间
if (npc.time === "night") {
@@ -1104,20 +1140,20 @@ async function initRo() {
// 返回主界面
await genshin.returnMainUi();
log.info(`完成购买NPC: ${npc.name}`);
log.info(`完成: ${displayName}`);
// 伪造日志任务结束
await fakeLog(npc.name, false, false, 0);
await fakeLog(displayName, false, false, 0);
// NPC之间等待
// 商人之间等待
if (npcIndex < enabledNpcs.length) {
logConditional("等待2秒后处理下一个NPC");
await sleep(2000);
logConditional("等待1.5秒后处理下一个商人");
await sleep(1500);
}
}
else {
if (recordDebug) {
log.info(`[调试] 跳过未启用的NPC: ${npc.name}`);
log.info(`[调试] 跳过未启用的商人: ${npc.name}`);
}
}
}

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "自动购买每天&3天&每周刷新商品",
"version": "3.0.0",
"version": "3.1.0",
"description": "自动购买每天&3天&每周刷新商品\n每天刷新商品自动购买商品\n3天刷新商品未到刷新日不购买该商品\n每周刷新商品可指定每周购买商品",
"authors": [
{

View File

@@ -8,7 +8,7 @@
{
"name": "foodsToBuy",
"type": "input-text",
"label": "要购买的商品(多个商品用空格分隔)\n示例\"小麦 黑麦\"\n支援的 商人与商品详细 请前往 README.md 查看",
"label": "要购买的商品(多个商品用空格分隔)\n示例\"小麦 黑麦\"\n\n支援的 商人与商品详细 请前往 README.md 查看\n建议直接复制商品名称贴上输入栏",
"default": "小麦 黑麦"
},
{
@@ -33,6 +33,12 @@
"label": "要禁用的NPC\n多个NPC用空格分隔\n示例阿扎莱 皮托",
"default": "阿扎莱 皮托"
},
{
"name": "disabledTags",
"type": "input-text",
"label": "禁用标签\n多个标签以空格分隔黑心商人 挪德卡莱)",
"default": ""
},
{
"name": "ignoreRecords",
"type": "checkbox",

View File

@@ -5,16 +5,16 @@
- **查看`assets/data/foods.json`**:所有商品的中文名称
### 商人信息总览
| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 备注 |
| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 标签 |
|--------|--------|-------------|------------|-------------|------|
| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | 白天出现 |
| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | 晚上出现 |
| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | |
| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | |
| 蒙德-蒙德城 | 莎拉 | - | - | 蟹黄 | - |
| 璃月-璃月港 | 东升 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁、盐、胡椒、番茄 | - | - | |
| 璃月-璃月港 | 卯师父 | 鱼肉、螃蟹 | 胡萝卜、松茸、绝云椒椒 | - | |
| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | 白天出现 |
| 璃月-璃月港 | 老高 | 鱼肉 | - | - | |
| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋 | - | 晚上出现 |
| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | |
| 璃月-璃月港 | 老高 | 鱼肉、鱼肉2 | - | - | |
| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋 | - | |
| 璃月-望舒客栈 | 菲尔戈黛特 | - | 松茸、琉璃袋 | - | |
| 璃月-遗珑埠 | 丰泰 | - | 沉玉仙茗、琉璃袋、绝云椒椒 | 蟹黄 | |
| 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | |
@@ -28,14 +28,19 @@
| 须弥-须弥城 | 哈马维 | 洋葱、牛奶、卷心菜、土豆、小麦、稻米、虾仁、豆腐、盐、胡椒、番茄 | - | - | |
| 须弥-须弥城 | 兰巴德 | 鱼肉、螃蟹 | - | - | 独立地图 |
| 须弥-须弥城 | 恩忒卡 | 咖啡豆 | - | - | 独立地图 |
| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | - | - | 晚上出现 |
| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | - | - | 黑心商人 |
| 须弥-奥摩斯港 | 巴巴克 | - | 清心、琉璃袋 | - | |
| 枫丹-枫丹廷 | 布希柯 | 枫达、洋葱、牛奶、卷心菜、土豆、小麦、秃秃豆、杏仁、发酵果实汁、盐、胡椒、番茄 | - | - | |
| 枫丹-枫丹廷 | 阿鲁埃 | 咖啡豆、枫达 | - | - | |
| 枫丹-白淞镇 | 安特曼 | 鱼肉、螃蟹 | 海露花、汐藻 | - | |
| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | |
| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | 黑心商人 |
| 纳塔-圣火竞技场 | 钦特利 | - | 青蜜莓、苦种 | - | |
| 纳塔-圣火竞技场 | 夏安卡 | - | - | 蟹黄 | |
| 纳塔-圣火竞技场 | 布纳马 | 盐、胡椒、小麦、洋葱、牛奶、番茄、卷心菜、土豆、秃秃豆 | - | - | |
| 挪德卡莱-那夏镇 | 采若 | 黑麦、盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | |
| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | |
| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | 黑心商人 |
- 独立地图:指需要进入独立空间的特殊地图,这些地图部份路径无法使用地图追踪功能
- 黑心商人:指没有折扣的商人,价格较贵的商人
### **标签系统尚未完全添加,欢迎补充标签**

View File

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