Claim this agent
Agent DossierCLAWHUBSafety 84/100

Xpersona Agent

line-client

LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- name: line-client description: LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- LINE Client Skill Full LINE messaging client via the Chrome extension gateway JSON API. Repo & Files - **Repo:** /da

OpenClaw · self-declared
Trust evidence available
clawhub skill install skills:2manslkh:line-client

Overall rank

#62

Adoption

No public adoption signal

Trust

Unknown

Freshness

Feb 25, 2026

Freshness

Last checked Feb 25, 2026

Best For

line-client is best for qr, replies workflows where OpenClaw compatibility matters.

Not Ideal For

Contract metadata is missing or unavailable for deterministic execution.

Evidence Sources Checked

editorial-content, CLAWHUB, runtime-metrics, public facts pack

Overview

Key links, install path, reliability highlights, and the shortest practical read before diving into the crawl record.

Verifiededitorial-content

Overview

Executive Summary

LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- name: line-client description: LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- LINE Client Skill Full LINE messaging client via the Chrome extension gateway JSON API. Repo & Files - **Repo:** /da Capability contract not published. No trust telemetry is available yet. Last updated 4/15/2026.

No verified compatibility signals

Trust score

Unknown

Compatibility

OpenClaw

Freshness

Feb 25, 2026

Vendor

Openclaw

Artifacts

0

Benchmarks

0

Last release

Unpublished

Install & run

Setup Snapshot

clawhub skill install skills:2manslkh:line-client
  1. 1

    Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.

  2. 2

    Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.

Evidence & Timeline

Public facts grouped by evidence type, plus release and crawl events with provenance and freshness.

Verifiededitorial-content

Public facts

Evidence Ledger

Vendor (1)

Vendor

Openclaw

profilemedium
Observed Apr 15, 2026Source linkProvenance
Compatibility (1)

Protocol compatibility

OpenClaw

contractmedium
Observed Apr 15, 2026Source linkProvenance
Security (1)

Handshake status

UNKNOWN

trustmedium
Observed unknownSource linkProvenance
Integration (1)

Crawlable docs

6 indexed pages on the official domain

search_documentmedium
Observed Apr 15, 2026Source linkProvenance

Artifacts & Docs

Parameters, dependencies, examples, extracted files, editorial overview, and the complete README when available.

Self-declaredCLAWHUB

Captured outputs

Artifacts Archive

Extracted files

0

Examples

5

Snippets

0

Languages

typescript

Parameters

Executable Examples

python

import json
from pathlib import Path
from src.chrome_client import LineChromeClient

tokens = json.loads((Path.home() / ".line-client" / "tokens.json").read_text())
client = LineChromeClient(auth_token=tokens["auth_token"])

# Send a message
client.send_message("U...", "Hello!")

# Get profile
profile = client.get_profile()

python

from src.hmac import HmacSigner
from src.auth.qr_login import QRLogin
import qrcode

signer = HmacSigner(mode="server")
login = QRLogin(signer)
result = login.run(
    on_qr=lambda url: send_qr_image_to_user(qrcode.make(url)),
    on_pin=lambda pin: send_pin_to_user_IMMEDIATELY(pin),  # TIME SENSITIVE!
    on_status=lambda msg: print(msg),
)
# result.auth_token, result.mid, result.refresh_token

bash

python scripts/qr_login_server.py /tmp/qr.png

python

from src.chrome_client import APIError

try:
    client.send_message(mid, "test")
except APIError as e:
    print(e.code, e.api_message)
    # 10051 = session expired / invalid
    # 10052 = HTTP error from backend
    # 10102 = invalid arguments

text

User's Phone (LINE app)
    ↕ (scan QR / enter PIN)
LINE Servers (line-chrome-gw.line-apps.com)
    ↕ (JSON REST + X-Hmac signing)
LineChromeClient (this repo)
    ↕ (WASM HMAC via Node.js signer)
lstm.wasm + lstmSandbox.js

Editorial read

Docs & README

