Connect WeChat to your app, agent, or workflow with a small amount of Python.
Scan to log in, then receive messages, reply, and send media without building a full bot platform first.
wechat-link is an unofficial Python SDK for iLink-compatible Weixin Bot integration. It keeps the path intentionally simple: get connected fast, then extend the integration your own way.
- QR login primitives:
get_bot_qrcode()/get_qrcode_status() - Long polling:
get_updates() - Typed inbound media parsing / download:
WeixinMessage.items()/Client.download_message_item() - Recent inbound turn aggregation:
OpenClawInboundAggregator(merge_window_seconds=8) - Text messaging:
send_text() - Typing support:
get_config()/send_typing() - Media workflow:
get_upload_url()upload_image()/send_image()upload_file()/send_file()upload_video()/send_video()upload_voice()/send_voice()
- OpenClaw-compatible adapter:
OpenClawWeixinAdapterwith inbound archive extraction and outbound image/video/voice/file routing - Optional FastAPI relay layer
pip install wechat-linkRelay extras:
pip install "wechat-link[relay]"If this is your first time using the SDK, follow this order:
- Run QR login first and obtain
bot_token - Initialize
Client(bot_token=...) - Start polling and sending messages
The SDK returns bot_token, baseurl, ilink_bot_id, and ilink_user_id after QR confirmation. The value you need for Client(...) is bot_token.
For QR display, qrcode_img_content is currently a URL. If that URL points to a QR page instead of a raw image, the SDK generates a real QR locally. Client.save_qrcode_image(...) saves it to a local file, while Client.render_qrcode_terminal(...) / Client.print_qrcode_terminal(...) can render it directly in the terminal.
from wechat_link import Client, FileCursorStore
client = Client(bot_token="your-bot-token")
store = FileCursorStore(".state/get_updates_buf.json")
cursor = store.load() or ""
updates = client.get_updates(cursor=cursor)
if updates.next_cursor:
store.save(updates.next_cursor)
for message in updates.messages:
print("from_user_id:", message.from_user_id)
print("context_token:", message.context_token)
print("text:", message.text())
client.close()If you want the clearest learning path, use these repository examples in order:
python examples/login_session.pypython examples/receive_once.pypython examples/reply_once.pypython examples/send_text_in_session.pypython examples/echo_bot.py
The important boundary is that replying or sending within an existing conversation requires the upstream context_token.
Core reply example:
client.send_text(
to_user_id=message.from_user_id,
text=f"received: {message.text()}",
context_token=message.context_token,
)Advanced repository examples:
python examples/receive_media_once.pydownloads inbound image / video / voice / file messagespython examples/send_media.pysends image / file / video / voice messagespython examples/openclaw_adapter_once.pyprints the OpenClaw-style context, including archive extraction metadatapython examples/openclaw_aggregate_once.pymerges image-first and text-later turns into one OpenClaw request
If you want the full onboarding flow in one runnable file, use:
python examples/quickstart_three_steps.pyThe repository version of that example handles QR login, session persistence, and the echo loop end to end. When run from the repository, it prefers local src/wechat_link first and writes runtime files into the repository .state/ directory.
- Repository: https://github.com/syusama/wechat-link
- Issues: https://github.com/syusama/wechat-link/issues
- Chinese README: https://github.com/syusama/wechat-link/blob/main/README.md
- English README: https://github.com/syusama/wechat-link/blob/main/README.en.md
- Japanese README: https://github.com/syusama/wechat-link/blob/main/README.ja.md
- This is an unofficial project.
- It should not be described as a Tencent official SDK or official platform replacement.
- The PyPI page keeps the package overview concise; the full documentation and examples live in the GitHub repository.