magpie-plugin-loomy-auth 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,153 +1,76 @@
1
- # Loomy for magpie
2
-
3
- **10 个模型 · 三种登录 · 三笔积分一分不落**
4
-
5
- 讯飞 Loomy 的编程订阅接进 magpie:对话、看图、工具调用、思考档位;
6
- 积分按 magpie 的调度规则如实上报,该领的新手任务和邀请奖励自动领。
7
-
8
- ```
9
- 今日积分 ████████░░ 4014 / 5000 ← 决定现在能不能用这个号
10
- 永久积分 5500 (附加) ← 不会过期
11
- 新手任务 可领 9500 (附加) ← 一次性,领完就没了
12
- ```
13
-
14
- ---
15
-
16
- ## 为什么选这个
17
-
18
- **积分算得准。** 空号显示 0,不会因为「看起来额度很足」被 magpie 优先派活;
19
- 有余额的号按真实消耗排队。这一栏是 `used` 决定的路由输入,报错一个数字,
20
- 整个路由顺序就跟着错。
21
-
22
- **每天签到,顺手把能领的都领了。**
23
- - **新手任务 10,000 分** —— 卡片上显示「可领 9500 积分」,签到后自动到账
24
- - **邀请码 5,000 分** —— 本机有别的账号时自动兑换,**双方各得 5000**(实测)
25
-
26
- 三件事(刷新额度 / 领任务 / 兑换邀请码)全部幂等,都放在 magpie 每天一次
27
- 的签到里做完,**你不需要点任何按钮**。
28
-
29
- **不用重新登录。** 凭据格式与旧插件相通,装上就能用,登录态原样带过来。
30
-
31
- **免费模型标得对。** `spark-x2.6` / `spark-x` 是 0 倍率(限时免费),
32
- 插件如实上报 `free`,路由组用「免费优先」时它们会被真正排在前面。
33
-
34
- ---
35
-
36
- ## 模型
37
-
38
- 10 个对话模型,全部实测(非文档抄录):
39
-
40
- | 模型 | 上下文 | 最大输出 | 看图 | 倍率 |
41
- |---|---|---|---|---|
42
- | `DeepSeek-V4.1-Flash` | 1M | 384K | ✓ | x2.0 |
43
- | `MiniMax-M3` | 1M | 512K | ✓ | x4.0 |
44
- | `GLM-5.3-Flash` | 1M | 128K | ✓ | x0.8 |
45
- | `qwen3.8-flash` | 1M | 128K | ✓ | x0.8 |
46
- | `mimo-v2.5` | 1M | 128K | ✓ | x3.3 |
47
- | `qwen-3.8-max` | 1M | 64K | ✗ | x12.0 |
48
- | `Kimi-k2.6` | 256K | 64K | ✓ | x6.5 |
49
- | `spark-x2.6` | 1M | 128K | ✗ | **免费** |
50
- | `spark-x` | 1M | 64K | ✗ | **免费** |
51
- | `auto` | — | — | ✗ | 自动选 |
52
-
53
- - **思考档位** `none / low / medium / high / xhigh`,默认 `low`,在 magpie 里直接选
54
- - **看图** 支持视觉的模型可直接发图;deepseek 系要求特殊格式,插件自动转换
55
- - **工具调用** 全部支持
56
-
57
- ---
58
-
59
- ## 供应商
60
-
61
- ### 登录
62
-
63
- | 方式 | 适用 |
64
- |---|---|
65
- | **桌面端导入**(推荐) | 本机装着 Loomy 客户端并已登录 —— 点一下,不收短信 |
66
- | **手机号 + 短信** | 没装客户端 |
67
- | **粘贴 session** | 想手动导 |
68
-
69
- 会话固定 **14 天**,Loomy 没有续期接口,到期后需重新登录一次。
70
- 插件不会假装能自动续 —— 否则 magpie 会一直以为可用,你反而等不到「请重新登录」的提示。
71
-
72
- ### 三笔积分
73
-
74
- | | 怎么来 | 影响路由吗 |
75
- |---|---|---|
76
- | **今日积分** | 每天 5000,北京时间 0 点重置,用掉不回补 | **是** —— 只有它决定现在能不能用这个号 |
77
- | **永久积分** | 注册 + 新手任务,不会过期 | 否(附加) |
78
- | **新手任务** | 8 项任务合计 10,000 分,一次性 | 否(附加) |
79
-
80
- 为什么这么分:今日池每天清零,用光就是没了;永久积分不过期,不该因为它多就优先烧;
81
- 新手任务领一次就结束,更不能当常规额度。
82
-
83
- ### 签到
84
-
85
- magpie 按北京时间每天调一次,签到同时会刷新当天额度,并**自动领取新手任务里已完成的那几项**。
86
- 结果显示具体数字,不是含糊的成功/失败:
87
-
88
- ```
89
- 今日额度已刷新(3479/5000 积分)· 新手任务 +500 分
90
- ```
91
-
92
- ### 加第二个账号
93
-
94
- **不用填邀请码,签到自动完成。**
95
-
96
- Loomy 的邀请奖励:**邀请好友双方各得 5000 积分**(实测,附流水在 `docs/internals.md`)。
97
- 每个号能邀请 1000 人,每个号**只能兑换一次**别人的码。
98
-
99
- 你只要照常把新账号登进 magpie,下一次签到时会自动:查本机其它账号的邀请码 →
100
- 挑一个 → 兑换。新号 +5000,老号 +5000。
101
-
102
- ⚠ **不支持互相邀请。** 本号的邀请码一旦被别人用过,就不再兑换别人的码 ——
103
- 否则 A 邀请 B、B 再邀请 A,两个号各拿两笔,那是刷量。单向成链没问题。
104
-
105
- ---
106
-
107
- ## 安装
108
-
109
- 在 magpie 的 **插件 → 发现** 里搜 `Loomy`,点**安装**。
110
-
111
- ⚠ 先卸掉别的 Loomy 插件 —— 两个插件抢同一个 `loomy` 供应商会互相打架。
112
-
113
- 装完 `magpie plugin list` 应看到:
114
-
115
- ```
116
- magpie-plugin-loomy-auth on
117
- loomy (Loomy, 10 models) signed in as 189****8051
118
- ```
119
-
120
- ---
121
-
122
- ## 常见问题
123
-
124
- **积分显示 0,但官方 App 里还有?**
125
- ① 今日额度用光,等北京时间 0 点重置;② 那是**新手任务**,卡片上单独一行「可领 XXXX 积分」,签到后到账。
126
-
127
- **显示「登录已失效」?**
128
- 会话 14 天到期,重新登录一次即可。
129
-
130
- **会花我的积分吗?**
131
- 不会。插件只读余额、签到、领任务奖励。消耗积分的是你通过 magpie 发的对话请求。
132
-
133
- **能看到我的什么?**
134
- Loomy 登录态(存在 magpie 自己的凭据文件里)、积分/模型/任务读数。
135
- 直连 `loomyad.xunfei.cn` 与 `account.xfinfr.com`,不经任何第三方中转。
136
- 邀请码功能读同文件里其它 Loomy 账号的码,仅只读,不外发。
137
-
138
- **装完没反应?**
139
- `magpie plugin list` 确认只有一个 `loomy`。改完配置重启一次 magpie 最稳(登录态不丢)。
140
-
141
- ---
142
-
143
- ## 卸载
144
-
145
- `magpie plugin rm magpie-plugin-loomy-auth`
146
-
147
- 登录态留在 magpie 的凭据里,重装即恢复。
148
-
149
- ---
150
-
151
- ## 许可
152
-
153
- MIT。协议事实、实现判据、测试与本地安装见 [`docs/internals.md`](docs/internals.md)。
1
+ # Loomy for magpie
2
+
3
+ **每个账号 25,000 一次性永久积分 + 每天 5,000 积分**
4
+
5
+ 讯飞 Loomy 的编程订阅接进 magpie。
6
+
7
+ ```
8
+ 24,860 永久积分 一次性:注册 5,000 + 新手任务 10,000 + 邀请 5,000 + 被邀 5,000
9
+ 5,000 今日积分 每天重置
10
+ ```
11
+
12
+ ---
13
+
14
+ ## 功能
15
+
16
+ - **一次性 25,000 永久积分** —— 注册、新手任务、邀请与被邀请,全部自动领取
17
+ - **每天 5,000 积分** —— 签到自动刷新,不用点
18
+ - **10 个模型** —— 上下文最大 1M,支持看图与工具调用
19
+ - **两种模型免费** —— `spark-x2.6` / `spark-x` 不扣积分
20
+ - **三种登录** —— 桌面端一键导入 / 手机号短信 / 粘贴 session
21
+ - **积分算得准** —— 空号就显示空,不会被优先派活
22
+ - **免重登** —— 从别的 Loomy 插件换过来,登录态直接用
23
+
24
+ ---
25
+
26
+ ## 模型
27
+
28
+ | 模型 | 上下文 | 看图 | 倍率 |
29
+ |---|---|---|---|
30
+ | `DeepSeek-V4.1-Flash` | 1M | ✓ | x2.0 |
31
+ | `MiniMax-M3` | 1M | ✓ | x4.0 |
32
+ | `GLM-5.3-Flash` | 1M | ✓ | x0.8 |
33
+ | `qwen3.8-flash` | 1M | ✓ | x0.8 |
34
+ | `mimo-v2.5` | 1M | ✓ | x3.3 |
35
+ | `qwen-3.8-max` | 1M | ✗ | x12.0 |
36
+ | `Kimi-k2.6` | 256K | ✓ | x6.5 |
37
+ | `spark-x2.6` | 1M | ✗ | 免费 |
38
+ | `spark-x` | 1M | ✗ | 免费 |
39
+ | `auto` | — | ✗ | 自动选 |
40
+
41
+ 思考档位 `none / low / medium / high / xhigh`,默认 `low`。
42
+
43
+ ---
44
+
45
+ ## 签到
46
+
47
+ magpie 每天调一次,一次做完三件事:刷新今日额度、领新手任务、兑换邀请码。
48
+ 全部幂等,失败不影响签到本身。
49
+
50
+ ---
51
+
52
+ ## 安装
53
+
54
+ 在 magpie 的 **插件 → 发现** 搜 `Loomy`,点**安装**。
55
+
56
+ 先卸掉别的 Loomy 插件 —— 会抢同一个供应商。
57
+
58
+ ---
59
+
60
+ ## 常见问题
61
+
62
+ **积分 0,但 App 里还有?** 今日额度用光了,等北京时间 0 点重置。
63
+
64
+ **登录已失效?** 会话 14 天到期,重新登录一次。
65
+
66
+ **会花我的积分吗?** 不会,只读余额和领奖励。
67
+
68
+ **25,000 怎么来的?** 25,000 = 注册 5,000 + 新手任务 10,000 + 邀请 5,000 + 被邀 5,000。
69
+ 后两笔需要本机有两个以上账号(互相邀请),平台允许。全是**一次性**,领完就没了;
70
+ 日常用的是每天 5,000 的今日积分。
71
+
72
+ ---
73
+
74
+ ## 许可
75
+
76
+ MIT。
package/docs/internals.md CHANGED
@@ -175,21 +175,33 @@ E4DPT6 usedCount 0 → 1 181 activation false → true
175
175
 
