Zero-dependency Node.js SDK for the WeChat iLink Bot API.
npm install @pinixai/weixin-botimport { WeixinBot } from '@pinixai/weixin-bot'
const bot = new WeixinBot()
await bot.login()
bot.onMessage(async (msg) => {
console.log(`[${msg.timestamp.toLocaleTimeString()}] ${msg.userId}: ${msg.text}`)
await bot.reply(msg, `你说了: ${msg.text}`)
})
await bot.run()Creates a bot client.
baseUrl?: stringOverride the iLink API base URL.tokenPath?: stringOverride the credential file path. Default:~/.weixin-bot/credentials.jsononError?: (error: unknown) => voidReceive polling or handler errors.
Starts QR login if needed, stores credentials locally, and returns the active session.
force?: booleanIgnore cached credentials and require a fresh QR login.
Registers an async or sync message handler. Each inbound user message is converted into:
interface IncomingMessage {
userId: string
text: string
type: 'text' | 'image' | 'voice' | 'file' | 'video'
raw: WeixinMessage
_contextToken: string
timestamp: Date
}Replies to an inbound message using that message's context_token.
Shows "对方正在输入中..." (typing indicator) in the WeChat chat. Automatically fetches the required typing_ticket via getconfig. Only works after the SDK has seen at least one inbound message from that user.
Cancels the typing indicator.
Sends a proactive text message using the latest cached context_token for that user. This only works after the SDK has seen at least one inbound message from that user.
Starts the long-poll loop, dispatches incoming messages to registered handlers, reconnects on transient failures, and triggers re-login if the session expires.
Stops the long-poll loop gracefully.
login()fetches a QR login URL, waits for WeChat confirmation, and saves the returned bot token.run()performs long polling againstgetupdates.- Each inbound message is normalized into
IncomingMessageand sent to your callbacks. reply()andsend()reuse the internally managedcontext_tokenrequired by the protocol.
See ../PROTOCOL.md for the wire protocol reference used by this SDK.
MIT