Docs source

CLAWHUB

Editorial quality

ready

LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- name: line-client description: LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com). --- LINE Client Skill Full LINE messaging client via the Chrome extension gateway JSON API. Repo & Files - **Repo:** /da

Full README

name: line-client description: LINE messaging integration via Chrome extension gateway. Send/read LINE messages, manage contacts, groups, profile, and reactions. Authenticate with QR code login. Provides HMAC-signed API access through the Chrome extension gateway (line-chrome-gw.line-apps.com).

LINE Client Skill

Full LINE messaging client via the Chrome extension gateway JSON API.

Repo & Files

  • Repo: /data/workspace/line-client (github.com/2manslkh/line-api)
  • Main client: src/chrome_client.pyLineChromeClient
  • QR login: src/auth/qr_login.pyQRLogin
  • HMAC signer: src/hmac/signer.js (Node.js, auto-starts on port 18944)
  • Token storage: ~/.line-client/tokens.json
  • Certificate cache: ~/.line-client/sqr_cert
  • WASM files: lstm.wasm + lstmSandbox.js (required, in repo root)

Quick Start

import json
from pathlib import Path
from src.chrome_client import LineChromeClient

tokens = json.loads((Path.home() / ".line-client" / "tokens.json").read_text())
client = LineChromeClient(auth_token=tokens["auth_token"])

# Send a message
client.send_message("U...", "Hello!")

# Get profile
profile = client.get_profile()

Tokens expire in ~7 days. If expired (APIError(10051)), re-run QR login.

QR Login (Authentication)

QR login requires user interaction: scan QR on phone + enter PIN.

from src.hmac import HmacSigner
from src.auth.qr_login import QRLogin
import qrcode

signer = HmacSigner(mode="server")
login = QRLogin(signer)
result = login.run(
    on_qr=lambda url: send_qr_image_to_user(qrcode.make(url)),
    on_pin=lambda pin: send_pin_to_user_IMMEDIATELY(pin),  # TIME SENSITIVE!
    on_status=lambda msg: print(msg),
)
# result.auth_token, result.mid, result.refresh_token

Critical: The PIN must reach the user within ~60 seconds. Send it the instant on_pin fires.

QR Login State Machine

  1. createSession → session ID
  2. createQrCode → callback URL (append ?secret={curve25519_pubkey}&e2eeVersion=1)
  3. checkQrCodeVerified — poll until scan (uses X-Line-Session-ID, no origin header)
  4. verifyCertificate — MUST be called even if it fails (required state transition!)
  5. createPinCode → 6-digit PIN (skip if cert verified in step 4)
  6. checkPinCodeVerified — poll until user enters PIN
  7. qrCodeLoginV2 → JWT token + certificate + refresh token

Server-Side Login Script

python scripts/qr_login_server.py /tmp/qr.png

Emits JSON events on stdout: {"event": "qr", "path": "...", "url": "..."}, {"event": "pin", "pin": "123456"}, {"event": "done", "mid": "U..."}.

All API Methods

Contacts & Friends

| Method | Args | Description | |--------|------|-------------| | get_profile() | — | Get your own profile (displayName, mid, statusMessage, etc.) | | get_contact(mid) | mid: str | Get a single contact's profile | | get_contacts(mids) | mids: list[str] | Get multiple contacts | | get_all_contact_ids() | — | List all friend MIDs | | find_contact_by_userid(userid) | userid: str | Search by LINE ID | | find_and_add_contact_by_mid(mid) | mid: str | Add friend by MID | | find_contacts_by_phone(phones) | phones: list[str] | Search by phone numbers | | add_friend_by_mid(mid) | mid: str | Add friend (RelationService) | | get_blocked_contact_ids() | — | List blocked MIDs | | get_blocked_recommendation_ids() | — | List blocked recommendations | | block_contact(mid) | mid: str | Block a contact | | unblock_contact(mid) | mid: str | Unblock a contact | | block_recommendation(mid) | mid: str | Block a friend suggestion | | update_contact_setting(mid, flag, value) | mid, flag: int, value: str | Update contact setting (e.g. mute) | | get_favorite_mids() | — | List favorited contact MIDs | | get_recommendation_ids() | — | List friend suggestions |

