xanalys:推特实时推送 + 推文内容截图

npm

全程需✨🧙‍♂️,请在proxy-agent内配置代理

跟随系统代理方式:在proxy-agent代理服务器地址填写http://127.0.0.1:7890

数据来源于 nitter.net


教程与指令介绍:

⭐️推文翻译功能需要前往deepseek开放平台申请API Keys并充值⭐️

twitter

    · 输入twitter 推特帖子链接即可获取此帖子的截图

    例: twitter https://x.com/tim_cook/status/1914665497565798835

    返回结果:


    1.0.3版本对于此命令已支持获取帖子内容+翻译+获取具体图片

tt:

    · 发送tt后会自动检查一遍当前订阅的博主的最新推文(实验性)


配置项注意:

  • apiKey(deepseek-api令牌):

效果演示:

开启日志输出的后台:

3 个赞

饼:
1、将推送历史放入数据库(目前版本重启插件后会清空推送历史),实现数据持久化
2、支援单博主多个群聊推送
3、接入价格更加低廉的翻译api或者免费api(如果有相关方案可以来交流)
4、把现在的翻译说明去了

如果对此插件有兴趣的欢迎一起参与。

3 个赞

1.0.0更新:
1、实现数据持久化,开启插件或者更新列表后不会被推文刷屏
【现在开启插件后会逐个将订阅列表中的博主和其最新推文链接存入数据库,然后才会开始监听并推送更新的推文】
2、实现单博主推文推送至多个群聊
3、优化了翻译结果

此版本之后,此项目暂缓更新
感谢支持 :partying_face:

2 个赞

反转了,又更新了
1.0.3更新
1、修复了required和default复用导致的翻译功能无法使用的bug
2、为推文截图命令twitter,增加了翻译推文内容+获取推文图片功能,不只是单纯的截图
3、对数据库中已存在的博主不再重复初始化,大幅提升插件初始化速度
4、增加了更多的日志输出信息
5、现已支持第三方翻译api平台:siliconflow,具体使用方法请见插件页说明

这下真的燃尽惹

2 个赞

插件有时会突然把之前的推文当做新的更新发出来。

比如最新一条是半小时前,正常推送后,突然把4小时前的一条推文作为更新写入数据库了,再过一段时间又会把真正最新的推文发一遍。

只订阅了一位博主,未启用翻译,平台是onebot,手动清空数据库再初始化也没用

1 个赞

1、看一下日志里的具体链接:eyes:
2、这个问题是偶尔有还是一直有
3、有没有使用docker

1 个赞
  • 日志如下
