linejs について
LINE Messengerプロトコル向けのTypeScript中心のクライアントライブラリです。LINEのThriftバイナリ形式を直接扱い、E2EEとイベントポーリングに対応し、LINEボットやサービスメソッドを扱う開発者向けです。
主な機能
- 01Thriftバイナリプロトコルを直接処理
- 02E2EEとイベントポーリングに対応
- 03ベースクライアントと上位ラッパー
- 0430以上のサービスと130以上のメソッド
- 05プロフィール、メッセージ、チャット操作
活用シーン
- 01LINEボットの構築
- 02チャットメッセージの送受信と復号
- 03LINEサービスRPCの呼び出し
- 04プロフィールとチャットの管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ evex-dev/ linejs --skill linejsインストール後、Claude Code で/linejsを入力して読み込まれたか確認します。
詳細
linejs
@evex/linejs は、LINE Messenger プロトコル向けの TypeScript ファーストなクライアントライブラリです。LINE の Thrift バイナリワイヤ形式を直接扱い、E2EE とイベントのポーリングをサポートし、CHRLINE-Patch がカバーするメソッド用の手書きラッパーを提供します。
このスキルはロードマップであり、マニュアルではありません。ライブラリは急速に進化します。すぐに古くなる詳細を固定するのではなく、必要に応じて参照すべき正規のソースを示します。
インストール
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
| やりたいこと | 参照先 |
|---|---|
| ログイン(QR/メール) | packages/linejs/base/login/mod.ts — v2.7 以降は ForSecure RPC を使用します。従来の createQrCode はサーバーに拒否されます |
| メッセージの送受信 | packages/linejs/client/features/message/ および BaseClient.talk.sendMessage |
| LINE がサポートする任意の Thrift RPC | packages/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 を参照 |
| チャットの BGM | 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 REST | client.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 — LINE Android が WebView で開く、Yahoo の検索エージェント SSE バックエンドをラップします。Yahoo のセッションクッキーが必要です。LINE はこれを発行しません |
| E2EE プリミティブ | packages/linejs/base/e2ee/mod.ts — AES-GCM-SIV、ECDH、暗号化された QR 識別子の復号、キーチェーンなど |
| 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 QR ログインが必須です(
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を返す場合は、デバイスタイプを切り替えるか、従来の代替手段を使用してください。
バグ/問題
https://github.com/evex-dev/linejs/issues に報告してください。報告には、次の情報を含めると役立ちます。
- linejs のバージョン(
deno info jsr:@evex/linejsで解決済みのバージョンを確認できます) - 対象とするデバイスタイプと LINE アプリのバージョン
- 最小限の再現例:問題を再現する最小のコードと、
Request internal failed: status=… headers=… body=<…>のエラー(v2.7+ では、例外メッセージに HTTP ステータス/ヘッダーが含まれるため、原因の切り分けに非常に役立ちます) - QR ログイン関連の場合:どの手順で発生したか(
createSession、createQrCodeForSecure、checkQrCodeVerified、qrCodeLoginV2ForSecure)と、出力されている場合は[login] ForSecure: maxCount=… intervalSec=… nonce=…のデバッグ行
CHRLINE-Patch 互換の動作に関する報告(例:「この RPC は CHRLINE では動作するが、linejs では動作しない」)も役立ちます。メソッド名をお知らせいただければ、こちらで移植します。
このスキルに意図的に含めていないもの
- 固定された API シグネチャ。変更されるため、ソースを参照してください。
- ラップされたすべてのメソッドの一覧。130 以上あるため、現在の一覧は
packages/linejs/base/service/を参照してください。 - LINE Android のリバースエンジニアリングの詳細。Discord に参加してください。