Messages

| Method | Args | Description | |--------|------|-------------| | send_message(to, text, ...) | to: str, text: str, reply_to: str (opt) | Send a text message. Supports replies via reply_to=message_id | | unsend_message(message_id) | message_id: str | Unsend/delete a sent message | | get_recent_messages(chat_id, count=50) | chat_id: str | Get latest messages in a chat | | get_previous_messages(chat_id, end_seq, count=50) | chat_id, end_seq: int | Paginated history (older messages) | | get_messages_by_ids(message_ids) | message_ids: list[str] | Fetch specific messages | | get_message_boxes(count=50) | — | Get chat list with last message (inbox view) | | get_message_boxes_by_ids(chat_ids) | chat_ids: list[str] | Get specific chats with last message | | get_message_read_range(chat_ids) | chat_ids: list[str] | Get read receipt info | | send_chat_checked(chat_id, last_message_id) | chat_id, last_message_id: str | Mark messages as read | | send_chat_removed(chat_id, last_message_id) | chat_id, last_message_id: str | Remove chat from inbox | | send_postback(to, postback_data) | to, postback_data: str | Send postback (bot interactions) |

Chats & Groups

| Method | Args | Description | |--------|------|-------------| | get_chats(chat_ids, with_members=True, with_invitees=True) | chat_ids: list[str] | Get chat/group details | | get_all_chat_mids() | — | List all chat MIDs (groups + invites) | | create_chat(name, target_mids) | name: str, target_mids: list[str] | Create a new group chat | | accept_chat_invitation(chat_id) | chat_id: str | Accept group invite | | reject_chat_invitation(chat_id) | chat_id: str | Reject group invite | | invite_into_chat(chat_id, mids) | chat_id: str, mids: list[str] | Invite users to group | | cancel_chat_invitation(chat_id, mids) | chat_id: str, mids: list[str] | Cancel pending invites | | delete_other_from_chat(chat_id, mids) | chat_id: str, mids: list[str] | Kick members from group | | leave_chat(chat_id) | chat_id: str | Leave a group chat | | update_chat(chat_id, updates) | chat_id: str, updates: dict | Update group name/settings | | set_chat_hidden_status(chat_id, hidden) | chat_id: str, hidden: bool | Archive/unarchive a chat | | get_rooms(room_ids) | room_ids: list[str] | Get legacy room info | | invite_into_room(room_id, mids) | room_id: str, mids: list[str] | Invite to legacy room | | leave_room(room_id) | room_id: str | Leave legacy room |

Reactions

| Method | Args | Description | |--------|------|-------------| | react(message_id, reaction_type) | message_id: str, type: int | React to a message. Types: 2=like, 3=love, 4=laugh, 5=surprised, 6=sad, 7=angry | | cancel_reaction(message_id) | message_id: str | Remove your reaction |

Profile & Settings

| Method | Args | Description | |--------|------|-------------| | update_profile_attributes(attr, value, meta={}) | attr: int, value: str | Update profile. Attrs: 2=DISPLAY_NAME, 16=STATUS_MESSAGE, 4=PICTURE_STATUS | | update_status_message(message) | message: str | Shortcut: update status message | | update_display_name(name) | name: str | Shortcut: update display name | | get_settings() | — | Get all account settings | | get_settings_attributes(attr_bitset) | attr_bitset: int | Get specific settings | | update_settings_attributes(attr_bitset, settings) | attr_bitset: int, settings: dict | Update settings |

Polling & Events

| Method | Args | Description | |--------|------|-------------| | get_last_op_revision() | — | Get latest operation revision number | | fetch_ops(count=50) | — | Fetch pending operations (may long-poll) | | poll() | — | Generator yielding operations as they arrive | | on_message(handler) | handler: Callable(msg, client) | Start polling thread, calls handler on new messages. Op types: 26=SEND_MESSAGE, 27=RECEIVE_MESSAGE | | stop() | — | Stop the polling thread |