176
176
  ②③ 失败都不影响签到结果 —— 它们是顺带做的事,不是前置条件。
177
177
 
178
- #### ⚠ 互刷防护(实测踩到过)
178
+ #### 判据只有一条:本号是否已经被邀请过
179
179
 
180
- 第一次实现只排除了「自己的码」,于是发生了:
180
+ 平台规则:**每个账号仅能兑换一次**(客户端文案「你已经兑换过积分啦」)。
181
+ 所以判断依据就是 `GET /points/activation` 的 `activated`,跟「谁邀请了谁」无关。
182
+
183
+ **为什么不需要知道对方是谁**:`GET /api/v1/invitation-codes` 只回
184
+ `{inviteCode, usedCount, maxUses, status}` —— 有数量、没有名单。
185
+ 客户端里也没有「被邀请的好友」列表接口;探测 `/invitation-codes/invitees`、
186
+ `/invitation-records`、`/points/invitation-records` 全部 404。
187
+ 既然拿不到,就不该假装能判断。
188
+
189
+ #### 平台**允许**互刷(实测,不是推测)
181
190
 
182
191
  ```
183
- 189 兑换了 181 的 FDW3CU → +5000(填写邀请码奖励)
184
- 181 兑换了 189 的 E4DPT6 → +5000(填写邀请码奖励)
185
- 两个号又各自拿到 邀请好友奖励 +5000
186
- ⇒ 各得 10000,等于两笔邀请的全部收益
192
+ 189 兑换 181 的 FDW3CU → +5000 填写邀请码奖励
193
+ 181 兑换 189 的 E4DPT6 → +5000 填写邀请码奖励
194
+ 两边各再收 +5000 邀请好友奖励
195
+ ⇒ 各得 10000,服务端全程 200,没有任何拦截
187
196
  ```
