mcpField
L
linejs

linejs

github.com/evex-dev开发41967 次安装3 周前更新
代码仓库

关于 linejs

面向 TypeScript 的 LINE Messenger 协议客户端库,直接使用 LINE 的 Thrift 二进制协议,并提供 E2EE 与事件轮询能力。适合构建 LINE 机器人及调用 LINE 服务方法的开发者。

主要功能

  1. 01直接处理 Thrift 二进制协议
  2. 02支持 E2EE 与事件轮询
  3. 03提供基础客户端和高级封装
  4. 04覆盖 30+ 服务及 130+ 方法
  5. 05支持资料、消息和聊天操作

适用场景

  1. 01构建 LINE 机器人
  2. 02收发并解密聊天消息
  3. 03调用 LINE 服务 RPC
  4. 04管理个人资料与聊天

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/evex-dev/linejs --skill linejs

安装后在 Claude Code 中输入/linejs确认已加载。

详细介绍

linejs

@evex/linejs 是一个以 TypeScript 为先的 LINE Messenger 协议客户端库。它直接使用 LINE 的 Thrift 二进制线路格式,支持端到端加密(E2EE)、轮询事件,并提供了针对 CHRLINE-Patch 所涵盖方法的手写封装。

此技能是一份路线图,而不是手册。该库发展迅速;为了避免固定那些很快就会过时的细节,本文会指引 Agent 按需阅读权威资料。

安装

deno add jsr:@evex/linejs
# Types are also available standalone:
deno add jsr:@evex/linejs-types

最新版本:请查看 JSR — https://jsr.io/@evex/linejs,或运行 curl -s https://jsr.io/@evex/linejs/meta.json | jq -r .latest。技能提示词不会固定版本;请在用户代码中固定版本。

最简可用机器人

import { BaseClient } from "@evex/linejs/base";
import { FileStorage } from "@evex/linejs/storage";

const storage = new FileStorage("./storage.json");
const client = new BaseClient({ device: "DESKTOPWIN", storage });

client.on("qrcall",  (url) => console.log("scan:", url));
client.on("pincall", (pin) => console.log("PIN:", pin));
client.on("update:authtoken", (t) => storage.set(".auth", t));

const cached = await storage.get(".auth");
await client.loginProcess.login(
    typeof cached === "string" ? { authToken: cached } : {},
);

for await (const op of client.createPolling().listenTalkEvents()) {
    if (op.type === "RECEIVE_MESSAGE" || op.type === "SEND_MESSAGE") {
        const msg = await client.e2ee.decryptE2EEMessage(op.message);
        if (msg.text === "!ping") {
            await client.talk.sendMessage({
                to: msg.to === client.profile?.mid ? msg.from : msg.to,
                text: "pong!",
                e2ee: !!op.message.chunks,
            });
        }
    }
}

这就是最小但实用的机器人。若需要更丰富的功能,可从 @evex/linejs 中的 Client 封装开始(它基于 BaseClient 构建)——它提供 getMyProfile()、updateMy{DisplayName,StatusMessage,Profile}()、fetchJoinedChats()、getChat()、getUser()、uploadMyProfileImage()、uploadMyProfileBackground() 等方法。

路线图 — 查找内容的位置

无论哪种情况,查看最新代码都是最佳选择。 https://github.com/evex-dev/linejs