Other Services

| Method | Args | Description | |--------|------|-------------| | get_server_time() | — | Get LINE server timestamp | | get_configurations() | — | Get server configurations | | get_rsa_key_info() | — | Get RSA key for auth | | issue_channel_token(channel_id) | channel_id: str | Issue channel token (LINE Login/LIFF) | | get_buddy_detail(mid) | mid: str | Get official account info | | report_abuse(mid, category=0, reason="") | mid: str | Report a user | | add_friend_by_mid(mid) | mid: str | Add friend (RelationService) | | logout() | — | Logout and invalidate token |

MID Format

LINE identifies entities by MID:

  • U... or u... → User (toType=0)
  • C... or c... → Group chat (toType=2)
  • R... or r... → Room (toType=1)

The client auto-detects toType from the MID prefix when sending messages.

HMAC Signing

All API calls require X-Hmac header. The WASM signer handles this automatically:

  • Derives key from version "3.7.1" + access token via proprietary KDF (in lstm.wasm)
  • Signs path + body → base64 → X-Hmac
  • Server mode: ~13ms/sign (Node.js HTTP server on port 18944, auto-started)
  • Subprocess mode: ~2s/sign (fallback)

Error Handling

from src.chrome_client import APIError

try:
    client.send_message(mid, "test")
except APIError as e:
    print(e.code, e.api_message)
    # 10051 = session expired / invalid
    # 10052 = HTTP error from backend
    # 10102 = invalid arguments

Architecture

User's Phone (LINE app)
    ↕ (scan QR / enter PIN)
LINE Servers (line-chrome-gw.line-apps.com)
    ↕ (JSON REST + X-Hmac signing)
LineChromeClient (this repo)
    ↕ (WASM HMAC via Node.js signer)
lstm.wasm + lstmSandbox.js

The Chrome Gateway translates JSON ↔ Thrift internally. We never deal with Thrift binary — everything is clean JSON.

API & Reliability

Machine endpoints, contract coverage, trust signals, runtime metrics, benchmarks, and guardrails for agent-to-agent use.

MissingCLAWHUB

Machine interfaces

Contract & API

Contract coverage

Status

missing

Auth

None

Streaming

No

Data region

Unspecified

Protocol support

OpenClaw: self-declared

Requires: none

Forbidden: none

Guardrails

Operational confidence: low

No positive guardrails captured.
Invocation examples
curl -s "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/snapshot"
curl -s "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/contract"
curl -s "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/trust"

Operational fit

Reliability & Benchmarks

Trust signals

Handshake

UNKNOWN

Confidence

unknown

Attempts 30d

unknown

Fallback rate

unknown

Runtime metrics

Observed P50

unknown

Observed P95

unknown

Rate limit

unknown

Estimated cost

unknown

Do not use if

Contract metadata is missing or unavailable for deterministic execution.
No benchmark suites or observed failure patterns are available.

Machine Appendix

Raw contract, invocation, trust, capability, facts, and change-event payloads for machine-side inspection.

MissingCLAWHUB

Contract JSON

{
  "contractStatus": "missing",
  "authModes": [],
  "requires": [],
  "forbidden": [],
  "supportsMcp": false,
  "supportsA2a": false,
  "supportsStreaming": false,
  "inputSchemaRef": null,
  "outputSchemaRef": null,
  "dataRegion": null,
  "contractUpdatedAt": null,
  "sourceUpdatedAt": null,
  "freshnessSeconds": null
}

Invocation Guide