部分log
{"id":19385,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"当前时间: 2025/05/13 08:19:33 本次请求的博主与链接: high_socks_fun https://nitter.net/high_socks_fun","timestamp":1747095573710}
{"id":19386,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"主函数返回的推文信息: [ { link: \u001b[32m'/high_socks_fun/status/1921954488346099888#m'\u001b[39m, isRetweet: \u001b[33mfalse\u001b[39m } ]","timestamp":1747095577356}
{"id":19388,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"当前已存储推文历史: /high_socks_fun/status/1921958111637561550#m","timestamp":1747095577358}
{"id":19389,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"本次获取的最新推文: /high_socks_fun/status/1921954488346099888#m","timestamp":1747095577363}
{"id":19392,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"拼接后的推文url: https://nitter.net/high_socks_fun/status/1921954488346099888#m","timestamp":1747095577370}
{"id":19396,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"\n                推文文字:【予約 6/11発売 DVD】\n『【数量限定】 小悪魔挑発美少女 逢沢みゆ  ※チェキ付き』\n出演: #逢沢みゆ @Aizawa_miyu03 #MARRION\n↓\nal.dmm.co.jp/?lurl=https%3A%…\n\n*ダウンロード*\nal.dmm.co.jp/?lurl=https%3A%…\n                推文图片url:\n              ","timestamp":1747095580472}
{"id":19475,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"当前时间: 2025/05/13 08:27:33 本次请求的博主与链接: high_socks_fun https://nitter.net/high_socks_fun","timestamp":1747096053711}
{"id":19476,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"主函数返回的推文信息: [ { link: \u001b[32m'/high_socks_fun/status/1921958111637561550#m'\u001b[39m, isRetweet: \u001b[33mfalse\u001b[39m } ]","timestamp":1747096057850}
{"id":19478,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"当前已存储推文历史: /high_socks_fun/status/1921954488346099888#m","timestamp":1747096057853}
{"id":19479,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"本次获取的最新推文: /high_socks_fun/status/1921958111637561550#m","timestamp":1747096057854}
{"id":19482,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"拼接后的推文url: https://nitter.net/high_socks_fun/status/1921958111637561550#m","timestamp":1747096057860}
{"id":19484,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"\n                推文文字:【予約 6/11発売 BD】\n『【数量限定】最強ヒロインに会える風俗店 瀬戸環奈 (ブルーレイディスク)  ※生写真3枚付き』\n出演: #瀬戸環奈 @kanna_seto0510  #エスワン\n↓\nal.dmm.co.jp/?lurl=https%3A%…\n\n*ダウンロード*\nal.dmm.co.jp/?lurl=https%3A%…\n                推文图片url:/pic/media%2FGqwqUzPWQAAgRcK.jpg%3Fname%3Dsmall%26format%3Dwebp\n              ","timestamp":1747096061104}
{"id":19604,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"当前时间: 2025/05/13 08:35:33 本次请求的博主与链接: high_socks_fun https://nitter.net/high_socks_fun","timestamp":1747096533711}
{"id":19606,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"主函数返回的推文信息: [ { link: \u001b[32m'/high_socks_fun/status/1921954488346099888#m'\u001b[39m, isRetweet: \u001b[33mfalse\u001b[39m } ]","timestamp":1747096539429}
{"id":19608,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"当前已存储推文历史: /high_socks_fun/status/1921958111637561550#m","timestamp":1747096539431}
{"id":19609,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"本次获取的最新推文: /high_socks_fun/status/1921954488346099888#m","timestamp":1747096539431}
{"id":19612,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"拼接后的推文url: https://nitter.net/high_socks_fun/status/1921954488346099888#m","timestamp":1747096539436}
{"id":19613,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"\n                推文文字:【予約 6/11発売 DVD】\n『【数量限定】 小悪魔挑発美少女 逢沢みゆ  ※チェキ付き』\n出演: #逢沢みゆ @Aizawa_miyu03 #MARRION\n↓\nal.dmm.co.jp/?lurl=https%3A%…\n\n*ダウンロード*\nal.dmm.co.jp/?lurl=https%3A%…\n                推文图片url:\n              ","timestamp":1747096542467}
{"id":19694,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"当前时间: 2025/05/13 08:43:33 本次请求的博主与链接: high_socks_fun https://nitter.net/high_socks_fun","timestamp":1747097013712}
{"id":19695,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"主函数返回的推文信息: [ { link: \u001b[32m'/high_socks_fun/status/1921958111637561550#m'\u001b[39m, isRetweet: \u001b[33mfalse\u001b[39m } ]","timestamp":1747097017422}
{"id":19697,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"当前已存储推文历史: /high_socks_fun/status/1921954488346099888#m","timestamp":1747097017425}
{"id":19698,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"本次获取的最新推文: /high_socks_fun/status/1921958111637561550#m","timestamp":1747097017426}
{"id":19701,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"拼接后的推文url: https://nitter.net/high_socks_fun/status/1921958111637561550#m","timestamp":1747097017438}
{"id":19705,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"\n                推文文字:【予約 6/11発売 BD】\n『【数量限定】最強ヒロインに会える風俗店 瀬戸環奈 (ブルーレイディスク)  ※生写真3枚付き』\n出演: #瀬戸環奈 @kanna_seto0510  #エスワン\n↓\nal.dmm.co.jp/?lurl=https%3A%…\n\n*ダウンロード*\nal.dmm.co.jp/?lurl=https%3A%…\n                推文图片url:/pic/media%2FGqwqUzPWQAAgRcK.jpg%3Fname%3Dsmall%26format%3Dwebp\n              ","timestamp":1747097020908}
{"id":20013,"type":"info","level":2,"name":"loader","meta":{"paths":[]},"content":"unload plugin \u001b[38;5;45mxanalyse:szsgyr\u001b[0m","timestamp":1747097132811}
{"id":20014,"type":"info","level":2,"name":"loader","meta":{"paths":[]},"content":"apply plugin \u001b[38;5;45mxanalyse:szsgyr\u001b[0m","timestamp":1747097133977}
{"id":20015,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"数据库初始化成功","timestamp":1747097133980}
{"id":20016,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"[初始化]当前时间: 2025/05/13 08:45:33 本次请求的博主: high_socks_fun 链接: https://nitter.net/high_socks_fun","timestamp":1747097133983}
{"id":20017,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"[初始化]当前博主推送群号: [ \u001b[32m'2163020343'\u001b[39m ]","timestamp":1747097133983}
{"id":20053,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"[初始化]主函数返回的推文信息: /high_socks_fun/status/1921954488346099888#m","timestamp":1747097137729}
{"id":20057,"type":"info","level":2,"name":"xanalyse","meta":{},"content":"初始化加载订阅成功!","timestamp":1747097137737}
  • 偶尔有,前天晚上来回发了一晚上,昨天晚上没有,但昨天白天有过
  • 没有用docker
1 个赞

这个是最新版本1.0.3吗?如果不是的话更新一下再试试
我下班之后看下日志里的链接再看看问题 :raised_hand:

如果今天白天又出现了这个问题,请把出现问题的那段日志也再发一下,感觉可能是转推导致问题

1 个赞

是最新版

1 个赞

能不能在插件内单独加个代理配置 这个插件不知道为什么走不了我配的全局代理

1 个赞

全局代理的情况下,是不是推文能正常推送,但是推文的图片无法获取?

获取推文截图的方法是使用puppeteer,这个只需要电脑能访问外网即可。
而获取推文图片的方式是http请求,我也试过全局代理可是也是无法get到图片,所以还是使用规则代理,然后到proxy-agent插件里去设置跟随本地代理比较好