你想要……查看
登录(二维码/电子邮件)packages/linejs/base/login/mod.ts — 从 v2.7 起使用 ForSecure RPC;旧版 createQrCode 会被服务器拒绝
发送/接收消息packages/linejs/client/features/message/ 和 BaseClient.talk.sendMessage
LINE 支持的任意 Thrift RPCpackages/linejs/base/service/*/mod.ts — 每个 LINE 服务都有一个封装(30 多个服务、130 多个方法)
更改个人资料属性client.updateMyProfile({...})/参见 packages/linejs/client/features/profile.ts
重命名/设为最爱/静音好友User.rename()/User.setFavorite() 等 — 参见 packages/linejs/client/features/user/mod.ts
聊天背景音乐Chat.getBgm()/Chat.setBgm()
LIFF 分享/令牌client.liff.shareMessages(chatMid, [...]) 和 client.liff.getToken({ liffId, chatMid }) — 消息构建器(text/sticker/image/flex)参见 packages/linejs/client/features/liff.ts。更底层的接口位于 client.liff.service/BaseClient.liff。
VOOM/时间线/Note RESTclient.voomRest({ path, channelToken }) — 对 gw.line.naver.jp/mh/api/v{34,40,52,57}/... 网关的底层封装。先获取频道令牌:await client.base.channel.issueChannelToken({ channelId: VoomChannelId.TIMELINE })(注意:参数是对象,不是位置字符串)。DESKTOPWIN 设备无法执行此操作 — 请使用 device: "ANDROIDSECONDARY"。添加 Bearer 令牌后,网关会从 401 转为 504 — 下游剩余错误已在 #151 跟踪。
联系人的日历事件User.fetchCalendarEvents() — 请注意,服务器会限制部分客户端设备类型(目前 DESKTOPWIN 不支持)
在此设备上批准 PIN 登录client.base.loginProcess.respondE2EELoginRequest({ verifier, publicKey, encryptedKeyChain, hashKeyChain, errorCode? }) — 这是 confirmE2EELogin 在主设备一侧的对应方法。当此客户端收到来自用户希望允许登录的另一台设备的 PIN 登录通知时调用。
上传个人资料图片/封面client.uploadMyProfileImage(blob)/client.uploadMyProfileBackground(blob)
Agent I(LINE 聊天标签页中的 AI 搜索)@evex/linejs-agent — 封装 Yahoo 的搜索 Agent SSE 后端,该后端由 LINE Android 在 WebView 中打开。需要 Yahoo 会话 Cookie;LINE 不会为其签发 Cookie。
E2EE 原语packages/linejs/base/e2ee/mod.ts — AES-GCM-SIV、ECDH、解密加密的二维码标识符、密钥链等
Thrift 架构packages/types/thrift.ts(数据)+ packages/types/line_types.ts(TS 接口)。两者都通过 deno task apk:sync 从 LINE Android APK 自动同步。

如有疑问,请阅读 packages/linejs/client/features/ 下的源代码 — 功能类很精简,读起来就像文档。

已知限制

  • LINE 26+ 需要使用 ForSecure 二维码登录(createQrCodeForSecure + qrCodeLoginV2ForSecure)。旧版 createQrCode 会被服务端静默判定为已过期。linejs v2.7+ 默认使用 ForSecure;旧版本无法登录。
  • map<i32, V> 编码在 v2.7 之前无法处理 JS 对象键:JS 键是字符串,编码器会拒绝它们。此问题已在 v2.7 修复。如果你面向的是较旧的 linejs,请将映射构建为 NestedArray 元组。
  • 大多数聊天消息都需要进行 E2EE 解密——参见 client.e2ee.decryptE2EEMessage(op.message)。不要直接读取 op.message.text。
  • Agent I 需要 Yahoo Cookie。LINE Android 应用会使用用户已有的 Yahoo 会话加载 WebView;以编程方式使用时,你必须自行获取这些 Cookie(登录 Yahoo Japan → 提取 Cookie)。linejs 提供调用方式,不提供身份验证。
  • 设备类型会影响功能开关。DESKTOPWIN 缺少 ANDROID 支持的若干 API(例如 getContactsV3、getContactCalendarEvents)。对于纯机器人用途,通常使用 DESKTOPWIN 就足够;如果方法返回 API method not capable,请切换设备类型或使用旧版替代方案。

Bug / 问题

请通过 https://github.com/evex-dev/linejs/issues 报告。建议提供以下背景信息:

  • linejs 版本(deno info jsr:@evex/linejs 会显示解析后的版本)
  • 目标设备类型和 LINE 应用版本
  • 最小复现示例:能够复现问题的最短代码片段,以及 Request internal failed: status=… headers=… body=<…> 错误(v2.7+ 会在抛出的消息中包含 HTTP 状态码 / 标头,非常有助于问题排查)
  • 如果与二维码登录有关:具体步骤(createSession、createQrCodeForSecure、checkQrCodeVerified、qrCodeLoginV2ForSecure),以及是否打印了 [login] ForSecure: maxCount=… intervalSec=… nonce=… 调试行。

也欢迎报告与 CHRLINE-Patch 兼容性相关的行为(例如“此 RPC 在 CHRLINE 中可用,但在 linejs 中不可用”)——请注明方法名称,我们会移植它。

本技能特意不包含的内容

  • 固定不变的 API 签名——它们会变化。请阅读源代码。
  • 所有封装方法的列表——方法有 130 多个;实时列表请参见 packages/linejs/base/service/。
  • LINE Android 的逆向工程细节——欢迎加入我们的 Discord。

评论

支持 Markdown