@@ -17,7 +17,7 @@ export class Jimeng extends plugin {
1717 /** 功能名称 */
1818 name : 'sf插件-即梦api' ,
1919 /** 功能描述 */
20- dsc : '绘画/视频' ,
20+ dsc : '绘画/视频/积分管理 ' ,
2121 event : 'message' ,
2222 /** 优先级,数字越小等级越高 */
2323 priority : 1011 ,
@@ -28,21 +28,38 @@ export class Jimeng extends plugin {
2828 /** 执行方法 */
2929 fnc : 'call_Jimeng_Api'
3030 } ,
31+ // {
32+ // reg: '^#即梦(检查|检测)?账号$',
33+ // fnc: 'check_Jimeng_Token',
34+ // permission: 'master'
35+ // },
36+ {
37+ reg : '^#即梦查?看?积分$' ,
38+ fnc : 'get_Jimeng_Points' ,
39+ permission : 'master'
40+ } ,
41+ {
42+ reg : '^#即梦(签到|领取积分)$' ,
43+ fnc : 'receive_Jimeng_Points' ,
44+ permission : 'master'
45+ }
3146 ]
3247 } )
3348 }
3449
50+ /** ^#即梦(画图|绘图|绘画|视频) */
3551 async call_Jimeng_Api ( e ) {
3652 // 判断是否为视频生成
3753 const isVideo = / ^ # 即 梦 视 频 / . test ( e . msg )
3854
3955 let msg = e . msg . replace ( / ^ # 即 梦 ( 画 图 | 绘 图 | 绘 画 | 视 频 ) ( \n * ) ? / , '' ) . trim ( )
4056 if ( msg === '帮助' ) {
41- const helpMsg = isVideo ? `[sf插件][即梦视频API]帮助:
57+ const helpMsg = isVideo ?
58+ `[sf插件][即梦视频API]帮助:
4259支持的ratio: 横图, 竖图, 方图, --1:1, --4:3, --3:4, --16:9, --9:16, --21:9
4360 注意:在图生视频模式下(有图片输入时),ratio参数将被忽略,视频比例由输入图片的实际比例决定。
44- 上传图片数: --upimgs 2
45- 更换模型: --model [jimeng-video-4.0-pro|jimeng-video-4.0|jimeng-video-3.5-pro|jimeng-video-veo3|jimeng-video-sora2]
61+ 上传图片数: --upimgs [1|2]
62+ 更换模型: --model [jimeng-video-4.0-pro|jimeng-video-4.0|jimeng-video-3.5-pro|jimeng-video-veo3|jimeng-video-veo3.1|jimeng-video- sora2|jimeng-video-3.0-pro|jimeng-video-3.0|jimeng-video-3.0-fast ]
4663更改时长:--duration [5|8|10|15]
4764更改分辨率:--resolution [720p|1080p]
4865引用图片:
@@ -51,17 +68,22 @@ export class Jimeng extends plugin {
5168 2张图片 → 首尾帧视频模式
5269
5370示例:
54- #即梦视频 一个女人在花园里跳舞 --9:16 --5秒` : `[sf插件][即梦API]帮助:
55- 默认的resolution: 2k
71+ #即梦视频 一个女人在花园里跳舞 --model jimeng-video-4.0 -- 9:16 --duration 5 --upimgs 1` :
72+ `[sf插件][即梦API]帮助:
5673支持的ratio: 横图, 竖图, 方图, --1:1, --4:3, --3:4, --16:9, --9:16, --3:2, --2:3, --21:9
57- 上传图片数: --upimgs 2
74+ 上传图片数: --upimgs [1|2]
75+ 更改分辨率:--resolution [1k|2k|4k]
5876参考图片强度: --reference_strength 0.8
59- 更换模型: --model [nanobanana|nanobananapro|jimeng-4.5]
77+ 更换模型: --model [nanobanana|nanobananapro|jimeng-4.5|jimeng-4.1|jimeng-4.0|jimeng-3.1|jimeng-3.0 ]
6078启用智能画幅比例: --intelligent_ratio true
6179负面提示词: ntags = [tags]
6280
81+ 其他指令:
82+ #即梦积分
83+ #即梦签到
84+
6385示例:
64- #即梦绘画 美丽的小少女,胶片感, 竖图, reference_strength = 0.8, --nanobanana , ntags = 丑陋的`
86+ #即梦绘画 美丽的小少女,胶片感, 竖图, --model nanobanana --resolution 2k , ntags = 丑陋的`
6587 e . reply ( helpMsg , true ) ;
6688 return true
6789 }
@@ -338,4 +360,131 @@ ${data.created ? `创建时间:${new Date(data.created * 1000).toLocaleString(
338360 }
339361 }
340362
363+ /** 获取所有配置的Token */
364+ _getAllTokens ( ) {
365+ const config_date = Config . getConfig ( )
366+ const tokens1 = config_date . Jimeng . sessionid ? config_date . Jimeng . sessionid . split ( ',' ) : [ ]
367+ const tokens2 = config_date . Jimeng . sessionid_ITN ? config_date . Jimeng . sessionid_ITN . split ( ',' ) : [ ]
368+ // 合并并去重,过滤空值
369+ const allTokens = [ ...new Set ( [ ...tokens1 , ...tokens2 ] ) ] . filter ( t => t && t . trim ( ) !== '' )
370+ return { allTokens, baseUrl : config_date . Jimeng . base_url }
371+ }
372+
373+ /** Token脱敏显示 */
374+ _maskToken ( token ) {
375+ if ( ! token || token . length < 10 ) return token
376+ return token . substring ( 0 , 6 ) + '...' + token . substring ( token . length - 4 )
377+ }
378+
379+ /** ^#即梦(检查|检测)?账号$ */
380+ async check_Jimeng_Token ( e ) {
381+ const { allTokens, baseUrl } = this . _getAllTokens ( )
382+ if ( allTokens . length === 0 ) {
383+ return e . reply ( '配置文件中未找到任何 Token' , true )
384+ }
385+
386+ await e . reply ( `开始检查 ${ allTokens . length } 个 Token 的状态...` , true )
387+ const statusList = [ ]
388+
389+ for ( const token of allTokens ) {
390+ try {
391+ const res = await axios . post ( `${ baseUrl } /token/check` , { token : token . trim ( ) } , {
392+ timeout : 10000 ,
393+ validateStatus : ( ) => true
394+ } )
395+ console . log ( "测试:res.data: " + JSON . stringify ( res . data , null , 2 ) )
396+ const isLive = res . data ?. live === true
397+ statusList . push ( `Token: ${ this . _maskToken ( token ) } \n状态: ${ isLive ? '✅ 有效' : '❌ 无效' } ` )
398+ } catch ( error ) {
399+ statusList . push ( `Token: ${ this . _maskToken ( token ) } \n状态: ⚠️ 请求失败 (${ error . message } )` )
400+ }
401+ }
402+
403+ const msg = await common . makeForwardMsg ( e , statusList , '即梦Token状态检查' )
404+ await e . reply ( msg )
405+ }
406+
407+ /** ^#即梦查?看?积分$ */
408+ async get_Jimeng_Points ( e ) {
409+ const { allTokens, baseUrl } = this . _getAllTokens ( )
410+ if ( allTokens . length === 0 ) return e . reply ( '未配置 Token' , true )
411+
412+ try {
413+ // 构造 Bearer Token 字符串(多个用逗号分隔)
414+ const authHeader = allTokens . join ( ',' )
415+
416+ const res = await axios . post ( `${ baseUrl } /token/points` , { } , {
417+ headers : { 'Authorization' : `Bearer ${ authHeader } ` } ,
418+ timeout : 15000 ,
419+ validateStatus : ( ) => true
420+ } )
421+
422+ const data = res . data
423+ if ( ! Array . isArray ( data ) ) {
424+ return e . reply ( `获取失败,返回格式错误: ${ JSON . stringify ( data ) } ` , true )
425+ }
426+
427+ const msgList = data . map ( item => {
428+ const pts = item . points || { }
429+ return `Token: ${ this . _maskToken ( item . token ) } \n` +
430+ `总积分: ${ pts . totalCredit || 0 } \n` +
431+ `赠送积分: ${ pts . giftCredit || 0 } \n` +
432+ `购买积分: ${ pts . purchaseCredit || 0 } \n` +
433+ `VIP积分: ${ pts . vipCredit || 0 } `
434+ } )
435+
436+ const msg = await common . makeForwardMsg ( e , msgList , `即梦积分查询 (${ data . length } 个)` )
437+ await e . reply ( msg )
438+
439+ } catch ( error ) {
440+ logger . error ( '[即梦查积分] Error:' , error )
441+ await e . reply ( `查询失败: ${ error . message } ` , true )
442+ }
443+ }
444+
445+ /** ^#即梦(签到|领取积分)$ */
446+ async receive_Jimeng_Points ( e ) {
447+ const { allTokens, baseUrl } = this . _getAllTokens ( )
448+ if ( allTokens . length === 0 ) return e . reply ( '未配置 Token' , true )
449+
450+ await e . reply ( '开始批量签到,请稍候...' , true )
451+
452+ try {
453+ const authHeader = allTokens . join ( ',' )
454+
455+ const res = await axios . post ( `${ baseUrl } /token/receive` , { } , {
456+ headers : { 'Authorization' : `Bearer ${ authHeader } ` } ,
457+ timeout : 30000 , // 签到可能较慢
458+ validateStatus : ( ) => true
459+ } )
460+
461+ const data = res . data
462+ if ( ! Array . isArray ( data ) ) {
463+ return e . reply ( `签到请求异常: ${ JSON . stringify ( data ) } ` , true )
464+ }
465+
466+ let successCount = 0
467+ const msgList = data . map ( item => {
468+ const pts = item . credits || { }
469+ const statusIcon = item . received ? '✅ 领取成功' : ( item . error ? '❌ 失败' : '⚪ 无需领取/已领' )
470+ if ( item . received ) successCount ++
471+
472+ let detail = `Token: ${ this . _maskToken ( item . token ) } \n结果: ${ statusIcon } `
473+ if ( item . error ) detail += `\n错误: ${ item . error } `
474+ detail += `\n当前总积分: ${ pts . totalCredit || 0 } `
475+ return detail
476+ } )
477+
478+ const summary = `批量签到完成\n总数: ${ allTokens . length } \n成功领取: ${ successCount } `
479+ msgList . unshift ( summary )
480+
481+ const msg = await common . makeForwardMsg ( e , msgList , '即梦每日签到结果' )
482+ await e . reply ( msg )
483+
484+ } catch ( error ) {
485+ logger . error ( '[即梦签到] Error:' , error )
486+ await e . reply ( `签到请求失败: ${ error . message } ` , true )
487+ }
488+ }
489+
341490}
0 commit comments