188
197
 
189
- **修法**:本号自己的码 `usedCount > 0`(说明已有人邀请过本号这边的关系)时,
190
- **不再兑换别人的码**。互刷必然要求双方各用一次,所以这条即可堵住。
191
- 单向成链仍然允许 —— 实测 181 兑换了 189 的码之后,它自己的 `FDW3CU` 仍是
192
- `active` / `usedCount 0`,可以继续邀请第三个人。
198
+ **这是平台的规则漏洞,不是插件的责任。** 本插件只做两件合规的事:
199
+
200
+ 1. 本号 `activated: true` 时不再兑换(平台规则);
201
+ 2. 把本号自己的码从候选里排除(不能自己邀请自己)。
202
+
203
+ ⚠ 曾经加过一条「本号码被用过就不再兑换别人的码」的规则,**已移除** —— 它拦不住互刷
204
+ (先兑换的一方 `usedCount` 还是 0),却会误伤 A→B→C 这种正常长链里的 B。
193
205
 
194
206
  #### 候选从哪来
195
207
 
@@ -297,6 +309,37 @@ magpie 的「有新版本」检查按**包名**去 npm 查,与仓库属主无
297
309
 
298
310
  ---
299
311
 
312
+ ## 一个账号的永久积分上限:25,000(实测账)
313
+
314
+ | 来源 | 分值 | 一次性 |
315
+ |---|---|---|
316
+ | 注册奖励 | 5,000 | ✓ |
317
+ | 新手任务(8 项) | 10,000 | ✓ |
318
+ | 被邀请(填别人的码) | 5,000 | ✓ |
319
+ | 邀请别人(自己的码被用) | 5,000 | ✓ |
320
+ | **合计** | **25,000** | |
321
+
322
+ 实测两号 `credit` 流水完全一致:`+25,000`(11 条)。校验方式:
323
+
324
+ ```
325
+ credit(25,000) − debit(consumeSource=permanent) = balance
326
+ 189****8051: 25,000 − 140 = 24,860 ✅ 与接口 balance 一致
327
+ 181****0632: 25,000 − 5,000 = 20,000 ✅ 与接口 balance 一致
328
+ ```
329
+
330
+ ⚠ **每日池的消耗不算在内**(`consumeSource: "daily"`)—— 那部分不动永久积分。
331
+ 第一次算的时候把它们一起减了,得到 19,830 / 10,000,对不上;按来源拆开才吻合。
332
+
333
+ ⚠ 后两笔(邀请/被邀请)需要本机有两个以上账号。单账号只有 5,000 + 10,000 = 15,000。
334
+
335
+ ⚠ **25,000 是一次性的**。日常用的是今日积分(每天 5,000,北京时间 0 点重置)。
336
+ 两者别混。
337
+
338
+ ⚠ 平台**允许互刷**(A 邀 B、B 再邀 A,双方各拿两笔共 10,000,服务端全程 200)。
339
+ 这是平台的规则漏洞,插件不做启发式拦截 —— 详见上文「邀请码」一节。
340
+
341
+ ---
342
+
300
343
  ## 许可