至于【插件内单独增加代理配置】我暂时还没有头绪 :disappointed_relieved:

1 个赞

推文也不行 提示的是获取推文内容失败 具体日志我一会下班回去发一下 我是docker部署的 pupeteer用的无头模式(不开好像提示缺少依赖我就没用) 查了clash的日志完全就是没有请求记录 测试其他插件都是能正常走全局代理的

1 个赞

docker…确实没用过,不太了解
好像另一个兄弟也是docker也是这个问题

发几个插件名字给我 我参考一下看看。

1 个赞

pixluna 有单独的代理配置 我不开也能走全局的


报错日志是这个

日志
`2025-05-15 17:56:09 [I] xanalyse 开始请求的推文连接: https://x.com/maebashiwitches/status/1922864516599071020`

`2025-05-15 17:57:11 [I] xanalyse 获取推文截图过程失败 TypeError: Cannot read properties of undefined (reading 'imgUrls') at _Command.<anonymous> (/koishi/node_modules/koishi-plugin-xanalyse/lib/index.js:140:41) at async Array.<anonymous> (/koishi/node_modules/@koishijs/core/lib/index.cjs:1083:14) at async _Command.execute (/koishi/node_modules/@koishijs/core/lib/index.cjs:1097:22) at async /koishi/node_modules/@koishijs/core/lib/index.cjs:2066:22 at async Proxy.withScope (/koishi/node_modules/@koishijs/core/lib/index.cjs:1975:22) at async next (/koishi/node_modules/@koishijs/core/lib/index.cjs:829:16) at async next (/koishi/node_modules/@koishijs/core/lib/index.cjs:829:16) at async next (/koishi/node_modules/@koishijs/core/lib/index.cjs:829:16) at async next (/koishi/node_modules/@koishijs/core/lib/index.cjs:829:16) at async Processor._handleMessage (/koishi/node_modules/@koishijs/core/lib/index.cjs:840:22) { session: Session { id: 285, sn: 285, event: { selfId: '', platform: 'onebot', timestamp: 1747302968000, type: 'message-created', message: { messageId: '110231803', id: '110231803', elements: [ Element { type: 'text', attrs: { content: 'twitter ' }, children: [] }, Element { type: 'text', attrs: { content: 'https://x.com/maebashiwitches/status/1922864516599071020' }, children: [] } ], content: 'twitter https://x.com/maebashiwitches/status/1922864516599071020' }, user: { id: '', name: '', userId: '', avatar: 'http://q.qlogo.cn/headimg_dl?dst_uin=&spec=640', username: '' }, member: { user: { id: '', name: '', userId: '', avatar: 'http://q.qlogo.cn/headimg_dl?dst_uin=&spec=640', username: '' }, nick: '', roles: [ 'owner' ] }, guild: { id: '' }, channel: { id: '', type: 0 }, subtype: 'group', subsubtype: 'group', _type: 'onebot', _data: { self_id: , user_id: , time: 1747302968, message_id: 110231803, message_seq: 110231803, real_id: 110231803, real_seq: '1198', message_type: 'group', sender: { user_id: , nickname: '', card: '', role: 'owner' }, raw_message: 'twitter https://x.com/maebashiwitches/status/1922864516599071020', font: 14, sub_type: 'normal', message: [ { type: 'text', data: { text: 'twitter ' } }, { type: 'text', data: { text: 'https://x.com/maebashiwitches/status/1922864516599071020' } } ], message_format: 'array', post_type: 'message', group_id:  } }, locales: [], _stripped: { hasAt: false, content: 'twitter https://x.com/maebashiwitches/status/1922864516599071020', appel: false, atSelf: false, prefix: '' }, guild: { flag: 0, assignee: '', guildId: '', permissions: [], locales: [], platform: 'onebot', id: '' }, channel: { flag: 0, assignee: '', guildId: '', permissions: [], locales: [], platform: 'onebot', id: '' }, user: { id: 0, flag: 0, authority: 5, permissions: [], locales: [] }, scope: 'commands.twitter.messages', [Symbol(cordis.tracker)]: { associate: 'session', property: 'ctx' } } }`
1 个赞

我在proxy-agent设置代理也无效,但是可以在puppeteer设置Chromium 参数–proxy-server

请求增加多个机器人账号设置功能(我感觉机器人账号设置有点多余了)
“tt"指令只回复了"正在检查更新…”,希望对无新推文增加提示

1 个赞

是的,我也是docker,无法获取,提示获取xxx的推但是内容是空的

1 个赞

请问这样设置之后能成功获取推文内容吗?

后面我会有些忙,不太有时间更新 :disappointed_relieved:

1 个赞

能成功获取推文,图片也能正常获取,不过我用的不是docker

1 个赞

好滴,能获取就行。参数具体设置方法方便截图一下吗?我下次更新卸载readme里面

然后多bot我有空会适配的。还有增加tt指令的提示(不过tt指令我本意是出现问题的时候调试用的,主要是看日志的输出,日常无需使用)

1 个赞

1 个赞