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 +76 -153
- package/docs/internals.md +53 -10
- package/index.mjs +10 -28
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,153 +1,76 @@
|
|
|
1
|
-
# Loomy for magpie
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
讯飞 Loomy 的编程订阅接进 magpie
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
今日积分
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
184
|
-
181
|
|
185
|
-
|
|
186
|
-
⇒ 各得 10000
|
|
192
|
+
189 兑换 181 的 FDW3CU → +5000 填写邀请码奖励
|
|
193
|
+
181 兑换 189 的 E4DPT6 → +5000 填写邀请码奖励
|
|
194
|
+
两边各再收 +5000 邀请好友奖励
|
|
195
|
+
⇒ 各得 10000,服务端全程 200,没有任何拦截
|
|
187
196
|
```
|
|
188
197
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
//
|
|
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.
|
|
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",
|