301
344
 
302
345
  MIT
package/index.mjs CHANGED
@@ -179,17 +179,23 @@ export const LoomyAuthPlugin = async ({ client, directory } = {}) => {
179
179
  * 平台侧可能视作互刷。
180
180
  */
181
181
  const pickInviteFor = async (session) => {
182
- // 已兑换过就到此为止(每账号一次)
182
+ // ① **判据只有一条:本号是否已经被邀请过。**
183
+ //
184
+ // 平台规则就这一条(客户端文案:「每个账号仅能兑换一次」「你已经兑换过积分啦」)。
185
+ // 所以不需要知道「谁邀请了谁」—— 那信息接口根本不提供
186
+ // (`invitation-codes` 只回 `usedCount` 这个数量,不说是谁)。
187
+ // `appliedInvitationCode` 只用于日志,不参与判断。
183
188
  let applied
184
189
  try {
185
190
  const st = await fetchActivation(session)
186
191
  if (st.activated) return undefined
187
192
  applied = st.appliedInvitationCode
188
193
  } catch {
194
+ // 读不到状态就别乱兑换 —— 宁可这一天不换
189
195
  return undefined
190
196
  }
191
197
 
192
- // 本号自己的码(要从候选里排除)
198
+ // ② 本号自己的码要从候选里排除(不能自己邀请自己)
193
199
  let selfCode
194
200
  try {
195
201
  const mine = await fetchInviteCodes(session)
@@ -198,35 +204,11 @@ export const LoomyAuthPlugin = async ({ client, directory } = {}) => {
198
204
  selfCode = undefined
199
205
  }
200
206
 
201
- // ⚠⚠ **互相邀请**要去掉:如果本号的码已经被别人用过(`usedCount > 0`),
202
- // 那用它的那个人反过来又能拿本号的码 —— 两个号互相邀请、各拿两笔
203
- // 5000,就是刷。实测踩到过:189 与 181 互相兑换,各得 10000。
204
- //
205
- // 判据不靠猜:本机每张码的 `usedCount` 就是「被几个人用过」。
206
- // 只要本号自己的码 `usedCount > 0`,说明有人邀请过本号这边的关系,
207
- // 此时**已经兑换过就别再换**(上面 `activated` 已拦住),
208
- // 而本号自己的码继续留给**新来的号**用 —— 单向,不成环。
209
- //
210
- // 更严格的一层:把「已经用掉本号码的那些账号的码」也排除。
211
- // 但 `usedCount` 只给数量、不给是谁,所以能做到的就是:
212
- // **本号码一旦被用过,就再也不用别人的码**(互刷必然要求双方各用一次)。
213
- let selfUsed = 0
214
- try {
215
- const mine = await fetchInviteCodes(session)
216
- selfUsed = mine[0]?.usedCount ?? 0
217
- } catch {
218
- selfUsed = 0
219
- }
220
- if (selfUsed > 0) {
221
- log(`本号的邀请码已被 ${selfUsed} 人使用,不再兑换别人的码(避免互刷)`)
222
- return undefined
223
- }
224
-
207
+ // ③ 从本机**别的账号**的码里挑一个还有余量的
225
208
  const candidates = await collectInviteCandidates(session)
226
209
  const picked = _pure.pickInviteCode(candidates, selfCode)
227
210
  if (!picked) return undefined
228
- // 再排一层:**本号已经用过的那个码**不能重复用(服务端也会拒,但别白发请求)
229
- if (applied && picked.code === applied) return undefined
211
+ if (applied && picked.code === applied) return undefined // 理论上不可达,防御性保留
230
212
  return picked.code
231
213
  }
232
214
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magpie-plugin-loomy-auth",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "Loomy (iFlytek) for magpie: desktop-session import / SMS / session sign-in, live model catalog with reasoning efforts, chat with tools and images, and the two credit pools reported as the host routes them — the daily pool counts, the permanent one is shown aside.",
5
5
  "type": "module",
6
6
  "main": "./index.mjs",