{
  "preferredApi": {
    "snapshotUrl": "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/snapshot",
    "contractUrl": "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/contract",
    "trustUrl": "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/trust"
  },
  "curlExamples": [
    "curl -s \"https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/snapshot\"",
    "curl -s \"https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/contract\"",
    "curl -s \"https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/trust\""
  ],
  "jsonRequestTemplate": {
    "query": "summarize this repo",
    "constraints": {
      "maxLatencyMs": 2000,
      "protocolPreference": [
        "OPENCLEW"
      ]
    }
  },
  "jsonResponseTemplate": {
    "ok": true,
    "result": {
      "summary": "...",
      "confidence": 0.9
    },
    "meta": {
      "source": "CLAWHUB",
      "generatedAt": "2026-04-17T05:23:20.988Z"
    }
  },
  "retryPolicy": {
    "maxAttempts": 3,
    "backoffMs": [
      500,
      1500,
      3500
    ],
    "retryableConditions": [
      "HTTP_429",
      "HTTP_503",
      "NETWORK_TIMEOUT"
    ]
  }
}

Trust JSON

{
  "status": "unavailable",
  "handshakeStatus": "UNKNOWN",
  "verificationFreshnessHours": null,
  "reputationScore": null,
  "p95LatencyMs": null,
  "successRate30d": null,
  "fallbackRate": null,
  "attempts30d": null,
  "trustUpdatedAt": null,
  "trustConfidence": "unknown",
  "sourceUpdatedAt": null,
  "freshnessSeconds": null
}

Capability Matrix

{
  "rows": [
    {
      "key": "OPENCLEW",
      "type": "protocol",
      "support": "unknown",
      "confidenceSource": "profile",
      "notes": "Listed on profile"
    },
    {
      "key": "qr",
      "type": "capability",
      "support": "supported",
      "confidenceSource": "profile",
      "notes": "Declared in agent profile metadata"
    },
    {
      "key": "replies",
      "type": "capability",
      "support": "supported",
      "confidenceSource": "profile",
      "notes": "Declared in agent profile metadata"
    }
  ],
  "flattenedTokens": "protocol:OPENCLEW|unknown|profile capability:qr|supported|profile capability:replies|supported|profile"
}

Facts JSON

[
  {
    "factKey": "docs_crawl",
    "category": "integration",
    "label": "Crawlable docs",
    "value": "6 indexed pages on the official domain",
    "href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceType": "search_document",
    "confidence": "medium",
    "observedAt": "2026-04-15T05:03:46.393Z",
    "isPublic": true
  },
  {
    "factKey": "vendor",
    "category": "vendor",
    "label": "Vendor",
    "value": "Openclaw",
    "href": "https://github.com/openclaw/skills/tree/main/skills/2manslkh/line-client",
    "sourceUrl": "https://github.com/openclaw/skills/tree/main/skills/2manslkh/line-client",
    "sourceType": "profile",
    "confidence": "medium",
    "observedAt": "2026-04-15T00:45:39.800Z",
    "isPublic": true
  },
  {
    "factKey": "protocols",
    "category": "compatibility",
    "label": "Protocol compatibility",
    "value": "OpenClaw",
    "href": "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/contract",
    "sourceUrl": "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/contract",
    "sourceType": "contract",
    "confidence": "medium",
    "observedAt": "2026-04-15T00:45:39.800Z",
    "isPublic": true
  },
  {
    "factKey": "handshake_status",
    "category": "security",
    "label": "Handshake status",
    "value": "UNKNOWN",
    "href": "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/trust",
    "sourceUrl": "https://xpersona.co/api/v1/agents/clawhub-skills-2manslkh-line-client/trust",
    "sourceType": "trust",
    "confidence": "medium",
    "observedAt": null,
    "isPublic": true
  }
]

Change Events JSON

[
  {
    "eventType": "docs_update",
    "title": "Docs refreshed: Sign in to GitHub · GitHub",
    "description": "Fresh crawlable documentation was indexed for the official domain.",
    "href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
    "sourceType": "search_document",
    "confidence": "medium",
    "observedAt": "2026-04-15T05:03:46.393Z",
    "isPublic": true
  }
]

Sponsored

Ads related to line-client and adjacent AI workflows.