Changelog
All notable changes to this project will be documented in this file.
[0.3.0] - 2026-03-29
Synced with upstream @tencent-weixin/openclaw-weixin v2.1.1.
Added
- CDN full_url support — server can now return complete download/upload URLs directly; client falls back to URL construction when
full_urlis absent (ENABLE_CDN_URL_FALLBACKflag) - Context token disk persistence — tokens survive process restarts via
{accountId}.context-tokens.json;set_context_tokenskips disk I/O when token is unchanged - iLink protocol headers — all requests now include
iLink-App-IdandiLink-App-ClientVersionheaders - QR login IDC redirect — new
scaned_but_redirectstatus withredirect_hostfor cross-datacenter routing - Sensitive field redaction —
redact_body()maskscontext_token,bot_token,token,authorizationvalues before logging - Account cleanup —
clear_stale_accounts_for_user_id()removes stale accounts after re-login;clear_weixin_account()now removes all associated files (.json,.sync.json,.context-tokens.json) ApiHttpErrorexception — structured HTTP error withstatus_codeattribute, replacing stringly-typed RuntimeError matchingapi_get_fetch()— GET request wrapper with common iLink headersCDNMedia.has_download_source— property to check if media hasencrypt_query_paramorfull_url- QR code browser fallback — prints URL when terminal QR rendering fails
- routeTag config caching —
load_config_route_tag()caches result after first read - 37 new tests covering context token persistence, CDN URL routing, version encoding, and sensitive field redaction (65 → 102 total)
Changed
- contextToken soft-fail — send functions now warn instead of raising when
context_tokenis absent; server accepts messages without it since iLink v2.1+ - Error notice behavior —
send_weixin_error_notice()now attempts to send even withoutcontext_token(previously was a no-op) - QR login networking — uses fixed base URL
https://ilinkai.weixin.qq.comfor QR requests; network/gateway errors (502/503/504/524) treated as retryable instead of fatal _poll_qr_statusexception handling — narrowed from catch-allExceptiontohttpx.TimeoutException/ConnectError/NetworkError+ApiHttpErrorwith gateway status code checkchannel_versioninbase_info— now sends upstream version2.1.1instead of Python package versionsetup.py— replaced removedclose_login_client()withclose_shared_client()fromapi.client
Fixed
setup.pyImportError —close_login_clientwas removed but still imported, breakingwechat-clawbot-cc setup- Empty QR URL output — else branch no longer prints empty
qrcode_url, shows error message instead - TOCTOU patterns —
restore_context_tokens,clear_context_tokens_for_account,_load_route_tag_sectionreplacedexists()→ operate with EAFP pattern restore_context_tokenserror handling — separatedFileNotFoundError,JSONDecodeError, and type validation into distinct branches with appropriate log levels
Removed
close_login_client()— login now uses the shared API clientlogUploadUrlconfig field — removed upstream
[0.2.0] - 2026-03-22
Added
wechat_send_filetool — send images, videos, and documents via CDN uploadwechat_typingtool — typing indicator with keepalive- iLink Bot Protocol documentation (
docs/ilink-protocol.md) - CI and PyPI publish GitHub Actions workflows
Changed
- Migrated from
asynciotoanyiofor structured concurrency - Added
anyioas explicit dependency - SOCKS proxy support via
httpx[socks]optional extra
[0.1.0] - 2026-03-22
Added
- Initial Python port of
@tencent-weixin/openclaw-weixinv1.0.2 - Full ilink API client (getUpdates, sendMessage, getConfig, sendTyping)
- Multi-account QR code login and credential storage
- AES-128-ECB encrypted CDN upload/download pipeline
- SILK voice transcoding (optional)
- Message processing pipeline with slash commands and debug mode
- Claude Code MCP Channel bridge (
wechat-clawbot-ccCLI) wechat_replyMCP tool for sending text replies