[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-wechaty--wechaty":3,"tool-wechaty--wechaty":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",150037,2,"2026-04-10T23:33:47",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108322,"2026-04-10T11:39:34",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":64,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":76,"owner_email":77,"owner_twitter":78,"owner_website":79,"owner_url":80,"languages":81,"stars":98,"forks":99,"last_commit_at":100,"license":101,"difficulty_score":32,"env_os":102,"env_gpu":103,"env_ram":103,"env_deps":104,"category_tags":111,"github_topics":113,"view_count":10,"oss_zip_url":76,"oss_zip_packed_at":76,"status":17,"created_at":122,"updated_at":123,"faqs":124,"releases":152},3955,"wechaty\u002Fwechaty","wechaty","Conversational RPA SDK for Chatbot Makers. Join our Discord: https:\u002F\u002Fdiscord.gg\u002F7q8NBZbQzt","Wechaty 是一款专为聊天机器人开发者打造的对话式 RPA（机器人流程自动化）SDK。它的核心使命是简化机器人开发流程，让创作者无需深陷不同即时通讯平台复杂的 API 细节中。\n\n在过去，开发者若想让自己的机器人同时运行在微信、WhatsApp 等多个平台上，往往需要针对每个平台编写独立的适配代码，工作繁琐且维护成本高。Wechaty 巧妙地解决了这一痛点，它提供了一套统一的标准化接口，支持“一次编写，多端运行”。无论是微信、WhatsApp，还是未来接入的其他主流通讯软件，开发者只需关注对话逻辑本身，底层的技术适配由 Wechaty 自动完成。\n\n这款工具特别适合软件工程师、全栈开发者以及希望快速验证聊天机器人创意的研究人员使用。其独特的技术亮点在于强大的多语言生态支持，不仅原生支持 TypeScript 和 JavaScript，还完美兼容 Python、Go、Java、.NET、PHP 乃至 Rust 等多种编程语言，极大地降低了不同技术背景开发者的入门门槛。此外，Wechaty 拥有活跃的开源社区和丰富的文档资源，能够帮助用户高效地构建智能、有趣的对话体验，是将聊天机器人想","Wechaty 是一款专为聊天机器人开发者打造的对话式 RPA（机器人流程自动化）SDK。它的核心使命是简化机器人开发流程，让创作者无需深陷不同即时通讯平台复杂的 API 细节中。\n\n在过去，开发者若想让自己的机器人同时运行在微信、WhatsApp 等多个平台上，往往需要针对每个平台编写独立的适配代码，工作繁琐且维护成本高。Wechaty 巧妙地解决了这一痛点，它提供了一套统一的标准化接口，支持“一次编写，多端运行”。无论是微信、WhatsApp，还是未来接入的其他主流通讯软件，开发者只需关注对话逻辑本身，底层的技术适配由 Wechaty 自动完成。\n\n这款工具特别适合软件工程师、全栈开发者以及希望快速验证聊天机器人创意的研究人员使用。其独特的技术亮点在于强大的多语言生态支持，不仅原生支持 TypeScript 和 JavaScript，还完美兼容 Python、Go、Java、.NET、PHP 乃至 Rust 等多种编程语言，极大地降低了不同技术背景开发者的入门门槛。此外，Wechaty 拥有活跃的开源社区和丰富的文档资源，能够帮助用户高效地构建智能、有趣的对话体验，是将聊天机器人想法转化为现实产品的得力助手。","# Wechaty [![Join Wechaty Discord Developer Community](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F916984413944967180?logo=discord&style=flat)](https:\u002F\u002Fdiscord.gg\u002F7q8NBZbQzt) [![NPM Version](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fwechaty?color=brightgreen)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty) [![NPM](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fworkflows\u002FNPM\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ANPM) [![Docker](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fworkflows\u002FDocker\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ADocker)\n\n[![Wechaty](https:\u002F\u002Fwechaty.js.org\u002Fimg\u002Fwechaty-logo.svg)](https:\u002F\u002Fwechaty.js.org)\n\n[Ship.Fail](https:\u002F\u002Fship.fail) [PreAngel](https:\u002F\u002FPreAngel.AI)\n[![Downloads](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002Fwechaty.svg?style=flat-square)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty)\n[![GitHub stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fwechaty\u002Fwechaty.svg?label=github%20stars)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty)\n[![Docker Pulls](https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fwechaty\u002Fwechaty.svg?maxAge=2592000)](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fwechaty\u002Fwechaty\u002F)\n[![ES Modules](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FES-Modules-orange)](https:\u002F\u002Fgithub.com\u002FChatie\u002Ftsconfig\u002Fissues\u002F16)\n\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--3178C6?logo=typescript&logoColor=ffffff)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Ftypescript\u002F)\n[![JavaScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--F7DF1E?logo=javascript&logoColor=000)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Ftypescript\u002F)\n[![Python](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--3670A0?logo=python&logoColor=ffdd54)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fpython\u002F)\n[![Go](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--00ADD8?logo=go&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fgo\u002F)\n[![Java](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--red?logo=java&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fjava\u002F)\n[![.NET](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--5C2D91?logo=dotnet&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fdotnet\u002F)\n[![PHP](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--777BB4?logo=php&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fphp\u002F)\n[![Rust](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--000000?logo=rust&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Frust\u002F)\n[![Scala](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--DC322F?logo=scala&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fscala\u002F)\n\n[![WeChat](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--07C160?logo=wechat&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Fwechat)\n[![Whatsapp](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--25D366?logo=whatsapp&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Fwhatsapp)\n\n\u003C!--\n[![TikTok](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--000000?logo=tiktok&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Ftiktok)\n[![Line](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--00C300?logo=line&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Fline)\n[![Telegram](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--2CA5E0?logo=telegram&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Ftelegram)\n[![Gitter](https:\u002F\u002Fbadges.gitter.im\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fgitter.im\u002Fwechaty\u002Fwechaty?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n[![Gitter room](https:\u002F\u002Fbadgen.net\u002Fgitter\u002Fmembers\u002Fwechaty\u002Fwechaty)](https:\u002F\u002Fgitter.im\u002Fwechaty\u002Fwechaty?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n[![Telegram Wechaty Channel](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fchat-on%20telegram-blue)](https:\u002F\u002Ft.me\u002Fwechaty)\n-->\n\n## Elevator Pitch\n\nWechaty is a conversational RPA SDK that simplifies the process of building chatbots. It's like a Swiss Army knife for chatbot development, providing a universal interface to various messaging platforms such as WhatsApp, WeChat, and more. With Wechaty, you write your bot code once, and it runs on any of the supported platforms. This means you can focus on creating engaging conversational experiences without worrying about the underlying complexities of each platform's API. It's open-source, easy to use, and backed by a vibrant community that's ready to help you bring your chatbot ideas to life.\n\n## Connecting Chatbots\n\nWechaty is an RPA (Robotic Process Automation) SDK for Chatbot Makers which can help you create a bot in 6 lines of [JavaScript](https:\u002F\u002FGitHub.com\u002FWechaty\u002Fwechaty), [Python](https:\u002F\u002FGitHub.com\u002FWechaty\u002Fpython-wechaty\u002F), [Go](https:\u002F\u002FGitHub.com\u002FWechaty\u002Fgo-wechaty\u002F), and [Java](https:\u002F\u002FGitHub.com\u002FWechaty\u002Fjava-wechaty\u002F), with cross-platform support including [Linux, Windows, MacOS](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ANPM), and [Docker](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ADocker).\n\n:spider_web: \u003Chttps:\u002F\u002Fwechaty.js.org>  \n:octocat: \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty>  \n:beetle: \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fissues>  \n:book: \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-getting-started>  \n:whale: \u003Chttps:\u002F\u002Fhub.docker.com\u002Fr\u002Fwechaty\u002Fwechaty>  \n\n## Breaking News\n\n- [重磅：绕过登录限制，wechaty免费版web协议重放荣光, @gengchen528, Apr 13, 2021](https:\u002F\u002Fwechaty.js.org\u002F2021\u002F04\u002F13\u002Fwechaty-uos-web\u002F)\n\n## Voice of Developers\n\n> \"Wechaty is a great solution; I believe there would be much more users who recognize it.\" [link](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fpull\u002F310#issuecomment-285574472)  \n> &mdash; \u003Ccite>@Gcaufy, Tencent Engineer, Author of [WePY](https:\u002F\u002Fgithub.com\u002FTencent\u002Fwepy)\u003C\u002Fcite>\n>\n> \"太好用，好用的想哭\"  \n> &mdash; \u003Ccite>@xinbenlv, Google Engineer, Founder of HaoShiYou.org\u003C\u002Fcite>\n>\n> ”好用到哭“——你们对得起这个评价！ [link](https:\u002F\u002Fgithub.com\u002Fbigbrother666sh\u002Fshezhangbujianle#%E8%87%B4%E6%95%AC)  \n> &mdash; \u003Ccite>[@bigbrother666sh](https:\u002F\u002Fgithub.com\u002Fbigbrother666sh), creator of《社长不见了》剧本杀 NPC DM\u003C\u002Fcite>\n>\n> \"最好的微信开发库\" [link](http:\u002F\u002Fweibo.com\u002F3296245513\u002FEc4iNp9Ld?type=comment)  \n> &mdash; \u003Ccite>@Jarvis, Baidu Engineer\u003C\u002Fcite>\n>\n> \"Wechaty让运营人员更多的时间思考如何进行活动策划、留存用户，商业变现\" [link](http:\u002F\u002Fmp.weixin.qq.com\u002Fs\u002FdWHAj8XtiKG-1fIS5Og79g)  \n> &mdash; \u003Ccite>@lijiarui, Founder & CEO of Juzi.BOT.\u003C\u002Fcite>\n>\n> \"If you know js ... try Wechaty. It's easy to use.\"  \n> &mdash; \u003Ccite>@Urinx Uri Lee, Author of [WeixinBot(Python)](https:\u002F\u002Fgithub.com\u002FUrinx\u002FWeixinBot)\u003C\u002Fcite>\n>\n> \"Wechaty is a good project; I hope it can continue! Therefore, I became a contributor in open collective.\"  \n> &mdash; \u003Ccite>[@Simple](https:\u002F\u002Fgithub.com\u002Fmrwhh)\u003C\u002Fcite>\n\nSee more at [Wiki:Voice Of Developer](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fwiki\u002FVoice%20Of%20Developer)\n\n### Join Us on Discord\n\n[![Join Wechaty Discord Developer Community](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F916984413944967180?logo=discord&style=flat)](https:\u002F\u002Fdiscord.gg\u002F7q8NBZbQzt)\n[![Wechaty Discord](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdynamic\u002Fjson?url=https%3A%2F%2Fdiscord.com%2Fapi%2Finvites%2F7q8NBZbQzt%3Fwith_counts%3Dtrue&query=%24.approximate_member_count&logo=discord&logoColor=white&label=Users%20Total&color=green&style=flat)](https:\u002F\u002Fdiscord.gg\u002F7q8NBZbQzt)\n\nWechaty is used in many ChatBot projects by thousands of developers. To talk with other developers, scan the QR Code below and join our **Wechaty Developer Community**.\n\n![Wechaty Discord Community QR Code](https:\u002F\u002Fwechaty.js.org\u002Fimg\u002Fdiscord-qrcode.svg)\n\nScan now because other Wechaty developers want to talk with you, too!\n\n### Resource\n\nWechaty has already held lots of talks and got a lot of blogs in the past years; here are all of the wechaty resources:\n\n- :video_camera: [Youtube Playlist: Watch all of the talk videos related with Wechaty](https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PL8hd9KDTdarDXf_Rxtr8meKhxtgcXMInh)\n- :page_with_curl: [Full Docs](https:\u002F\u002Fwechaty.js.org\u002F)\n- :bulb: [Blog: See how developers use wechaty to build fantastic projects!](https:\u002F\u002Fwechaty.github.io\u002F)\n- :beginner: [Wechaty-Getting-Started:Wechaty Starter Project Template that Works Out-of-the-Box](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-getting-started)\n- :tada: [Wechaty Contributor List: Thanks for their contribution!](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fwiki\u002FContributors)\n- :gift: [Juzibot Support Wechaty: Know everything about Wechaty](https:\u002F\u002Fgithub.com\u002Fjuzibot\u002FWelcome\u002Fwiki\u002FEverything-about-Wechaty)\n\n## :rocket: The World's Shortest ChatBot Code: 6 lines of JavaScript\n\n```javascript\n\nimport { WechatyBuilder } from 'wechaty'\n\nconst wechaty = WechatyBuilder.build() \u002F\u002F get a Wechaty instance\nwechaty\n  .on('scan', (qrcode, status) => console.log(`Scan QR Code to login: ${status}\\nhttps:\u002F\u002Fwechaty.js.org\u002Fqrcode\u002F${encodeURIComponent(qrcode)}`))\n  .on('login',            user => console.log(`User ${user} logged in`))\n  .on('message',       message => console.log(`Message: ${message}`))\nwechaty.start()\n```\n\n> **Notice: Wechaty requires Node.js version >= 16**\n\nThis bot can log all messages to the console after login by the scan.\n\nYou can find Wechaty's Official Examples at [examples\u002Fding-dong-bot.ts](examples\u002Fding-dong-bot.ts) and more from our [Example Directory](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-getting-started\u002Fblob\u002Fmain\u002Fexamples\u002F).\n\n## :checkered_flag: Requirements\n\n1. Node.js version 16+\n1. NPM version 7+\n1. TypeScript version 4.4+\n\n## Getting Started\n\n[![node](https:\u002F\u002Fimg.shields.io\u002Fnode\u002Fv\u002Fwechaty.svg?maxAge=604800)](https:\u002F\u002Fnodejs.org\u002F)\n\n- Wechaty Starter Repository - \u003Chttps:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-getting-started>\n\nWe have a Wechaty starter repository for beginners with the simplest setting. It will be **work** out-of-the-box after you `clone` & `npm install` & `npm start`.\n\nIf you are new to Wechaty and want to try it the first time, we'd like to strong recommend you starting from this repository, and using it as your starter template for your project.\n\nOtherwise, please saved the above _The World's Shortest ChatBot Code: 6 lines of JavaScript_ example to a file named `bot.js` before you can use either NPM or Docker to run it.\n\n### 1. Npm\n\n[![NPM Version](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fwechaty?color=brightgreen&label=wechaty%40latest)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty)\n[![npm (tag)](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fwechaty\u002Fnext?color=yellow&label=wechaty%40next)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty?activeTab=versions)\n\n[![Downloads](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002Fwechaty.svg?style=flat-square)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty)\n[![install size](https:\u002F\u002Fpackagephobia.now.sh\u002Fbadge?p=wechaty)](https:\u002F\u002Fpackagephobia.now.sh\u002Fresult?p=wechaty)\n\n```shell\nnpm init\nnpm install wechaty\n\n# create your first bot.js file, you can copy\u002Fpaste from the above \"The World's Shortest ChatBot Code: 6 lines of JavaScript\"\n# then:\nnode bot.js\n```\n\n### 2. Docker\n\n[![Docker Pulls](https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fwechaty\u002Fwechaty.svg?maxAge=2592000)](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fwechaty\u002Fwechaty\u002F)\n[![Docker Layers](https:\u002F\u002Fimages.microbadger.com\u002Fbadges\u002Fimage\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fmicrobadger.com\u002F#\u002Fimages\u002Fwechaty\u002Fwechaty)\n\n- Wechaty Starter Repository for Docker - \u003Chttps:\u002F\u002Fgithub.com\u002Fwechaty\u002Fdocker-wechaty-getting-started>\n\n> Wechaty Docker supports both JavaScript and TypeScript. To use TypeScript just write in TypeScript and save with extension name `.ts`, no need to compile because we use `ts-node` to run it.\n\n2.1. Run JavaScript\n\n```shell\n# for JavaScript\ndocker run -ti --rm --volume=\"$(pwd)\":\u002Fbot wechaty\u002Fwechaty bot.js\n```\n\n2.2. Run TypeScript\n\n```shell\n# for TypeScript\ndocker run -ti --rm --volume=\"$(pwd)\":\u002Fbot wechaty\u002Fwechaty bot.ts\n```\n\n> Learn more about Wechaty Docker at [Wiki:Docker](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fwiki\u002FDocker).\n\n### 3. Switch Protocol(Puppet)\n\nWechaty is very powerful that it can run over different protocols. You can specify the protocol by set the environment variable `WECHATY_PUPPET` to different puppet provider.\n\nIf you cannot use Web protocol, you can apply other protocols following the instruction here: \u003Chttps:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fwiki\u002FSupport-Developers> We provide free token to support developers build a valuable WeChat chatbot.\n\nCurrently we support the following [puppet providers](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-services\u002F) :\n\n| Protocol | Puppet Provider | Environment Variable |\n| --- | --- | --- |\n| Web | [PuppetPuppeteer](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-puppet-puppeteer) | `export WECHATY_PUPPET=wechaty-puppet-puppeteer` |\n| Windows | [PuppetWorkPro](https:\u002F\u002Fgithub.com\u002FRPAChat\u002Fworkpro-getting-started) | `export WECHATY_PUPPET=wechaty-puppet-service` |\n| Mock | [PuppetMock](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-puppet-mock) | `export WECHATY_PUPPET=wechaty-puppet-mock` |\n| Web | [PuppetWechat4u](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-puppet-wechat4u) | `export WECHATY_PUPPET=wechaty-puppet-wechat4u` |\n| iPad | [PuppetRock](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpuppet-service-providers) | `export WECHATY_PUPPET=wechaty-puppet-service` |\n| iPad | [PuppetPadLocal](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpuppet-service-providers) | `export WECHATY_PUPPET=wechaty-puppet-service` |\n| Windows | [PuppetDonut](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpuppet-service-providers) | `export WECHATY_PUPPET=wechaty-puppet-service` |\n| iPad | ~~PuppetPadpro~~ **DEPRECATED** | `export WECHATY_PUPPET=wechaty-puppet-padpro` |\n| iPad | ~~PuppetPadchat~~ **DEPRECATED** | `export WECHATY_PUPPET=wechaty-puppet-padchat` |\n| iPad | ~~PuppetPadplus~~ **DEPRECATED** | `export WECHATY_PUPPET=wechaty-puppet-padplus` |\n| Mac | ~~PuppetMacpro~~ **DEPRECATED** | `export WECHATY_PUPPET=wechaty-puppet-macpro` |\n| Windows | ~~PuppetWxwork~~ **DEPRECATED** | `export WECHATY_PUPPET=wechaty-puppet-service` |\n\nLearn more about Wechaty Puppet from the Puppet Wiki:\n\n1. Puppet Directory: \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet\u002Fwiki\u002FDirectory>\n1. Puppet Compatibility: \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet\u002Fwiki\u002FCompatibility>\n\n## :guitar: API\n\nRead the Full Documentation at [Wechaty Official API Reference](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F)\n\n### 1 Class `Wechaty`\n\nMain bot class.\n\nA `Bot` is a Wechaty instance that control a specific [wechaty-puppet](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fspecifications\u002Fpuppet\u002F).\n\n- `new Wechaty(options?: WechatyOptions)`\n    1. `options.name?: string` the name of this bot(optional)\n    2. `options.puppet?: string` select which puppet provider we want to use. must be one of the:\n        1. [wechaty-puppet-wechat](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet-wechat) - Angular Hook for Web Wechat\n        2. [wechaty-puppet-wechat4u](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet-wechat4u) - HTTP API for Web Wechat\n        3. [wechaty-puppet-padpro](https:\u002F\u002Fgithub.com\u002Fbotorange\u002Fwechaty-puppet-padpro) - iPad App Protocol\n        4. [wechaty-puppet-ioscat](https:\u002F\u002Fgithub.com\u002Flinyimin-bupt\u002Fwechaty-puppet-ioscat) - iPhone App Hook\n        5. [wechaty-puppet-mock](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet-mock) - Mock for Testing\n    3. `options.puppetOptions?: PuppetOptions` options for the puppet provider.\n\n| Wechaty | API | Description |\n| :--- | :--- | :---        |\n| event | [`login`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit after bot login full successful |\n| event | [`logout`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit after the bot log out |\n| event | [`friendship`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit when someone sends bot a friend request|\n| event | [`message`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit when there's a new message |\n| event | [`room-join`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit when anyone join any room |\n| event | [`room-topic`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit when someone change room topic |\n| event | [`room-leave`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit when anyone leave the room |\n| event | [`room-invite`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit when there is a room invitation |\n| event | [`scan`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | emit when the bot needs to show you a QR Code for scanning |\n| method | [`start(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+start) | start the bot |\n| method | [`stop(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+stop) | stop the bot |\n| method | [`logonoff(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+logonoff) | bot login status |\n| method | [`logout(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+logout) | logout the bot |\n| method | [`currentUser(): ContactSelf`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+currentUser) | get the login-ed bot contact |\n| method | [`say(text: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+say) | let bot say `text` to itself |\n\n### 2 Class `Contact`\n\nAll wechat contacts(friends\u002Fnon-friends) will be encapsulated as a Contact.\n\n| Contact | API | Description |\n| :--- | :--- | :---        |\n| static | [`find(query: string): Promise\u003Cnull \\| Contact>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact.find) | find contact by name or alias, if the result more than one, return the first one. |\n| static | [`findAll(query: string): Promise\u003CContact[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact.findAll) | find contact by `name` or `alias` |\n| static | [`load(query: string): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact.load) | get contact by id |\n| property | `id: readonly string` | get contact id |\n| method | [`sync(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+sync) | force reload data for contact , sync data from lowlevel API again|\n| method | [`say(text: string): Promise\u003Cvoid \\| Message>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+say) | send text, Contact, or file to contact, return the message which the bot sent (only `puppet-padplus` supported). |\n| method | [`self(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+self) | check if contact is self |\n| method | [`name(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+name) | get the name from a contact |\n| method | [`alias(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+alias) | get the alias for a contact |\n| method | [`alias(newAlias: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+alias) | set or delete the alias for a contact |\n| method | [`friend(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+friend) | check if contact is friend |\n| method | [`type(): ContactType`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+type) | return the type of the Contact |\n| method | [`province(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+province) | get the region 'province' from a contact |\n| method | [`city(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+city) | get the region 'city' from a contact |\n| method | [`avatar(): Promise\u003CFileBox>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+avatar) | get avatar picture file stream |\n| method | [`gender(): ContactGender`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+gender) | get gender from a contact |\n\n#### 2.1 Class `ContactSelf`\n\nClass `ContactSelf` is extended from `Contact`.\n\n| ContactSelf | API | Description |\n| :--- | :--- | :---        |\n| method | [`avatar(file: FileBox): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#ContactSelf+avatar) | set avatar for bot |\n| method | [`qrcode(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#ContactSelf+qrcode) | get qrcode for bot |\n| method | [`signature(text: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#ContactSelf+signature) | set signature for bot |\n\n#### 2.2 Class `Friendship`\n\nSend, receive friend request, and friend confirmation events.\n\n| Friendship | API | Description |\n| :--- | :--- | :---        |\n| static | [`add(contact: Contact, hello?: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship.add) | send a friend invitation to contact |\n| method | [`accept(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship+accept) | accept Friend Request |\n| method | [`hello(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship+hello) | get the hello string from a friendship invitation |\n| method | [`contact(): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship+contact) | get the contact from friendship |\n| method | [`type(): FriendshipType`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship+type) | return the Friendship Type(unknown, confirm, receive, verify) |\n\n### 3 Class `Message`\n\nAll wechat messages will be encapsulated as a Message.\n\n| Message | API | Description |\n| :--- | :--- | :---        |\n| static | [`find(query: string): Promise\u003Cnull \\| Message>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message.find) | find message in cache and return the first one |\n| static | [`findAll(query: string): Promise\u003CMessage[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message.findAll) | find messages in cache, return a message list |\n| method | [`from(): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+from) | get the sender from a message |\n| method | [`to(): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+to) | get the destination of the message |\n| method | [`room(): null \\| Room`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+room) | get the room from the message.(If the message is not in a room, then will return `null`) |\n| method | [`text(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+text) | get the text content of the message |\n| method | [`say(text: string): Promise\u003Cvoid \\| Message>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+say) | reply a Text, Media File , or contact message to the sender, return the message which the bot sent (only `puppet-padplus` supported). |\n| method | [`type(): MessageType`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+type) | get the type from the message |\n| method | [`self(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+self) | check if a message is sent by self |\n| method | [`mention(): Contact[]`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+mention) | get message mentioned contactList. |\n| method | [`mentionSelf(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+mentionSelf) | check if a message is mention self |\n| method | [`forward(to: Contact): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+forward) | Forward the received message |\n| method | [`age(): number`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+age) | the number of seconds since it has been created |\n| method | [`date(): Date`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+date) | the time it was created |\n| method | [`toFileBox(): Promise\u003CFileBox>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+toFileBox) | extract the Media File from the Message, and put it into the FileBox. |\n| method | [`toContact(): Promise\u003CContact>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+toContact) | get Share Card of the Message |\n\n### 4 Class `Room`\n\nAll wechat rooms(groups) will be encapsulated as a Room.\n\n| Room | API | Description |\n| :--- | :--- | :---        |\n| static | [`create(contactList: Contact[], topic?: string): Promise\u003CRoom>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room.create) | create a new room |\n| static | [`find(query: string): Promise\u003Cnull \\| Room>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room.find) | Try to find a room by filter. If get many, return the first one. |\n| static | [`findAll(query: string): Promise\u003CRoom[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room.findAll) | Find all contacts in a room |\n| static | [`load(query: string): Room`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room.load) | load room by room id |\n| property | `id: readonly string` |  |\n| event | [`join`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+on) | emit when anyone join any room |\n| event | [`topic`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+on) | emit when someone change room topic |\n| event | [`leave`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+on) | emit when anyone leave the room |\n| event | [`invite`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+on) | emit when receive a room invitation |\n| method | [`sync(): \u003CPromise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+sync) | force reload data for room, sync data from lowlevel API again.\n| method | [`say(text: string): Promise\u003Cvoid \\| Message>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+say) | Send text,media file, contact card, or text with mention @mention contact inside Room, return the message which the bot sent (only `puppet-padplus` supported). |\n| method | [`add(contact: Contact): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+add) | Add contact in a room |\n| method | [`del(contact: Contact): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+del) | Delete a contact from the room |\n| method | [`quit(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+quit) | Bot quit the room itself |\n| method | [`topic(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+topic) | GET topic from the room |\n| method | [`topic(newTopic: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+topic) | SET topic from the room |\n| method | [`announce(text: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+announce) | SET\u002FGET announce from the room |\n| method | [`qrcode(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+qrcode) | Get QR Code of the Room from the room, which can be used as scan and join the room. |\n| method | [`alias(contact: Contact): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+alias) | Return contact's roomAlias in the room |\n| method | [`roomAlias(contact: Contact): Promise\u003Cstring \\| null>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+roomAlias) | Same as function alias |\n| method | [`has(contact: Contact): Promise\u003Cboolean>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+has) | Check if the room has member `contact` |\n| method | [`memberAll(query?: string): Promise\u003CContact[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+memberAll) | Find all contacts or with specific name in a room |\n| method | [`member(query: string): Promise\u003Cnull \\| Contact>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+member) | Find all contacts in a room, if get many, return the first one. |\n| method | [`memberList():Promise\u003CContact[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+memberList) | get all room member from the room |\n| method | [`owner(): null \\| Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+owner) | Get room's owner from the room. |\n\n#### 4.1 Class `RoomInvitation`\n\nAccept room invitation\n\n| RoomInvitation | API | Description |\n| :--- | :--- | :---        |\n| method | [`accept(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+accept) | accept Room Invitation |\n| method | [`inviter(): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+inviter) | get the inviter from room invitation |\n| method | [`roomTopic(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+inviter) | get the room topic from room invitation |\n| method | [`date(): Promise\u003CDate>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+date) | the time it was created |\n| method | [`age(): Promise\u003Cnumber>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+age) | the number of seconds since it has been created |\n\n## TEST\n\n[![NPM](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fworkflows\u002FNPM\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ANPM)\n[![Docker](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fworkflows\u002FDocker\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ADocker)\n[![Coverage Status](https:\u002F\u002Fcoveralls.io\u002Frepos\u002Fgithub\u002Fwechaty\u002Fwechaty\u002Fbadge.svg?branch=main)](https:\u002F\u002Fcoveralls.io\u002Fgithub\u002Fwechaty\u002Fwechaty?branch=main)\n\n[![Known Vulnerabilities](https:\u002F\u002Fsnyk.io\u002Ftest\u002Fgithub\u002FWechaty\u002Fwechaty\u002Fbadge.svg)](https:\u002F\u002Fsnyk.io\u002Ftest\u002Fgithub\u002FWechaty\u002Fwechaty)\n\nWechaty is fully automatically tested by unit and integration tests, with Continuous Integration & Continuous Delivery (CI\u002FCD) support powered by CI like Travis, Shippable and Appveyor.\n\nTo test Wechaty, run:\n\n```shell\nnpm test\n```\n\nGet to know more about the tests from [Wiki:Tests](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fwiki\u002FTests)\n\n## CREATING WECHATY PLUGIN\n\nCreating and publishing a Wechaty Plugin is simple. Simply expose your module as a function that takes 1 parameter: wechaty. When your plugin is imported by Wechaty, it will pass itself in as the argument, and so you are free to add any configuration that Wechaty supports.\n\n```ts\nimport { WechatyPlugin } from 'wechaty'\n\nexport default const MyPlugin: WechatyPlugin = (wechaty: Wechaty) => {\n  \u002F\u002F ...\n}\n```\n\nThe `config` exist so the user can pass in customizations to your Plugin. In documenting your Wechaty Plugin, you would lay out your supported config for the user.\n\nSee:\n\n1. [Wechaty Plugin Support with KickOut Example #1939](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1939)\n1. [Wechaty Plugins Contrib](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-plugin-contrib)\n\n## :pencil: RELEASE NOTES\n\n- [Latest Release](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Freleases\u002Flatest)(All releases [here](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Freleases))\n- [Changelog](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fblob\u002Fmain\u002FCHANGELOG.md)\n\n### :saxophone: Views Since Feb 15, 2019\n\n[![HitCount](http:\u002F\u002Fhits.dwyl.io\u002Fwechaty\u002Fwechaty.svg)](http:\u002F\u002Fhits.dwyl.io\u002Fwechaty\u002Fwechaty)\n\n## :sparkling_heart: POWERED BY WECHATY\n\n[![Powered by Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPowered%20By-Wechaty-brightgreen.svg)](https:\u002F\u002Fwechaty.js.org)\n\n### :sparkles: Wechaty Badge\n\n```markdown\n[![Powered by Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPowered%20By-Wechaty-brightgreen.svg)](https:\u002F\u002Fwechaty.js.org)\n```\n\nGet more embed html\u002Fmarkdown code from [Wiki:Badge](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fwiki\u002FBadge)\n\n### :star2: Projects Using Wechaty\n\n1. [一个用CNN深度神经网络给图片评分的wechaty项目](https:\u002F\u002Fgithub.com\u002Fhuyingxi\u002Fwechaty_selfie)\n2. [Relay between Telegram and WeChat](https:\u002F\u002Fgithub.com\u002FFiraenix\u002FTeleChatRelay)\n3. [A chat bot managing the HaoShiYou wechat groups run by volunteers of haoshiyou.org](https:\u002F\u002Fgithub.com\u002Fxinbenlv\u002Fhaoshiyou-bot)\n4. [An interactive chat bot to manage a TODO list](https:\u002F\u002Fgithub.com\u002Fcoderbunker\u002Fcandobot)\n5. [Forward WeChat messages to telegram](https:\u002F\u002Fgithub.com\u002Fluosheng\u002FWegram)\n6. [koa与wechaty实现的微信小助手，可定时提醒与发消息设定定时任务](https:\u002F\u002Fgithub.com\u002Fgengchen528\u002Fwechat-assistant)\n7. [Wechaty Pay - 让线上没有难做的生意](https:\u002F\u002Fgithub.com\u002Fcoderwhocode\u002Fwechaty-pay)\n8. [开源社的微信机器人项目](https:\u002F\u002Fgithub.com\u002Fkaiyuanshe\u002Fwechat-robot)\n\nPull Request is welcome to add yours!\n\nLearn more about Projects Using Wechaty at [Wiki:Projects Using Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fwiki\u002FProjects-Using-Wechaty)\n\n## :innocent: Find a Good Server\n\nThe best practice for running Wechaty Docker\u002FNPM is using a VPS(Virtual Private Server) outside of China, which can save you hours of time because `npm install` and `docker pull` will run smoothly without any problem.\n\nThe following VPS providers are used by the Wechaty team, and they worked perfectly in production. You can use the following link to get one in minutes. Also, doing this can support Wechaty because you are referred by us.\n\n| Location  | Price | Ram     | Payment           | Provider |\n| ---       | ---   | ---     | ---               | ---      |\n| Singapore | $5    | 512MB   | Paypal            | [DigitalOcean](https:\u002F\u002Fm.do.co\u002Fc\u002F01a54778df5c) |\n| Japan     | $5    | 1GB     | Paypal            | [Linode](https:\u002F\u002Fwww.linode.com\u002F?r=5fd2b713d711746bb5451111df0f2b6d863e9f63) |\n| Korea     | $10   | 1GB     | Alipay, Paypal    | [Netdedi](https:\u002F\u002Fwww.netdedi.com\u002F?affid=35) |\n| Singapore | $3.5  | 512MB   | Alipay, Wechat    | [Vultr](https:\u002F\u002Fwww.vultr.com\u002F?ref=6986613) |\n\n## :notes: See Also\n\n- [RelatedProject](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fwiki\u002FRelatedProject)\n\n## :poop: The Story\n\nIn 2017 ...\n\nHuan's daily life\u002Fwork depends on too much chat on wechat.\n\n- Almost 14,000 wechat friends in May 2014, before wechat restricts a total number of friends to 5,000.\n- Almost 400 wechat rooms, and most of them have more than 400 members.\n\nCan you imagine that? He was dying...\n\nSo a tireless bot working for me 24x7 on wechat, monitoring\u002Ffiltering the most important message is badly needed. For example, it highlights discussion which contains the KEYWORDS which he want to follow up(especially in a noisy room). ;-)\n\nAt last, It's built for huan's personal study purpose of Automatically Testing.\n\n## Stargazers over time\n\n[![Stargazers over time](https:\u002F\u002Fstarchart.cc\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fstarchart.cc\u002Fwechaty\u002Fwechaty)\n\n## :two_hearts: Contributors\n\n[![GitHub issues](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fissues)\n[![GitHub pull requests](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-pr\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fpulls)\n[![Open Collective Backers](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fbacker\u002Fbadge.svg?label=open%20collective%20backers&color=blue)](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002F)\n[![Open Collective Sponsors](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fsponsors\u002Fbadge.svg?label=open%20collective%20sponsors&color=blue)](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002F)\n\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F0)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F0)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F1)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F1)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F2)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F2)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F3)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F3)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F4)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F4)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F5)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F5)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F6)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F6)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F7)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F7)\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n\n-----\n\n[![Contribute](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fcontributors.svg?width=890&button=false)](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fgraphs\u002Fcontributors)\n\n## :sunglasses: Backers\n\n[![Backers on Open Collective](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fbackers\u002Fbadge.svg)](#sunglasses-backers)\n\nThank you to all our backers! 🙏 [[Become a backer](https:\u002F\u002Fopencollective.com\u002Fwechaty#backer)]\n\n[![Open Collective Wechaty](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fbackers.svg?width=890)](https:\u002F\u002Fopencollective.com\u002Fwechaty#backers)\n\n## :smirk: Sponsors\n\n[![Sponsors on Open Collective](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fsponsors\u002Fbadge.svg)](#smirk-sponsors)\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https:\u002F\u002Fopencollective.com\u002Fwechaty#sponsor)]\n\n[![Wechaty Sponsor](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fsponsor.svg?width=890)](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002F#sponsor)\n\n## Multi-language Wechaty\n\n[![Python Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-Python-blue)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpython-wechaty)\n[![Go Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-Go-7de)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fgo-wechaty)\n[![Java(Kotlin) Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-Java-f80)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fjava-wechaty)\n[![Scala Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-Scala-890)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fscala-wechaty)\n[![PHP Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-PHP-99c)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fphp-wechaty)\n[![.NET(C#) Wechatyin](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-.NET-629)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fdotnet-wechaty)\n\n- [Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty) - RPA SDK for Chatot Makers (TypeScript)\n- [Python Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpython-wechaty) - RPA SDK for Chatbot Makers written in Python\n- [Go Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fgo-wechaty) - RPA SDK for Chatbot Makers written in Go\n- [Java Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fjava-wechaty) - RPA SDK for Chatbot Makers written in Java(Kotlin)\n- [Scala Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fscala-wechaty) - RPA SDK for Chatbot Makers written in Scala\n- [PHP Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fphp-wechaty) - RPA SDK for Chatbot Makers written in PHP\n- [.Net(C#) Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fdotnet-wechaty) - RPA SDK for Chatbot Makers written in .NET(C#)\n\n## History\n\n### main v1.11 (Nov 22, 2021)\n\nWorking on reduxify the Wechaty ecosystem for applying the CQRS pattern.\n\n### v1.10 (Nov 21, 2021)\n\nSecond beta release of Wechaty, with all ecosystem npm modules with version v1.10 (wechaty-puppet, wechaty-puppet-service, etc)\n\n### v1.0 (Sep 2021)\n\n- Release v1.0 of Wechaty is the first beta release of Wechaty.\n\n### v0.69\n\n1. v0.69: Supports ES Modules (with CJS dual support) ([#2232](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2232))\n\n### v0.68 (Aug 27, 2021)\n\n1. TLS support ([#2231](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2231))\n1. The latest CommonJS version\n\n## Creators\n\n1. [Huan](https:\u002F\u002Fgithub.com\u002Fhuan) [(LinkedIn)](http:\u002F\u002Flinkedin.com\u002Fin\u002Fhuan42), 🐧 Tencent TVP of Chatbot・🤖 Chatie Architect・⭐️ GitHub Star・🚀 YC W19・🌐 Microsoft RD & AI MVP・🦾 Google ML GDE ・🤠 Serial Entrepreneur・🔥 Burner\n1. [Rui (李佳芮)](https:\u002F\u002Fpre-angel.com\u002Fpeoples\u002Fjiarui-li\u002F), Microsoft AI MVP & RD, Co-founder & CEO of [Juzi.BOT](https:\u002F\u002Fwww.juzibot.com\u002F) (YC W19 Alumni)\n\n[![Profile of Huan Li on StackOverflow](https:\u002F\u002Fstackoverflow.com\u002Fusers\u002Fflair\u002F1123955.png)](https:\u002F\u002Fstackoverflow.com\u002Fusers\u002F1123955\u002Fhuan)\n\n## Cite Wechaty\n\nTo cite this project in publications:\n\n```bibtex\n@misc{Wechaty,\n  author = {Huan Li, Rui Li},\n  title = {Wechaty: Conversational SDK for Chatbot Makers},\n  year = {2016},\n  publisher = {GitHub},\n  journal = {GitHub Repository},\n  howpublished = {\\url{https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty}},\n}\n```\n\n## Copyright & License\n\n- Code & Docs © 2016-now Huan, Rui, and Wechaty Community Contributors\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","# Wechaty [![加入 Wechaty Discord 开发者社区](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F916984413944967180?logo=discord&style=flat)](https:\u002F\u002Fdiscord.gg\u002F7q8NBZbQzt) [![NPM 版本](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fwechaty?color=brightgreen)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty) [![NPM](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fworkflows\u002FNPM\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ANPM) [![Docker](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fworkflows\u002FDocker\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ADocker)\n\n[![Wechaty](https:\u002F\u002Fwechaty.js.org\u002Fimg\u002Fwechaty-logo.svg)](https:\u002F\u002Fwechaty.js.org)\n\n[Ship.Fail](https:\u002F\u002Fship.fail) [PreAngel](https:\u002F\u002FPreAngel.AI)\n[![下载量](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002Fwechaty.svg?style=flat-square)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty)\n[![GitHub 星标](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fwechaty\u002Fwechaty.svg?label=github%20stars)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty)\n[![Docker 拉取次数](https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fwechaty\u002Fwechaty.svg?maxAge=2592000)](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fwechaty\u002Fwechaty\u002F)\n[![ES Modules](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FES-Modules-orange)](https:\u002F\u002Fgithub.com\u002FChatie\u002Ftsconfig\u002Fissues\u002F16)\n\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--3178C6?logo=typescript&logoColor=ffffff)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Ftypescript\u002F)\n[![JavaScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--F7DF1E?logo=javascript&logoColor=000)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Ftypescript\u002F)\n[![Python](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--3670A0?logo=python&logoColor=ffdd54)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fpython\u002F)\n[![Go](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--00ADD8?logo=go&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fgo\u002F)\n[![Java](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--red?logo=java&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fjava\u002F)\n[![.NET](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--5C2D91?logo=dotnet&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fdotnet\u002F)\n[![PHP](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--777BB4?logo=php&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fphp\u002F)\n[![Rust](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--000000?logo=rust&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Frust\u002F)\n[![Scala](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--DC322F?logo=scala&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpolyglot\u002Fscala\u002F)\n\n[![WeChat](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--07C160?logo=wechat&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Fwechat)\n[![Whatsapp](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--25D366?logo=whatsapp&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Fwhatsapp)\n\n\u003C!--\n[![TikTok](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--000000?logo=tiktok&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Ftiktok)\n[![Line](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--00C300?logo=line&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Fline)\n[![Telegram](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F--2CA5E0?logo=telegram&logoColor=white)](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-providers\u002Ftelegram)\n[![Gitter](https:\u002F\u002Fbadges.gitter.im\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fgitter.im\u002Fwechaty\u002Fwechaty?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n[![Gitter 房间成员](https:\u002F\u002Fbadgen.net\u002Fgitter\u002Fmembers\u002Fwechaty\u002Fwechaty)](https:\u002F\u002Fgitter.im\u002Fwechaty\u002Fwechaty?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n[![Telegram Wechaty 频道](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fchat-on%20telegram-blue)](https:\u002F\u002Ft.me\u002Fwechaty)\n-->\n\n## 电梯演讲\n\nWechaty 是一款对话式 RPA SDK，能够简化聊天机器人的开发流程。它就像聊天机器人开发领域的瑞士军刀，为 WhatsApp、WeChat 等多种消息平台提供通用接口。使用 Wechaty，你只需编写一次机器人代码，便可在所有支持的平台上运行。这意味着你可以专注于打造引人入胜的对话体验，而无需担心各平台 API 的复杂性。Wechaty 是开源且易于使用的，并拥有一个充满活力的社区，随时准备帮助你将聊天机器人的创意变为现实。\n\n## 连接聊天机器人\n\nWechaty 是面向聊天机器人开发者的 RPA（机器人流程自动化）SDK，可以帮助你用 6 行代码分别使用 [JavaScript](https:\u002F\u002FGitHub.com\u002FWechaty\u002Fwechaty)、[Python](https:\u002F\u002FGitHub.com\u002FWechaty\u002Fpython-wechaty\u002F)、[Go](https:\u002F\u002FGitHub.com\u002FWechaty\u002Fgo-wechaty\u002F) 和 [Java](https:\u002F\u002FGitHub.com\u002FWechaty\u002Fjava-wechaty\u002F) 编写机器人，同时支持跨平台运行，包括 [Linux、Windows、MacOS](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ANPM)，以及 [Docker](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ADocker)。\n\n:spider_web: \u003Chttps:\u002F\u002Fwechaty.js.org>  \n:octocat: \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty>  \n:beetle: \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fissues>  \n:book: \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-getting-started>  \n:whale: \u003Chttps:\u002F\u002Fhub.docker.com\u002Fr\u002Fwechaty\u002Fwechaty>  \n\n## 最新消息\n\n- [重磅：绕过登录限制，wechaty 免费版 web 协议重放荣光, @gengchen528, 2021 年 4 月 13 日](https:\u002F\u002Fwechaty.js.org\u002F2021\u002F04\u002F13\u002Fwechaty-uos-web\u002F)\n\n## 开发者之声\n\n> \"Wechaty 是一个很棒的解决方案；我相信会有更多用户认识到它的价值。\" [链接](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fpull\u002F310#issuecomment-285574472)  \n> &mdash; \u003Ccite>@Gcaufy，腾讯工程师，[WePY](https:\u002F\u002Fgithub.com\u002FTencent\u002Fwepy) 的作者\u003C\u002Fcite>\n>\n> \"太好用，好用的想哭\"  \n> &mdash; \u003Ccite>@xinbenlv，Google 工程师，HaoShiYou.org 的创始人\u003C\u002Fcite>\n>\n> ”好用到哭“——你们对得起这个评价！ [链接](https:\u002F\u002Fgithub.com\u002Fbigbrother666sh\u002Fshezhangbujianle#%E8%87%B4%E6%95%AC)  \n> &mdash; \u003Ccite>[@bigbrother666sh](https:\u002F\u002Fgithub.com\u002Fbigbrother666sh)，《社长不见了》剧本杀 NPC DM 的创作者\u003C\u002Fcite>\n>\n> \"最好的微信开发库\" [链接](http:\u002F\u002Fweibo.com\u002F3296245513\u002FEc4iNp9Ld?type=comment)  \n> &mdash; \u003Ccite>@Jarvis，百度工程师\u003C\u002Fcite>\n>\n> \"Wechaty 让运营人员有更多时间思考如何进行活动策划、留存用户，实现商业变现\" [链接](http:\u002F\u002Fmp.weixin.qq.com\u002Fs\u002FdWHAj8XtiKG-1fIS5Og79g)  \n> &mdash; \u003Ccite>@lijiarui，Juzi.BOT 的创始人兼 CEO\u003C\u002Fcite>\n>\n> \"如果你懂 js ... 就试试 Wechaty 吧。它非常容易使用。\"  \n> &mdash; \u003Ccite>@Urinx Uri Lee，[WeixinBot(Python)](https:\u002F\u002Fgithub.com\u002FUrinx\u002FWeixinBot) 的作者\u003C\u002Fcite>\n>\n> \"Wechaty 是一个很好的项目；我希望它能继续发展下去！因此，我成为了开放集体的贡献者。\"  \n> &mdash; \u003Ccite>[@Simple](https:\u002F\u002Fgithub.com\u002Fmrwhh)\u003C\u002Fcite>\n\n更多内容请参见 [Wiki:开发者之声](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fwiki\u002FVoice%20Of%20Developer)\n\n### 加入我们的 Discord 社区\n\n[![加入 Wechaty Discord 开发者社区](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F916984413944967180?logo=discord&style=flat)](https:\u002F\u002Fdiscord.gg\u002F7q8NBZbQzt)\n[![Wechaty Discord](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdynamic\u002Fjson?url=https%3A%2F%2Fdiscord.com%2Fapi%2Finvites%2F7q8NBZbQzt%3Fwith_counts%3Dtrue&query=%24.approximate_member_count&logo=discord&logoColor=white&label=用户总数&color=green&style=flat)](https:\u002F\u002Fdiscord.gg\u002F7q8NBZbQzt)\n\nWechaty 被成千上万的开发者用于众多聊天机器人项目中。若想与其他开发者交流，请扫描下方二维码，加入我们的 **Wechaty 开发者社区**。\n\n![Wechaty Discord 社区二维码](https:\u002F\u002Fwechaty.js.org\u002Fimg\u002Fdiscord-qrcode.svg)\n\n立即扫描吧，因为其他 Wechaty 开发者也正期待与你交流呢！\n\n### 资源\n\n过去几年里，Wechaty 举办过许多技术分享会，并撰写了大量博客文章；以下是 Wechaty 的所有相关资源：\n\n- :video_camera: [YouTube 播放列表：观看所有与 Wechaty 相关的技术分享视频](https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PL8hd9KDTdarDXf_Rxtr8meKhxtgcXMInh)\n- :page_with_curl: [完整文档](https:\u002F\u002Fwechaty.js.org\u002F)\n- :bulb: [博客：了解开发者如何使用 Wechaty 构建精彩项目！](https:\u002F\u002Fwechaty.github.io\u002F)\n- :beginner: [Wechaty-Getting-Started：开箱即用的 Wechaty 入门项目模板](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-getting-started)\n- :tada: [Wechaty 贡献者列表：感谢他们的贡献！](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fwiki\u002FContributors)\n- :gift: [Juzibot 支持 Wechaty：全面了解 Wechaty](https:\u002F\u002Fgithub.com\u002Fjuzibot\u002FWelcome\u002Fwiki\u002F关于Wechaty的一切)\n\n## :rocket: 全世界最短的聊天机器人代码：仅 6 行 JavaScript\n\n```javascript\n\nimport { WechatyBuilder } from 'wechaty'\n\nconst wechaty = WechatyBuilder.build() \u002F\u002F 获取一个 Wechaty 实例\nwechaty\n  .on('scan', (qrcode, status) => console.log(`扫描二维码登录：${status}\\nhttps:\u002F\u002Fwechaty.js.org\u002Fqrcode\u002F${encodeURIComponent(qrcode)}`))\n  .on('login',            user => console.log(`用户 ${user} 已登录`))\n  .on('message',       message => console.log(`消息：${message}`))\nwechaty.start()\n```\n\n> **注意：Wechaty 需要 Node.js 版本 >= 16**\n\n这个机器人在扫码登录后，会将所有消息记录到控制台。\n\n你可以在 [examples\u002Fding-dong-bot.ts](examples\u002Fding-dong-bot.ts) 找到 Wechaty 的官方示例，更多示例请参阅我们的 [示例目录](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-getting-started\u002Fblob\u002Fmain\u002Fexamples\u002F)。\n\n## :checkered_flag: 系统要求\n\n1. Node.js 版本 16 或更高\n1. NPM 版本 7 或更高\n1. TypeScript 版本 4.4 或更高\n\n## 快速开始\n\n[![node](https:\u002F\u002Fimg.shields.io\u002Fnode\u002Fv\u002Fwechaty.svg?maxAge=604800)](https:\u002F\u002Fnodejs.org\u002F)\n\n- Wechaty 入门仓库 - \u003Chttps:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-getting-started>\n\n我们为初学者准备了一个设置最简单的 Wechaty 入门仓库。只需 `clone`、`npm install` 和 `npm start`，即可直接运行。\n\n如果你是第一次接触 Wechaty 并希望尝试一下，强烈建议从这个仓库入手，并将其作为你项目的初始模板。\n\n否则，请将上述“全世界最短的聊天机器人代码：6 行 JavaScript”示例保存为名为 `bot.js` 的文件，然后就可以使用 NPM 或 Docker 来运行它了。\n\n### 1. NPM\n\n[![NPM 版本](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fwechaty?color=brightgreen&label=wechaty@latest)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty)\n[![NPM 标签](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fwechaty\u002Fnext?color=yellow&label=wechaty@next)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty?activeTab=versions)\n\n[![下载量](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002Fwechaty.svg?style=flat-square)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fwechaty)\n[![安装大小](https:\u002F\u002Fpackagephobia.now.sh\u002Fbadge?p=wechaty)](https:\u002F\u002Fpackagephobia.now.sh\u002Fresult?p=wechaty)\n\n```shell\nnpm init\nnpm install wechaty\n\n# 创建你的第一个 bot.js 文件，可以复制粘贴上面的“全世界最短的聊天机器人代码：6 行 JavaScript”\n# 然后：\nnode bot.js\n```\n\n### 2. Docker\n\n[![Docker 下载量](https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fwechaty\u002Fwechaty.svg?maxAge=2592000)](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fwechaty\u002Fwechaty\u002F)\n[![Docker 层](https:\u002F\u002Fimages.microbadger.com\u002Fbadges\u002Fimage\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fmicrobadger.com\u002F#\u002Fimages\u002Fwechaty\u002Fwechaty)\n\n- Wechaty Docker 入门仓库 - \u003Chttps:\u002F\u002Fgithub.com\u002Fwechaty\u002Fdocker-wechaty-getting-started>\n\n> Wechaty Docker 同时支持 JavaScript 和 TypeScript。如果使用 TypeScript，只需以 `.ts` 为扩展名保存即可，无需编译，因为我们使用 `ts-node` 来运行。\n\n2.1. 运行 JavaScript\n\n```shell\n# 对于 JavaScript\ndocker run -ti --rm --volume=\"$(pwd)\":\u002Fbot wechaty\u002Fwechaty bot.js\n```\n\n2.2. 运行 TypeScript\n\n```shell\n# 对于 TypeScript\ndocker run -ti --rm --volume=\"$(pwd)\":\u002Fbot wechaty\u002Fwechaty bot.ts\n```\n\n> 更多关于 Wechaty Docker 的信息，请参阅 [Wiki:Docker](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fwiki\u002FDocker)。\n\n### 3. 切换协议（木偶）\n\nWechaty 功能非常强大，可以在不同的协议上运行。您可以通过将环境变量 `WECHATY_PUPPET` 设置为不同的木偶提供者来指定协议。\n\n如果您无法使用 Web 协议，可以按照这里的说明使用其他协议：\u003Chttps:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fwiki\u002FSupport-Developers> 我们提供免费的令牌，以支持开发者构建有价值的微信聊天机器人。\n\n目前我们支持以下 [木偶提供者](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fpuppet-services\u002F)：\n\n| 协议       | 木偶提供者               | 环境变量                     |\n|------------|--------------------------|------------------------------|\n| Web        | [PuppetPuppeteer](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-puppet-puppeteer) | `export WECHATY_PUPPET=wechaty-puppet-puppeteer` |\n| Windows    | [PuppetWorkPro](https:\u002F\u002Fgithub.com\u002FRPAChat\u002Fworkpro-getting-started) | `export WECHATY_PUPPET=wechaty-puppet-service` |\n| Mock       | [PuppetMock](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-puppet-mock) | `export WECHATY_PUPPET=wechaty-puppet-mock` |\n| Web        | [PuppetWechat4u](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-puppet-wechat4u) | `export WECHATY_PUPPET=wechaty-puppet-wechat4u` |\n| iPad       | [PuppetRock](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpuppet-service-providers) | `export WECHATY_PUPPET=wechaty-puppet-service` |\n| iPad       | [PuppetPadLocal](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpuppet-service-providers) | `export WECHATY_PUPPET=wechaty-puppet-service` |\n| Windows    | [PuppetDonut](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpuppet-service-providers) | `export WECHATY_PUPPET=wechaty-puppet-service` |\n| iPad       | ~~PuppetPadpro~~ **已弃用** | `export WECHATY_PUPPET=wechaty-puppet-padpro` |\n| iPad       | ~~PuppetPadchat~~ **已弃用** | `export WECHATY_PUPPET=wechaty-puppet-padchat` |\n| iPad       | ~~PuppetPadplus~~ **已弃用** | `export WECHATY_PUPPET=wechaty-puppet-padplus` |\n| Mac        | ~~PuppetMacpro~~ **已弃用** | `export WECHATY_PUPPET=wechaty-puppet-macpro` |\n| Windows    | ~~PuppetWxwork~~ **已弃用** | `export WECHATY_PUPPET=wechaty-puppet-service` |\n\n更多关于 Wechaty 木偶的信息，请参阅木偶维基：\n\n1. 木偶目录： \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet\u002Fwiki\u002FDirectory>\n1. 木偶兼容性： \u003Chttps:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet\u002Fwiki\u002FCompatibility>\n\n## :guitar: API\n\n完整的文档请参阅 [Wechaty 官方 API 参考](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F)。\n\n### 1 类 `Wechaty`\n\n主机器人类。\n\n一个 `Bot` 是一个 Wechaty 实例，用于控制特定的 [wechaty-puppet](https:\u002F\u002Fwechaty.js.org\u002Fdocs\u002Fspecifications\u002Fpuppet\u002F)。\n\n- `new Wechaty(options?: WechatyOptions)`\n    1. `options.name?: string` 此机器人的名称（可选）\n    2. `options.puppet?: string` 选择要使用的木偶提供者。必须是以下之一：\n        1. [wechaty-puppet-wechat](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet-wechat) - 适用于 Web 微信的 Angular 钩子\n        2. [wechaty-puppet-wechat4u](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet-wechat4u) - 适用于 Web 微信的 HTTP API\n        3. [wechaty-puppet-padpro](https:\u002F\u002Fgithub.com\u002Fbotorange\u002Fwechaty-puppet-padpro) - iPad 应用协议\n        4. [wechaty-puppet-ioscat](https:\u002F\u002Fgithub.com\u002Flinyimin-bupt\u002Fwechaty-puppet-ioscat) - iPhone 应用钩子\n        5. [wechaty-puppet-mock](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty-puppet-mock) - 用于测试的模拟\n    3. `options.puppetOptions?: PuppetOptions` 木偶提供者的选项。\n\n| Wechaty | API | 描述 |\n| :--- | :--- | :---        |\n| 事件 | [`login`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 机器人成功登录后触发 |\n| 事件 | [`logout`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 机器人登出后触发 |\n| 事件 | [`friendship`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 当有人向机器人发送好友请求时触发 |\n| 事件 | [`message`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 当有新消息时触发 |\n| 事件 | [`room-join`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 当有人加入任何聊天室时触发 |\n| 事件 | [`room-topic`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 当有人更改聊天室主题时触发 |\n| 事件 | [`room-leave`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 当有人离开聊天室时触发 |\n| 事件 | [`room-invite`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 当有聊天室邀请时触发 |\n| 事件 | [`scan`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+on) | 当机器人需要显示二维码供扫描时触发 |\n| 方法 | [`start(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+start) | 启动机器人 |\n| 方法 | [`stop(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+stop) | 停止机器人 |\n| 方法 | [`logonoff(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+logonoff) | 返回机器人的登录状态 |\n| 方法 | [`logout(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+logout) | 让机器人登出 |\n| 方法 | [`currentUser(): ContactSelf`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+currentUser) | 获取当前登录的机器人联系人 |\n| 方法 | [`say(text: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Wechaty+say) | 让机器人对自己说 `text` |\n\n### 2 类 `Contact`\n\n所有微信联系人（好友与非好友）都将被封装为一个 `Contact` 对象。\n\n| Contact | API | 描述 |\n| :--- | :--- | :---        |\n| 静态 | [`find(query: string): Promise\u003Cnull \\| Contact>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact.find) | 根据姓名或备注查找联系人，若结果多于一个，则返回第一个。 |\n| 静态 | [`findAll(query: string): Promise\u003CContact[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact.findAll) | 根据 `name` 或 `alias` 查找联系人。 |\n| 静态 | [`load(query: string): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact.load) | 根据 ID 获取联系人。 |\n| 属性 | `id: readonly string` | 获取联系人的 ID。 |\n| 方法 | [`sync(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+sync) | 强制重新加载联系人数据，从底层 API 再次同步数据。 |\n| 方法 | [`say(text: string): Promise\u003Cvoid \\| Message>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+say) | 向联系人发送文本、联系人名片或文件，返回机器人发送的消息（仅 `puppet-padplus` 支持）。 |\n| 方法 | [`self(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+self) | 检查联系人是否为自身。 |\n| 方法 | [`name(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+name) | 获取联系人的姓名。 |\n| 方法 | [`alias(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+alias) | 获取联系人的备注名。 |\n| 方法 | [`alias(newAlias: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+alias) | 设置或删除联系人的备注名。 |\n| 方法 | [`friend(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+friend) | 检查联系人是否为好友。 |\n| 方法 | [`type(): ContactType`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+type) | 返回联系人的类型。 |\n| 方法 | [`province(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+province) | 获取联系人的省份信息。 |\n| 方法 | [`city(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+city) | 获取联系人的城市信息。 |\n| 方法 | [`avatar(): Promise\u003CFileBox>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+avatar) | 获取联系人的头像图片流。 |\n| 方法 | [`gender(): ContactGender`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Contact+gender) | 获取联系人的性别。\n\n#### 2.1 类 `ContactSelf`\n\n类 `ContactSelf` 继承自 `Contact`。\n\n| ContactSelf | API | 描述 |\n| :--- | :--- | :---        |\n| 方法 | [`avatar(file: FileBox): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#ContactSelf+avatar) | 设置机器人的头像。 |\n| 方法 | [`qrcode(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#ContactSelf+qrcode) | 获取机器人的二维码。 |\n| 方法 | [`signature(text: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#ContactSelf+signature) | 设置机器人的个性签名。\n\n#### 2.2 类 `Friendship`\n\n用于处理添加好友、接收好友请求及确认好友关系的事件。\n\n| Friendship | API | 描述 |\n| :--- | :--- | :---        |\n| 静态 | [`add(contact: Contact, hello?: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship.add) | 向联系人发送好友邀请。 |\n| 方法 | [`accept(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship+accept) | 接受好友请求。 |\n| 方法 | [`hello(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship+hello) | 获取好友邀请中的问候语。 |\n| 方法 | [`contact(): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship+contact) | 获取好友关系中的联系人。 |\n| 方法 | [`type(): FriendshipType`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Friendship+type) | 返回好友关系类型（未知、已确认、已接收、验证中）。\n\n### 3 类 `Message`\n\n所有微信消息都将被封装为一个 `Message` 对象。\n\n| Message | API | 描述 |\n| :--- | :--- | :---        |\n| 静态 | [`find(query: string): Promise\u003Cnull \\| Message>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message.find) | 在缓存中查找消息并返回第一个。 |\n| 静态 | [`findAll(query: string): Promise\u003CMessage[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message.findAll) | 在缓存中查找消息，返回消息列表。 |\n| 方法 | [`from(): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+from) | 获取消息的发送者。 |\n| 方法 | [`to(): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+to) | 获取消息的接收者。 |\n| 方法 | [`room(): null \\| Room`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+room) | 获取消息所在的群聊。（若消息不在群聊中，则返回 `null`） |\n| 方法 | [`text(): string`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+text) | 获取消息的文本内容。 |\n| 方法 | [`say(text: string): Promise\u003Cvoid \\| Message>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+say) | 向发送者回复文本、媒体文件或联系人消息，返回机器人发送的消息（仅 `puppet-padplus` 支持）。 |\n| 方法 | [`type(): MessageType`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+type) | 获取消息的类型。 |\n| 方法 | [`self(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+self) | 判断消息是否由自身发送。 |\n| 方法 | [`mention(): Contact[]`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+mention) | 获取消息中被提及的好友列表。 |\n| 方法 | [`mentionSelf(): boolean`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+mentionSelf) | 判断消息是否提及了自身。 |\n| 方法 | [`forward(to: Contact): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+forward) | 转发接收到的消息。 |\n| 方法 | [`age(): number`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+age) | 消息创建以来的秒数。 |\n| 方法 | [`date(): Date`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+date) | 消息的创建时间。 |\n| 方法 | [`toFileBox(): Promise\u003CFileBox>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+toFileBox) | 从消息中提取媒体文件，并将其放入 `FileBox` 中。 |\n| 方法 | [`toContact(): Promise\u003CContact>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Message+toContact) | 获取消息中的分享卡片。\n\n### 4 类 `Room`\n\n所有微信群（群聊）都将被封装为一个 `Room` 对象。\n\n| Room | API | 描述 |\n| :--- | :--- | :---        |\n| 静态 | [`create(contactList: Contact[], topic?: string): Promise\u003CRoom>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room.create) | 创建一个新的群聊 |\n| 静态 | [`find(query: string): Promise\u003Cnull \\| Room>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room.find) | 根据条件查找一个群聊。如果找到多个，返回第一个。 |\n| 静态 | [`findAll(query: string): Promise\u003CRoom[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room.findAll) | 查找群聊中的所有成员 |\n| 静态 | [`load(query: string): Room`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room.load) | 根据群聊 ID 加载群聊对象 |\n| 属性 | `id: readonly string` |  |\n| 事件 | [`join`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+on) | 当有人加入任何群聊时触发 |\n| 事件 | [`topic`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+on) | 当有人更改群聊主题时触发 |\n| 事件 | [`leave`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+on) | 当有人离开群聊时触发 |\n| 事件 | [`invite`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+on) | 当收到群聊邀请时触发 |\n| 方法 | [`sync(): \u003CPromise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+sync) | 强制重新加载群聊数据，从底层 API 再次同步数据。 |\n| 方法 | [`say(text: string): Promise\u003Cvoid \\| Message>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+say) | 在群聊中发送文本、媒体文件、联系人名片或包含 @提及联系人的消息，返回机器人发送的消息（仅 `puppet-padplus` 支持）。 |\n| 方法 | [`add(contact: Contact): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+add) | 将联系人添加到群聊中 |\n| 方法 | [`del(contact: Contact): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+del) | 从群聊中删除联系人 |\n| 方法 | [`quit(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+quit) | 机器人自己退出群聊 |\n| 方法 | [`topic(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+topic) | 获取群聊的主题 |\n| 方法 | [`topic(newTopic: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+topic) | 设置群聊的主题 |\n| 方法 | [`announce(text: string): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+announce) | 设置\u002F获取群聊公告 |\n| 方法 | [`qrcode(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+qrcode) | 获取群聊的二维码，可用于扫描加入群聊。 |\n| 方法 | [`alias(contact: Contact): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+alias) | 返回联系人在群聊中的昵称 |\n| 方法 | [`roomAlias(contact: Contact): Promise\u003Cstring \\| null>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+roomAlias) | 与 `alias` 方法功能相同 |\n| 方法 | [`has(contact: Contact): Promise\u003Cboolean>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+has) | 检查群聊中是否包含指定联系人 |\n| 方法 | [`memberAll(query?: string): Promise\u003CContact[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+memberAll) | 查找群聊中的所有联系人，或具有特定名称的联系人 |\n| 方法 | [`member(query: string): Promise\u003Cnull \\| Contact>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+member) | 查找群聊中的联系人，如果找到多个，返回第一个。 |\n| 方法 | [`memberList():Promise\u003CContact[]>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+memberList) | 获取群聊中的所有成员 |\n| 方法 | [`owner(): null \\| Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#Room+owner) | 获取群聊的所有者 |\n\n#### 4.1 类 `RoomInvitation`\n\n处理群聊邀请\n\n| RoomInvitation | API | 描述 |\n| :--- | :--- | :---        |\n| 方法 | [`accept(): Promise\u003Cvoid>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+accept) | 接受群聊邀请 |\n| 方法 | [`inviter(): Contact`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+inviter) | 获取群聊邀请的发送者 |\n| 方法 | [`roomTopic(): Promise\u003Cstring>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+inviter) | 获取群聊邀请中的群聊主题 |\n| 方法 | [`date(): Promise\u003CDate>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+date) | 邀请创建的时间 |\n| 方法 | [`age(): Promise\u003Cnumber>`](https:\u002F\u002Fwechaty.github.io\u002Fwechaty\u002F#RoomInvitation+age) | 邀请自创建以来的秒数 |\n\n## 测试\n\n[![NPM](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fworkflows\u002FNPM\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ANPM)\n[![Docker](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fworkflows\u002FDocker\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Factions?query=workflow%3ADocker)\n[![覆盖率](https:\u002F\u002Fcoveralls.io\u002Frepos\u002Fgithub\u002Fwechaty\u002Fwechaty\u002Fbadge.svg?branch=main)](https:\u002F\u002Fcoveralls.io\u002Fgithub\u002Fwechaty\u002Fwechaty?branch=main)\n\n[![已知漏洞](https:\u002F\u002Fsnyk.io\u002Ftest\u002Fgithub\u002FWechaty\u002Fwechaty\u002Fbadge.svg)](https:\u002F\u002Fsnyk.io\u002Ftest\u002Fgithub\u002FWechaty\u002Fwechaty)\n\nWechaty 通过单元测试和集成测试进行全面自动化测试，并支持持续集成与持续交付 (CI\u002FCD)，由 Travis、Shippable 和 Appveyor 等 CI 工具提供支持。\n\n要测试 Wechaty，请运行：\n\n```shell\nnpm test\n```\n\n更多关于测试的信息，请参阅 [Wiki:Tests](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fwiki\u002FTests)。\n\n## 创建 Wechaty 插件\n\n创建并发布 Wechaty 插件非常简单。只需将你的模块暴露为一个接受单个参数 `wechaty` 的函数即可。当你的插件被 Wechaty 导入时，它会将自身作为参数传递进来，因此你可以自由地添加 Wechaty 支持的任何配置。\n\n```ts\nimport { WechatyPlugin } from 'wechaty'\n\nexport default const MyPlugin: WechatyPlugin = (wechaty: Wechaty) => {\n  \u002F\u002F ...\n}\n```\n\n`config` 的存在是为了让用户能够向你的插件传递自定义配置。在编写 Wechaty 插件文档时，你应该列出用户可以使用的配置选项。\n\n更多信息请参见：\n\n1. [Wechaty 插件支持与 KickOut 示例 #1939](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1939)\n1. [Wechaty 插件贡献库](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty-plugin-contrib)\n\n## :pencil: 发布说明\n\n- [最新版本](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Freleases\u002Flatest)（所有版本 [这里](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Freleases)）\n- [变更日志](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fblob\u002Fmain\u002FCHANGELOG.md)\n\n### :saxophone: 自 2019 年 2 月 15 日以来的浏览量\n\n[![访问计数](http:\u002F\u002Fhits.dwyl.io\u002Fwechaty\u002Fwechaty.svg)](http:\u002F\u002Fhits.dwyl.io\u002Fwechaty\u002Fwechaty)\n\n## :sparkling_heart: 由 Wechaty 提供支持\n\n[![Powered by Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPowered%20By-Wechaty-brightgreen.svg)](https:\u002F\u002Fwechaty.js.org)\n\n### :sparkles: Wechaty 徽章\n\n```markdown\n[![Powered by Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPowered%20By-Wechaty-brightgreen.svg)](https:\u002F\u002Fwechaty.js.org)\n```\n\n更多嵌入式 HTML\u002FMarkdown 代码，请参阅 [Wiki:Badge](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fwiki\u002FBadge)。\n\n### :star2: Projects Using Wechaty\n\n1. [一个用CNN深度神经网络给图片评分的wechaty项目](https:\u002F\u002Fgithub.com\u002Fhuyingxi\u002Fwechaty_selfie)\n2. [Relay between Telegram and WeChat](https:\u002F\u002Fgithub.com\u002FFiraenix\u002FTeleChatRelay)\n3. [A chat bot managing the HaoShiYou wechat groups run by volunteers of haoshiyou.org](https:\u002F\u002Fgithub.com\u002Fxinbenlv\u002Fhaoshiyou-bot)\n4. [An interactive chat bot to manage a TODO list](https:\u002F\u002Fgithub.com\u002Fcoderbunker\u002Fcandobot)\n5. [Forward WeChat messages to telegram](https:\u002F\u002Fgithub.com\u002Fluosheng\u002FWegram)\n6. [koa与wechaty实现的微信小助手，可定时提醒与发消息设定定时任务](https:\u002F\u002Fgithub.com\u002Fgengchen528\u002Fwechat-assistant)\n7. [Wechaty Pay - 让线上没有难做的生意](https:\u002F\u002Fgithub.com\u002Fcoderwhocode\u002Fwechaty-pay)\n8. [开源社的微信机器人项目](https:\u002F\u002Fgithub.com\u002Fkaiyuanshe\u002Fwechat-robot)\n\nPull Request is welcome to add yours!\n\nLearn more about Projects Using Wechaty at [Wiki:Projects Using Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fwiki\u002FProjects-Using-Wechaty)\n\n## :innocent: Find a Good Server\n\nThe best practice for running Wechaty Docker\u002FNPM is using a VPS(Virtual Private Server) outside of China, which can save you hours of time because `npm install` and `docker pull` will run smoothly without any problem.\n\nThe following VPS providers are used by the Wechaty team, and they worked perfectly in production. You can use the following link to get one in minutes. Also, doing this can support Wechaty because you are referred by us.\n\n| Location  | Price | Ram     | Payment           | Provider |\n| ---       | ---   | ---     | ---               | ---      |\n| Singapore | $5    | 512MB   | Paypal            | [DigitalOcean](https:\u002F\u002Fm.do.co\u002Fc\u002F01a54778df5c) |\n| Japan     | $5    | 1GB     | Paypal            | [Linode](https:\u002F\u002Fwww.linode.com\u002F?r=5fd2b713d711746bb5451111df0f2b6d863e9f63) |\n| Korea     | $10   | 1GB     | Alipay, Paypal    | [Netdedi](https:\u002F\u002Fwww.netdedi.com\u002F?affid=35) |\n| Singapore | $3.5  | 512MB   | Alipay, Wechat    | [Vultr](https:\u002F\u002Fwww.vultr.com\u002F?ref=6986613) |\n\n## :notes: See Also\n\n- [RelatedProject](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fwiki\u002FRelatedProject)\n\n## :poop: The Story\n\nIn 2017 ...\n\nHuan's daily life\u002Fwork depends on too much chat on wechat.\n\n- Almost 14,000 wechat friends in May 2014, before wechat restricts a total number of friends to 5,000.\n- Almost 400 wechat rooms, and most of them have more than 400 members.\n\nCan you imagine that? He was dying...\n\nSo a tireless bot working for me 24x7 on wechat, monitoring\u002Ffiltering the most important message is badly needed. For example, it highlights discussion which contains the KEYWORDS which he want to follow up(especially in a noisy room). ;-)\n\nAt last, It's built for huan's personal study purpose of Automatically Testing.\n\n## Stargazers over time\n\n[![Stargazers over time](https:\u002F\u002Fstarchart.cc\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fstarchart.cc\u002Fwechaty\u002Fwechaty)\n\n## :two_hearts: Contributors\n\n[![GitHub issues](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fissues)\n[![GitHub pull requests](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-pr\u002Fwechaty\u002Fwechaty.svg)](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fpulls)\n[![Open Collective Backers](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fbacker\u002Fbadge.svg?label=open%20collective%20backers&color=blue)](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002F)\n[![Open Collective Sponsors](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fsponsors\u002Fbadge.svg?label=open%20collective%20sponsors&color=blue)](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002F)\n\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F0)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F0)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F1)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F1)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F2)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F2)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F3)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F3)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F4)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F4)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F5)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F5)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F6)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F6)\n[![contributor](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Fimages\u002F7)](https:\u002F\u002Fsourcerer.io\u002Ffame\u002Fhuan\u002Fwechaty\u002Fwechaty\u002Flinks\u002F7)\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n\n-----\n\n[![Contribute](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fcontributors.svg?width=890&button=false)](https:\u002F\u002Fgithub.com\u002FWechaty\u002Fwechaty\u002Fgraphs\u002Fcontributors)\n\n## :sunglasses: Backers\n\n[![Backers on Open Collective](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fbackers\u002Fbadge.svg)](#sunglasses-backers)\n\nThank you to all our backers! 🙏 [[Become a backer](https:\u002F\u002Fopencollective.com\u002Fwechaty#backer)]\n\n[![Open Collective Wechaty](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fbackers.svg?width=890)](https:\u002F\u002Fopencollective.com\u002Fwechaty#backers)\n\n## :smirk: Sponsors\n\n[![Sponsors on Open Collective](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fsponsors\u002Fbadge.svg)](#smirk-sponsors)\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https:\u002F\u002Fopencollective.com\u002Fwechaty#sponsor)]\n\n[![Wechaty Sponsor](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002Fsponsor.svg?width=890)](https:\u002F\u002Fopencollective.com\u002Fwechaty\u002F#sponsor)\n\n## Multi-language Wechaty\n\n[![Python Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-Python-blue)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpython-wechaty)\n[![Go Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-Go-7de)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fgo-wechaty)\n[![Java(Kotlin) Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-Java-f80)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fjava-wechaty)\n[![Scala Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-Scala-890)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fscala-wechaty)\n[![PHP Wechaty](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-PHP-99c)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fphp-wechaty)\n[![.NET(C#) Wechatyin](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWechaty-.NET-629)](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fdotnet-wechaty)\n\n- [Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty) - RPA SDK for Chatot Makers (TypeScript)\n- [Python Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fpython-wechaty) - RPA SDK for Chatbot Makers written in Python\n- [Go Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fgo-wechaty) - RPA SDK for Chatbot Makers written in Go\n- [Java Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fjava-wechaty) - RPA SDK for Chatbot Makers written in Java(Kotlin)\n- [Scala Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fscala-wechaty) - RPA SDK for Chatbot Makers written in Scala\n- [PHP Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fphp-wechaty) - RPA SDK for Chatbot Makers written in PHP\n- [.Net(C#) Wechaty](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fdotnet-wechaty) - RPA SDK for Chatbot Makers written in .NET(C#)\n\n## History\n\n### main v1.11 (Nov 22, 2021)\n\nWorking on reduxify the Wechaty ecosystem for applying the CQRS pattern.\n\n### v1.10 (Nov 21, 2021)\n\nSecond beta release of Wechaty, with all ecosystem npm modules with version v1.10 (wechaty-puppet, wechaty-puppet-service, etc)\n\n### v1.0 (Sep 2021)\n\n- Release v1.0 of Wechaty is the first beta release of Wechaty.\n\n### v0.69\n\n1. v0.69: Supports ES Modules (with CJS dual support) ([#2232](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2232))\n\n### v0.68 (Aug 27, 2021)\n\n1. TLS support ([#2231](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2231))\n1. The latest CommonJS version\n\n## Creators\n\n1. [Huan](https:\u002F\u002Fgithub.com\u002Fhuan) [(LinkedIn)](http:\u002F\u002Flinkedin.com\u002Fin\u002Fhuan42), 🐧 Tencent TVP of Chatbot・🤖 Chatie Architect・⭐️ GitHub Star・🚀 YC W19・🌐 Microsoft RD & AI MVP・🦾 Google ML GDE ・🤠 Serial Entrepreneur・🔥 Burner\n1. [Rui (李佳芮)](https:\u002F\u002Fpre-angel.com\u002Fpeoples\u002Fjiarui-li\u002F), Microsoft AI MVP & RD, Co-founder & CEO of [Juzi.BOT](https:\u002F\u002Fwww.juzibot.com\u002F) (YC W19 Alumni)\n\n[![Profile of Huan Li on StackOverflow](https:\u002F\u002Fstackoverflow.com\u002Fusers\u002Fflair\u002F1123955.png)](https:\u002F\u002Fstackoverflow.com\u002Fusers\u002F1123955\u002Fhuan)\n\n## Cite Wechaty\n\nTo cite this project in publications:\n\n```bibtex\n@misc{Wechaty,\n  author = {Huan Li, Rui Li},\n  title = {Wechaty: Conversational SDK for Chatbot Makers},\n  year = {2016},\n  publisher = {GitHub},\n  journal = {GitHub Repository},\n  howpublished = {\\url{https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty}},\n}\n```\n\n## Copyright & License\n\n- Code & Docs © 2016-now Huan, Rui, and Wechaty Community Contributors\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons","# Wechaty 快速上手指南\n\nWechaty 是一个开源的聊天机器人 SDK，支持微信、WhatsApp 等多个平台。它允许开发者使用一套代码构建跨平台的聊天机器人，被誉为“聊天机器人界的瑞士军刀”。\n\n## 1. 环境准备\n\n在开始之前，请确保您的开发环境满足以下最低要求：\n\n*   **Node.js**: 版本 >= 16\n*   **NPM**: 版本 >= 7\n*   **TypeScript**: 版本 >= 4.4 (可选，若使用 TS 开发)\n*   **操作系统**: Linux, Windows, MacOS 或 Docker 环境\n\n> **国内开发者提示**：建议配置 npm 镜像源以加速依赖安装。\n> ```bash\n> npm config set registry https:\u002F\u002Fregistry.npmmirror.com\n> ```\n\n## 2. 安装步骤\n\n您可以选择通过 **NPM** 直接安装，或使用 **Docker** 运行（无需本地安装 Node.js 环境）。\n\n### 方式一：NPM 安装（推荐）\n\n1.  初始化项目并安装 Wechaty：\n    ```bash\n    npm init -y\n    npm install wechaty\n    ```\n\n2.  创建入口文件 `bot.js`，将下方的“基本使用”代码复制进去。\n\n3.  运行机器人：\n    ```bash\n    node bot.js\n    ```\n\n### 方式二：Docker 运行\n\n如果您已安装 Docker，可以直接拉取镜像运行，避免环境配置问题。\n\n1.  创建入口文件 `bot.js`（内容见下方）。\n2.  执行以下命令运行（支持挂载当前目录）：\n    ```bash\n    # 运行 JavaScript 文件\n    docker run -ti --rm --volume=\"$(pwd)\":\u002Fbot wechaty\u002Fwechaty bot.js\n\n    # 若使用 TypeScript (文件名为 bot.ts)，命令如下\n    # docker run -ti --rm --volume=\"$(pwd)\":\u002Fbot wechaty\u002Fwechaty bot.ts\n    ```\n\n## 3. 基本使用\n\n以下是“世界上最短的聊天机器人代码”，仅需 6 行即可实现扫码登录并监听消息。\n\n新建文件 `bot.js`，填入以下内容：\n\n```javascript\nimport { WechatyBuilder } from 'wechaty'\n\nconst wechaty = WechatyBuilder.build() \u002F\u002F 获取 Wechaty 实例\nwechaty\n  .on('scan', (qrcode, status) => console.log(`Scan QR Code to login: ${status}\\nhttps:\u002F\u002Fwechaty.js.org\u002Fqrcode\u002F${encodeURIComponent(qrcode)}`))\n  .on('login',            user => console.log(`User ${user} logged in`))\n  .on('message',       message => console.log(`Message: ${message}`))\nwechaty.start()\n```\n\n**运行流程：**\n1.  执行启动命令后，控制台会输出一个二维码链接。\n2.  访问该链接或直接扫描终端显示的二维码（取决于具体 Puppet 实现）进行微信登录。\n3.  登录成功后，所有接收到的消息将会打印在控制台。\n\n## 4. 切换协议 (Puppet)\n\nWechaty 支持通过环境变量切换不同的底层协议（Puppet），以适应不同的业务场景（如 Web 协议、Windows 协议等）。\n\n在运行命令前设置 `WECHATY_PUPPET` 环境变量即可：\n\n```bash\n# 示例：指定使用 puppeteer (Web 协议)\nexport WECHATY_PUPPET=wechaty-puppet-puppeteer\nnode bot.js\n```\n\n> **注意**：部分协议（如 Windows 协议）可能需要申请 Token 或特定环境支持。详细支持的协议列表请参考官方文档或开发者社区。","某电商运营团队希望构建一个自动客服机器人，在微信和 WhatsApp 上同时处理用户的订单查询与售后咨询。\n\n### 没有 wechaty 时\n- 开发团队需分别研究微信和 WhatsApp 截然不同的私有协议与 API 文档，学习成本极高且耗时漫长。\n- 为了维持双平台运行，必须编写两套完全独立的代码逻辑，导致功能迭代时需在两个项目中重复修改，极易出错。\n- 缺乏统一的会话状态管理机制，难以在不同平台间同步用户上下文，导致跨平台服务体验割裂。\n- 一旦某个社交平台更新接口协议，整个机器人可能立即瘫痪，维护人员需紧急逆向工程修复，稳定性极差。\n- 部署环境复杂，需要为不同语言栈（如 Python 处理微信、Node.js 处理 WhatsApp）配置多套服务器环境。\n\n### 使用 wechaty 后\n- 借助 wechaty 提供的统一抽象层，开发者只需调用一套标准 SDK 即可同时连接微信和 WhatsApp，无需深究底层协议差异。\n- 实现“一次编码，多端运行”，业务逻辑代码完全复用，新增“退货流程”功能时可瞬间同步至所有社交平台。\n- 利用 wechaty 内置的对话状态管理，机器人能精准记忆用户意图，无论用户在哪个平台发言都能获得连贯的上下文服务。\n- 社区驱动的 Puppet 提供者机制让平台适配更敏捷，当上游接口变动时，wechaty 往往已提供修复方案，大幅降低宕机风险。\n- 支持 Docker 容器化部署及多种编程语言（如 TypeScript、Python），团队可基于现有技术栈快速搭建统一的服务架构。\n\nwechaty 通过屏蔽底层平台差异，让开发者从繁琐的协议适配中解放出来，专注于打造真正智能的对话体验。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fwechaty_wechaty_b27dd971.png","Wechaty","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fwechaty_b2deea55.png","Conversational RPA SDK for Chatbot Makers",null,"wechaty@googlegroups.com","chatieio","https:\u002F\u002Fwechaty.js.org","https:\u002F\u002Fgithub.com\u002Fwechaty",[82,86,90,94],{"name":83,"color":84,"percentage":85},"TypeScript","#3178c6",75.2,{"name":87,"color":88,"percentage":89},"JavaScript","#f1e05a",20.1,{"name":91,"color":92,"percentage":93},"Shell","#89e051",4,{"name":95,"color":96,"percentage":97},"Dockerfile","#384d54",0.8,22656,2796,"2026-04-05T15:21:36","Apache-2.0","Linux, Windows, macOS","未说明",{"notes":105,"python":106,"dependencies":107},"该工具主要是一个基于 Node.js 的聊天机器人 SDK，支持多种编程语言（JavaScript, TypeScript, Python, Go, Java 等）。核心运行环境要求为 Node.js 16+。可通过 Docker 部署。支持通过设置环境变量 `WECHATY_PUPPET` 切换不同的协议提供者（如 Web 协议、Windows 协议等）。若使用非 Web 协议可能需要申请 Token。","未说明 (主要基于 Node.js，但也提供 Python 版本支持)",[108,109,110],"Node.js >= 16","NPM >= 7","TypeScript >= 4.4",[112,14,35],"其他",[64,114,115,116,117,118,119,120,121],"chatbot","wechat","whatsapp","conversational-ai","robotics","qq","framework","bot","2026-03-27T02:49:30.150509","2026-04-11T16:51:58.779028",[125,130,135,140,144,148],{"id":126,"question_zh":127,"answer_zh":128,"source_url":129},18052,"如何申请 Wechaty Padchat Puppet 的 Token？","要使用 wechaty-puppet-padchat，需要前往 BotOrange.com 申请 Padchat Token。具体步骤是扫描官方提供的二维码联系 BotOrange 团队获取。申请时请确保您已加入 Wechaty 开发者微信群（通过 README.md 中的二维码），并了解该版本处于早期 Alpha 阶段，需要具备处理 Bug 的工程能力。","https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1296",{"id":131,"question_zh":132,"answer_zh":133,"source_url":134},18053,"如何申请加入 Wechaty Macpro Puppet 的 Alpha 测试？","由于申请人数众多，申请方式已变更为发送邮件至 dev@juzi.bot。邮件主题必须格式为：'wechaty-puppet-macpro alpha test - [您的组织名]'。邮件内容需包含：自我介绍、要解决的问题场景、机器人是否涉及赌博或色情（必须为否）、邮箱、微信号、确认已加入开发者群、确认理解 Alpha 阶段风险并有能力自行处理错误。官方每月 15 日和 30 日回复审核结果，每月发放 30 个 Token，优质开源项目可能提前获得。","https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1846",{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},18054,"如何使用 Docker 快速启动 Wechaty？","可以通过 Docker 镜像轻松运行 Wechaty。首先定义别名：alias wechaty='docker run -t -i --rm -e WECHATY_LOG=\"$WECHATY_LOG\" --volume=\"$(pwd)\":\u002Fbot --name=wechaty zixia\u002Fwechaty'。然后将您的机器人代码（如 mybot.ts）放在当前目录，执行 'wechaty mybot.ts' 即可运行。其中 -v 参数将当前目录挂载到容器内的 \u002Fbot 目录，-e 传递日志环境变量，--rm 表示容器退出后自动删除。","https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F66",{"id":141,"question_zh":142,"answer_zh":143,"source_url":139},18055,"在 Docker 中运行 Wechaty 时报错 'can not found bot file' 怎么办？","该错误通常与 SELinux 安全策略有关。当使用 Docker 挂载卷时，SELinux 可能阻止容器访问宿主机文件。解决方案是在挂载卷时添加 :z 或 :Z 后缀（例如 --volume=\"$(pwd)\":\u002Fbot:z），让 Docker 自动设置正确的 SELinux 上下文。建议查阅相关 SELinux 文档或联系熟悉 SELinux 的开发者完善 FAQ 以获得更详细的排查步骤。",{"id":145,"question_zh":146,"answer_zh":147,"source_url":129},18056,"Wechaty 支持哪些类型的 Puppet 实现？","Wechaty 的新 Puppet 系统支持多种实现方式，包括：1. PuppetMock（用于模拟测试）；2. PuppetWechat4U（通过 HTTP 调用 Web API）；3. PuppetPuppeteer（通过浏览器自动化调用 Web API）；4. PuppetPadchat（基于 iPad 协议）；5. PuppetMacpro（基于 Mac 协议）。用户可根据需求选择不同的 Puppet 后端，并通过统一接口进行开发。",{"id":149,"question_zh":150,"answer_zh":151,"source_url":134},18057,"申请 Alpha 测试时需要提供哪些信息？","申请时必须按模板提供以下信息：1. 自我介绍（身份\u002F职业）；2. 要解决的具体问题场景；3. 机器人是否涉及赌博或成人内容（必须回答 NO）；4. 电子邮箱；5. 微信号；6. 确认已通过 README.md 二维码加入开发者微信群；7. 声明理解软件处于早期 Alpha 阶段，具备独立处理 Bug 的技术能力而非仅寻求支持。信息不完整可能导致申请被拒。",[153,158,163,168,173,178,183,188,193,198,203,208,213,218,223,228,233,238,243,248],{"id":154,"version":155,"summary_zh":156,"released_at":157},108491,"v0.56","[![Wechaty 0.56](https:\u002F\u002Fwechaty.js.org\u002Fassets\u002F2021\u002F01-wechaty-0.56-released\u002Fwechaty-flyer-2020.webp)](https:\u002F\u002Fwechaty.js.org\u002F2021\u002F01\u002F25\u002Fwechaty-0.56-released\u002F)\n\n> 发布公告博客： \u003Chttps:\u002F\u002Fwechaty.js.org\u002F2021\u002F01\u002F25\u002Fwechaty-0.56-released\u002F>\n\n## [v0.56](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Ftree\u002Fv0.56) (2021-01-25)\n\n[完整变更日志](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fcompare\u002Fv0.38...v0.56)\n\n**已实现的增强功能：**\n\n- 从 `wechaty-puppet-hostie` 切换到 `wechaty-puppet-service` [\\#2122](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2122)\n- 将 wechaty-puppet-padlocal 添加到我们的 puppet 配置中 [\\#2102](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2102)\n- 使用 `message.talker()` 替代 `message.from()` [\\#2094](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2094)\n- 创建一个 `looseInstanceOfClass` 来检查 `FileBox` 和 `Puppet` 实例 [\\#2090](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2090)\n- 房间加载过程中批量操作的问题 [\\#2068](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2068)\n- 支持联系人更多的属性 [\\#2036](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2036)\n- 多实例 Wechaty 设计重构：尝试移除 Accessory 类及相关代码 [\\#2027](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2027)\n- 在 Wechaty 中使用 Typed-Emitter [\\#2014](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2014)\n- 支持 WECHATY_HOSTIE_PORT 环境变量 [\\#1984](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1984)\n- Wechaty v0.23 PadPro 测试，增强的 pad puppet 实现！ [\\#1668](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1668)\n- 使用 wechaty 启动一个 wechatOA 账号 [\\#1016](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1016)\n\n**已修复的 bug：**\n\n- FileBox 实例类型检查问题 [\\#2035](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2035)\n- Wechaty.off() 不工作：无法移除监听器。[\\#2019](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2019)\n- friendship.contact() 只会加载 Contact，而需要的是 contact.ready()。[\\#1954](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1954)\n\n**已关闭的问题：**\n\n- 无法登录，也没有显示二维码就直接退出 [\\#2099](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2099)\n- 扫描二维码后无法登录 [\\#2092](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2092)\n- 网络不好时程序自动重启后推送异常 [\\#2088](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2088)\n- Message.forward() 不支持返回消息 [\\#2073](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2073)\n- bot.Friendship.add() 总是报错 [\\#2060](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2060)\n- 使用 FileBox 发送视频时出现问题 [\\#2059](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2059)\n- 您提供的 AWS 访问密钥 ID 在我们的记录中不存在。[\\#2058](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2058)\n- 设置 hostie token gateway 时，账户在一秒内调用 5 次 getContactInfo 后被锁定。[\\#2040](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F2040)\n- 支持与电话相关的操作 [\\#2037](https:\u002F\u002Fgithub.com\u002Fwechat","2021-01-25T08:29:30",{"id":159,"version":160,"summary_zh":161,"released_at":162},108492,"v0.38","## [v0.38](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Ftree\u002Fv0.38) (2020-04-08)\n\n[完整变更日志](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fcompare\u002Fv0.30...v0.38)\n\n**已实现的增强功能：**\n\n- 重大变更：移除 `MessageUserQueryFilter` [\\#1929](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1929)\n- 简化 Accessory 类逻辑 [\\#1924](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1924)\n- 将 Docker 基础镜像从 Ubuntu:18 更新至 Ubuntu:19 [\\#1920](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1920)\n- 深度清理 wechaty 依赖模块 [\\#1917](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1917)\n- FileBox 版本在 wechaty、wechaty-puppet 和 wechaty-puppet-x 之间不兼容 [\\#1914](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1914)\n- 将 Wechaty 文档站点发布至 https:\u002F\u002Fwechaty.js.org [\\#1912](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1912)\n- 支持从 file-box@0.10 中编码和解码二维码功能 [\\#1907](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1907)\n- 设计一个新的 `Image` 类，用于接收不同尺寸的图片。[\\#1871](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1871)\n- 利用 Wechaty 的能力将微信与 Matrix 集成 [\\#1737](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1737)\n\n**已修复的 bug：**\n\n- 无法创建 Image 类。[\\#1922](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1922)\n\n**已关闭的问题：**\n\n- 微信退出登录后，无法重新登录 iPad [\\#1839](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1839)\n- 基于 padpro 协议无法发送微信小程序 [\\#1837](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1837)\n\n**已合并的拉取请求：**\n\n- 0.38.0 [\\#1936](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fpull\u002F1936) ([su-chang](https:\u002F\u002Fgithub.com\u002Fsu-chang))\n- 移除 MessageUserQueryFilter [\\#1931](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fpull\u002F1931) ([huan](https:\u002F\u002Fgithub.com\u002Fhuan))\n- \\[Snyk\\] 将 state-switch 从 0.6.18 升级到 0.7.2 [\\#1928](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fpull\u002F1928) ([snyk-bot](https:\u002F\u002Fgithub.com\u002Fsnyk-bot))\n- \\[Snyk\\] 将 brolog 从 0.3.11 升级到 0.4.3 [\\#1925](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fpull\u002F1925) ([snyk-bot](https:\u002F\u002Fgithub.com\u002Fsnyk-bot))\n- 图片相关 bug [\\#1921](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fpull\u002F1921) ([su-chang](https:\u002F\u002Fgithub.com\u002Fsu-chang))\n- 文件盒子相关 [\\#1915](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fpull\u002F1915) ([su-chang](https:\u002F\u002Fgithub.com\u002Fsu-chang))\n- 支持 message.toImage() 方法。[\\#1913](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fpull\u002F1913) ([su-chang](https:\u002F\u002Fgithub.com\u002Fsu-chang))\n- 支持延迟接受群聊邀请 [\\#1910](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fpull\u002F1910) ([su-chang](https:\u002F\u002Fgithub.com\u002Fsu-chang))","2020-04-20T05:52:55",{"id":164,"version":165,"summary_zh":166,"released_at":167},108493,"v0.30","## [v0.30](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Ftree\u002Fv0.30) (2020-02-08)\n\n[完整变更日志](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fcompare\u002Fv0.28...v0.30)\n\n**已实现的增强功能：**\n\n- 支持 `room.say` `hi ${contact} ${num++}` [\\#1899](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1899)\n- 在 Room 上支持名为 \"message\" 的新事件 [\\#1897](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1897)\n- 支持通过手机号或用户名搜索新好友。[\\#1892](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1892)\n- `{Room,Contact}.qrcode()` 应返回二维码值而不是图片 [\\#1889](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1889)\n- 实现了支持 Open Graph 的 `UrlLink.create(url)` [\\#1887](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1887)\n- 主动撤回消息 [\\#1885](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1885)\n- 在 Wechaty 中实现标签功能 [\\#1856](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1856)\n- 希望在房间\u002F好友事件中添加时间戳 [\\#1829](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1829)\n- 希望在 RoomInvitation 上提供接收、序列化和反序列化函数 [\\#1823](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1823)\n- Wechaty v0.26 iosBird 测试，一种 iOS 钩子傀儡实现！[\\#1775](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1775)\n- 缺少示例代码 [\\#1756](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1756)\n- 破坏性变更 v0.25：`Room.say(text: string, mention: Contact[])` 已弃用 [\\#1730](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1730)\n- 新傀儡：Ioscat（iPhone 微信 App 钩子）[\\#1528](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1528)\n\n**已修复的 bug：**\n\n- `bot.logonoff()` 报错【未找到 Wechaty 的静态傀儡】[\\#1878](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1878)\n- JSDoc 发布问题：遗漏了 Room 类 [\\#1872](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1872)\n- 当机器人被移出某个房间时，Wechaty 无法获取该房间的信息。[\\#1834](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1834)\n- `bot.Contact.find()` 错误信息具有误导性 [\\#1812](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1812)\n- 机器人会隔一段时间自动退出 [\\#1810](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1810)\n\n**已关闭的问题：**\n\n- 使用 Docker 运行时，二维码地址提示“无法识别的二维码”[\\#1905](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1905)\n- 在 `room.announce()` 中，当参数为空字符串时，调用的是获取群公告而非将群公告设置为空 [\\#1902](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1902)\n- 启动官方学习项目时报错 [\\#1898](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1898)\n- 延期通过好友请求 [\\#1890](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1890)\n- 我希望使用 wechaty puppet padpro token 来创建一个微信机器人 [\\#1882](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1882)\n- `msg.mentionSelf()` 方法不正确，始终返回 false [\\#1877](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1877)\n- 需要获取 Contactid 或微信号 [\\#1873](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1873)\n- 应实现 `message.toContact()` 函数。[\\#1855](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F1855)\n- 安装 ","2020-02-09T00:43:36",{"id":169,"version":170,"summary_zh":171,"released_at":172},108494,"v0.28","1. 由 @su-chang 修复了 [wechaty-puppet-puppeteer](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty-puppet-puppeteer) 的图片和文件发送功能 [wechaty-puppet-puppeteer#106](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty-puppet-puppeteer\u002Fpull\u002F106)\n1. 由 @limingth、@zhaoic 和 @lhr0909 添加了小程序发送功能 [#1806](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1806)\n1. 由 @windmemory 为 [wechaty-puppet-padpro](https:\u002F\u002Fgithub.com\u002Fbotorange\u002Fwechaty-puppet-padpro) 添加了群公告支持 [\\#1816](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1816)\n1. 由 @huan 开始在 Wechaty 中使用 [Chatie DevOps 工具集](https:\u002F\u002Fblog.chatie.io\u002Fchatie-devops-toolset\u002F)\n1. 添加了通过 ID 查找群的 RoomQueryFilter [\\#1785](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1785)\n1. 最新 Docker 镜像中缺少 Puppets [\\#1820](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1820)\n\n## [v0.28](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Ftree\u002Fv0.28) (2019-09-02)\n[完整变更日志](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Fcompare\u002Fv0.26.0...v0.28)\n\n**已实现的增强功能：**\n\n- 某些 Puppets 实现中群公告无法正常工作 [\\#1816](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1816)\n- \\[功能\\] 发送小程序 [\\#1806](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1806)\n- 将仓库升级至使用 Chatie DevOps 工具集 [\\#1793](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1793)\n- 简化 wechaty-puppet-puppeteer 的安装 [\\#1792](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1792)\n- 添加了通过 ID 查找群的 RoomQueryFilter [\\#1785](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1785)\n- 在发布到 NPM 前生成 version.ts 文件 [\\#1780](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1780)\n- 使用 `@chatie\u002Ftsconfig` 作为 tsconfig.json 的基础配置 [\\#1777](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1777)\n- 能否升级 wechaty-puppet-puppeteer 的依赖 [\\#1758](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1758)\n- room.ts 文件中缺少注释示例代码 [\\#1751](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1751)\n\n**已修复的 bug：**\n\n- 最新 Docker 镜像中缺少 Puppets [\\#1820](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1820)\n- 使用 puppeteer 时无法调用 `Contact.say(imageAsFileBox)` [\\#1795](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1795)\n- README 中的文档错误 [\\#1690](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1690)\n- 修复注释，替换 \\#1784 [\\#1814](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F1814)（由 xinbenlv 提供）\n\n**已关闭的问题：**\n\n- 登录不了，有办法解决吗？ [\\#1842](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1842)\n- 登录不了一个错误报告 [\\#1841](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1841)\n- 想获取微信消息列表，Message.findAll() 返回为空？ [\\#1825](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1825)\n- 用了一个月itchat相安无事，用了2小时wechaty... [\\#1815](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1815)\n- 如果 token 无效，Wechaty 将执行 process.exit(1) [\\#1811](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1811)\n- TSError: ⨯ 无法编译 TypeScript：[\\#1791](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1791)\n- padp","2019-09-02T06:14:24",{"id":174,"version":175,"summary_zh":176,"released_at":177},108495,"v0.26.0","好消息：经过过去几个月的努力，我们带来了新的改进！\n\n建议所有用户升级到最新的 v0.26 版本，以获得最新功能和稳定的修复。\n\nCheers！\n\nHuan\n\n**已实现的增强功能：**\n\n- 撤回消息设计 [\\#1728](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1728)\n- Message.toString 格式讨论 [\\#1676](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1676)\n- 升级 wechaty-puppet-padchat 稳定版本 [\\#1642](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1642)\n- 新的 Puppets - wechaty-puppet-padpro [\\#1629](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1629)\n- 房间提及联系人应使用 roomAlias [\\#1604](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1604)\n- 对于 Pull Request：禁用需要 token 的 Puppet 单元测试 [\\#1580](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1580)\n- 更新个人姓名或签名时刷新联系人自我信息 [\\#1576](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1576)\n- 将提及列表传递给 Puppet [\\#1560](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1560)\n- Wechaty Puppet Ioscat 测试：iPhone（iOS）Wechat Hooking 支持即将到来！[\\#1530](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1530)\n\n**已修复的 bug：**\n\n- Room.owner() 函数会打印 info 级别的日志 [\\#1769](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1769)\n- 由于 promisify 缺少 arg3 导致构建失败 [\\#1761](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1761)\n- 注释：示例代码错误 [\\#1746](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1746)\n- 文档网站宕机 [\\#1739](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1739)\n- 构建 Docker 镜像报错 [\\#1593](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1593)\n- 在 v0.21.27 之后，memberAll() 在 Docker 中无法运行 [\\#1573](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1573)\n- ERR PuppetPuppeteer roomRawPayload [\\#1547](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1547)\n\n**已关闭的问题：**\n\n- 无效的 processingToken：导致账号注销.. [\\#1766](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1766)\n- 需要采取行动：Greenkeeper 无法激活 🚨 [\\#1764](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1764)\n- 需要采取行动：Greenkeeper 无法激活 🚨 [\\#1763](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1763)\n- [已解决] 无法自动通过好友请求 [\\#1755](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1755)\n- contact.ts 文件中缺少注释示例代码 [\\#1748](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1748)\n- 是否有办法直接向联系人发送消息，而不是使用 say() 进行回复？[\\#1734](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1734)\n- await message.mentionSelf() 无效 [\\#1725](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1725)\n- message.mentionSelf() [\\#1724](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1724)\n- wechaty-puppet-padpro 获取的语音消息文件是 slk 格式 [\\#1720](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1720)\n- 是否有针对企业微信 App 的登录和收发消息的方案呢？[\\#1717](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1717)\n- 关于 win7 安装 npm install wechaty-puppet-padpro 的问题 [\\#1716](https:\u002F\u002Fgithub.com\u002FCh","2019-05-11T11:35:05",{"id":179,"version":180,"summary_zh":181,"released_at":182},108496,"v0.22.4","请参阅：https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1572","2018-08-29T18:42:41",{"id":184,"version":185,"summary_zh":186,"released_at":187},108497,"v0.20.0","# 更改日志\n\n## v0.20\n\n### 新特性\n\n1. 发送\u002F接收 URL 链接消息 [\\#1539](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1539)\n2. `Message.find()` 用于搜索消息 [\\#1534](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1534)\n3. 添加了 `room-invite` 事件，机器人可以 `accept()` 房间邀请 [\\#1492](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1492)\n4. `ContactSelf.qrcode()` 机器人可以获取自己的二维码 [\\#1301](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1301)\n\n### 破坏性变更\n\n1. `Contact.alias` 由同步改为异步 [\\#1500](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1500)\n\n# 完整更改日志\n\n## [v0.20.0](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Ftree\u002Fv0.20.0) (2018-08-18)\n[完整更改日志](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Fcompare\u002Fv0.18.0...v0.20.0)\n\n**已实现的增强功能：**\n\n- \\[RFC\\] 建议在执行 ContactSelf 相关操作时提供更详细的错误信息 [\\#1549](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1549)\n- 功能：添加接收和发送链接 [\\#1539](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1539)\n- 功能：添加 `Message.find` 以在缓存中搜索。[\\#1534](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1534)\n- 移除 `npm install` 时需要编译的依赖项 [\\#1529](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1529)\n- Puppet Padchat 不支持消息中的附件文件类型。[\\#1524](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1524)\n- 破坏性变更：v0.20 中 `Contact.alias` 由同步改为异步 [\\#1500](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1500)\n- 构建 Docker 镜像时预装所有官方支持的 Puppets [\\#1493](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1493)\n- 【提案】新增 'room-invite' 事件 [\\#1492](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1492)\n- 消息类型：为 Message.type() 添加小程序类型 [\\#1444](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1444)\n- 将 PuppetPadchat 提升为独立的 NPM 模块 wechaty-puppet-padchat [\\#1372](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1372)\n- PuppetPadchat：支持带有 `op id` 的 `StatusNotify` 消息类型，用于推送更新信息 [\\#1310](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1310)\n- 使用 `extends` 标准简化 tslint.json 文件。[\\#1303](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1303)\n- 功能：PuppetPadchat 支持获取用户自身的二维码（可供他人扫描加好友）[\\#1301](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1301)\n- 新 Puppets：PuppetPadchat [\\#1249](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1249)\n- 功能：添加 `Wechaty.unref()` 支持，用于取消引用所有底层资源。[\\#1197](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1197)\n- 在生产环境中禁用 HotImport [\\#907](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F907)\n- 重构 PuppeteerMessage 类 [\\#724](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F724)\n- \\[新 Puppets\\] PuppetWechat4u - 通过 `WECHATY_PUPPET=wechat4u` 启用 [\\#69](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F69)\n\n**修复的 bug：**\n\n- TypeError: Cannot read property 'typ","2018-08-18T05:04:50",{"id":189,"version":190,"summary_zh":191,"released_at":192},108498,"v0.18.0","# WECHATY v0.18：精简体积\n\nWechaty v0.18 的唯一目标就是：精简体积！\n\n那么，为什么我们需要精简体积呢？\n\n让我们回到 2016 年 5 月，当时 Wechaty 的第一个版本发布，代码量仅有数千行。到了 2016 年底，我们的代码量增长到了约 1 万行。（你可以阅读我们当时的[博客](https:\u002F\u002Fblog.chatie.io\u002Fwelcome-to-wechaty\u002F)）\n\n随着 2017 年和 2018 年的推移，我们为 Wechaty 添加了更多功能，比如发送附件文件、支持除网页版之外的其他微信协议（如 iPad 版本），这意味着我们在 Wechaty 仓库中编写的代码越来越多……最终，我们的代码量接近 3 万行，确切地说是 27,630 行。（其中包含 377 个单元测试，如果你感兴趣，可以在这里查看：[https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fblob\u002F01bfdf96c8023f44fa2ad2762f8f12fee875e42e\u002Ftests\u002FREADME.md](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fblob\u002F01bfdf96c8023f44fa2ad2762f8f12fee875e42e\u002Ftests\u002FREADME.md)）\n\n这算不算臃肿呢？3 万行代码确实不算太多，但也绝非一个小数目。在完成 v0.16 版本中 Puppet 基类的抽象之后，我们似乎有了充分的理由开始精简体积：\n\n1. Puppet 基类需要被每个 Puppet 实现引入，因此它应该作为一个独立的 npm 模块存在，并具备良好的版本管理。\n2. 每个 Puppet 实现类最好也单独拆分为一个 npm 模块，这样我们就可以只安装所需的源代码。\n\n因此，在这个版本（v0.18）中，我们从 Wechaty 中拆分出了以下 npm 模块：\n\n## WECHATY PUPPET 列表\n\n### 1. 针对 Puppet 用户\n\n| 阶段   | 名称      | Wechaty Puppet | 后端       | 版本     |\n| :---    | :---      | :---           | :---       | :---     |\n| 发布版  | puppeteer | [PuppetPuppeteer](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty-puppet-puppeteer) | 通过浏览器钩子的 Web API | ![PuppetPuppeteer](https:\u002F\u002Fbadge.fury.io\u002Fjs\u002Fwechaty-puppet-puppeteer.svg) |\n| 测试版  | padchat   | [PuppetPadchat](https:\u002F\u002Fgithub.com\u002Flijiarui\u002Fwechaty-puppet-padchat) | iPad 协议 | ![PuppetPadchat](https:\u002F\u002Fbadge.fury.io\u002Fjs\u002Fwechaty-puppet-padchat.svg) |\n| 开发版  | wechat4u  | [PuppetWechat4u](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty-puppet-wechat4u) | 通过 HTTP 的 Web API | ![PuppetWechat4u](https:\u002F\u002Fbadge.fury.io\u002Fjs\u002Fwechaty-puppet-wechat4u.svg) |\n| 开发版  | ioscat    | [PuppetIoscat](https:\u002F\u002Fgithub.com\u002Flinyimin-bupt\u002Fwechaty-puppet-ioscat) （开发中） | iPhone 应用程序钩子 | ![PuppetIoscat](https:\u002F\u002Fbadge.fury.io\u002Fjs\u002Fwechaty-puppet-ioscat.svg) |\n| 待定 | Android | | Android 钩子 | 0.0.0 |\n| 待定 | Win32   | | Win32 钩子   | 0.0.0 |\n\n### 2. 针对 Puppet 构建者\n\n| 阶段   | 名称      | Wechaty Puppet | 后端       | 版本     |\n| :---    | :---      | :---           | :---       | :---     |\n| 发布版  | N\u002FA       | [Puppet](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty-puppet) | 抽象基类 | ![Puppet](https:\u002F\u002Fbadge.fury.io\u002Fjs\u002Fwechaty-puppet.svg) |\n| 发布版  | mock      | [PuppetMock](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty-puppet-mock) | 模拟实现 | ![PuppetMock](https:\u002F\u002Fbadge.fury.io\u002Fjs\u002Fwechaty-puppet-mock.svg) |\n\n如果 w","2018-07-12T12:24:21",{"id":194,"version":195,"summary_zh":196,"released_at":197},108499,"v0.16.0","本次发布为 BETA 版本，自 v0.14 以来经过了大量的重大重构改进。\n\n在 v0.16 中，我们引入了全新的 Puppet 系统，可以将 Wechaty API 连接到各种类型的 Puppet，例如：\n\n1. 模拟 Puppet - [PuppetMock](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Ftree\u002Fed72a78b61ccc352d9bd9f5a06054a218cdd1d0d\u002Fsrc\u002Fpuppet-mock)\n2. 通过 HTTP 提供的 Web API - [PuppetWechat4U](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Ftree\u002Fed72a78b61ccc352d9bd9f5a06054a218cdd1d0d\u002Fsrc\u002Fpuppet-wechat4u)\n3. 通过浏览器提供的 Web API - [PuppetPuppeteer](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Ftree\u002Fed72a78b61ccc352d9bd9f5a06054a218cdd1d0d\u002Fsrc\u002Fpuppet-puppeteer)（即我们经典的 PuppetWeb）\n4. 或许还会有公众号 Puppet？[#1016](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1016)\n\n如果您正在生产环境中使用 Wechaty，建议跳过此版本，等待下一个 0.18 版本发布。因为当前版本仍处于**测试阶段**，后续将继续开发为 v0.19。\n\n不过，如果您想尝试新的 Puppet，比如基于微信 Pad 协议的 [PuppetPadchat](https:\u002F\u002Fgithub.com\u002Flijiarui\u002Fwechaty-puppet-padchat)，那么升级到此版本将为您带来以下优势：\n\n1. 可以使用新注册的微信账号登录。（[#872](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F872)）\n2. 获得联系人的微信号。（[#133](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F133)）\n3. 在不同登录会话中获得一致的群聊 ID。（[#90](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F90)）\n4. … 还有更多等待您去发现 …\n\n有关如何使用 PuppetPadchat 的更多信息，请参阅 [Wechaty v0.15 Alpha 测试：Win32\u002FiPad\u002FAndroid\u002FiOS\u002FAPI Puppet 支持即将到来！#1296](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1296)。\n\n### 博客\n\nhttps:\u002F\u002Fblog.chatie.io\u002Fwechaty-new-release-version-0.16\u002F\n\n## 更改日志\n\n> 最新消息：Wechaty 的 logo 颜色已由绿色改为蓝色！\n\n稍后我们将在博客上发布一份 **从 v0.14 迁移到 v0.16 的迁移指南**。\n\n### 1. 重大变更\n\n#### 1.1 类的移除\n\n- 重大变更：v0.16 将移除 `MediaMessage` 类 [\\#1164](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1164)\n- v0.16 的重大变更：`FriendRequest` 类将被 `Friendship` 替代 [\\#1312](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1312)\n- v0.16 的重大变更：`Contact`、`FriendRequest`、`Message` 和 `Room` 类将无法直接实例化 [\\#1364](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1364)\n\n#### 1.2. 同步转异步\n\n- 重大变更：v0.16 中 `Room.topic()` 由同步改为异步调用 [\\#1295](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1295)\n- 重大变更：v0.16 中 `Room.alias(contact)` 由同步改为异步调用 [\\#1293](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1293)\n- 重大变更：v0.16 中 `Room.memberList()` 由同步改为异步调用 [\\#1290](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1290)\n- 重大变更：v0.16 中 `Room.has(contact)` 由同步改为异步调用 [\\#1289](https:\u002F\u002Fgith","2018-06-21T09:50:08",{"id":199,"version":200,"summary_zh":201,"released_at":202},108500,"v0.14.0","# Wechaty v0.14 \n\n**已实现的增强功能：**\n\n- 将 {test,fixture,example,...} 重命名为 {tests,fixtures,examples,...} 等。[\\#1127](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1127)\n- 在分支 \u002Fv\\d+\\.\\d+\\$\u002F 上触发部署 [\\#956](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F956)\n- Wechaty 版本号命名规则 [\\#905](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F905)\n- [新增 Puppet] Puppeteer [\\#790](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F790)\n- [增强] 在 Dockerfile 中添加时区设置 [\\#594](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F594)\n- [docker] 防止 Docker 用户在本地安装 Wechaty 的依赖 [\\#281](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F281)\n\n**已修复的 Bug：**\n\n- 在容器内运行 CI 时：openBinaryFile: 不存在（没有这样的文件或目录）[\\#1137](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1137)\n- 尝试使用 ~~Wercker~~ Shippable CI 替代 Circle CI [\\#1134](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1134)\n- 升级到 v1.1 后 Puppeteer 不再工作 [\\#1103](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1103)\n- 关于 MsgType 的介绍文档出现 404 错误 [\\#1079](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1079)\n- Docker 测试失败，原因是 ts-node 在 v3 和 v4 之间的行为发生了变化 [\\#1050](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1050)\n- 修复描述 [\\#1027](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1027)\n- ERR Profile save() 异常：错误：EACCES：权限被拒绝，无法打开 '\u002Fbot\u002Fdemo.wechaty.json' [\\#982](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F982)\n- Dockerfile.onbuild 构建失败，目录权限错误 [\\#961](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F961)\n- [docker] 当我们在 package.json 中将 `wechaty` 设为依赖时，onbuild 构建无法启动 [\\#500](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F500)\n\n**已关闭的问题：**\n\n- 如何发送文件 [\\#1150](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1150)\n- 下载 Chromium r543305 失败 [\\#1145](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1145)\n- 信号处理（例如 ^C）[\\#1122](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1122)\n- 是否可以添加 .eslintrc.js 文件？[\\#1120](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1120)\n- 问题：所有媒体类型 [\\#1115](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1115)\n- 登录时出现 `TTL expired` 错误 [\\#1114](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1114)\n- 在最新版 Docker 中仍然存在 `Cannot read property 'MemberList' of undefined` 错误 [\\#1111](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1111)\n- 表情符号建议 [\\#1108](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1108)\n- 通过运行 `npm run doc` 重新生成 docs\u002Findex.md [\\#1105](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1105)\n- hot-reload-bot 添加热加载配置 [\\#1100](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1100)\n- 运行 Wechaty 的第三种方案 [\\#1085](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1085)\n- 问题 [\\#1076](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1076)\n- Azure 中会话仅持续 1 小时 [\\#1059](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F1059)\n- 出现 no","2018-04-15T11:10:38",{"id":204,"version":205,"summary_zh":206,"released_at":207},108501,"v0.12.0","Wechaty is starting to use the MINOR version number to indicate whether the release is STABLE or NOT since v0.12.\r\n\r\nNumbering rule:\r\n1. even numbers, such as 0.8, 0.12 indicated a stable release, which is fit for production use.\r\n2. odd numbers, such as 0.11 or 0.13, represented as development releases.\r\n\r\nSee: https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F905\r\n\r\n# Change Log\r\n\r\n## [v0.12.0](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Ftree\u002Fv0.12.0) (2017-10-30)\r\n[Full Changelog](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Fcompare\u002Fv0.9.0...v0.12.0)\r\n\r\n**Implemented enhancements:**\r\n\r\n- Promote `rx-queue` to SOLO NPM Module [\\#938](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F938)\r\n- Add Wechaty.logonoff\\(\\) method [\\#926](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F926)\r\n- Registe Wechaty Listeners with a try {} catch {} block in order to prevent listener function crash the framework. [\\#878](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F878)\r\n- Upgrade CircleCI from 1.0 to 2.0 [\\#863](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F863)\r\n- Switch Docker Node Image from `alphin` to official `node:7` [\\#862](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F862)\r\n- Click Web Wechat `Switch Account` Automatically to get qrcode immediately when bot logout [\\#636](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F636)\r\n- Upgrade docker image from Node.js v7 to v8 [\\#577](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F577)\r\n- \\[todo\\] switch unit test tool from AVA to TAPE [\\#513](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F513)\r\n- \\[ci\\] Provide a Mock PuppetWeb Instance for Integration Test [\\#237](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F237)\r\n\r\n**Fixed bugs:**\r\n\r\n- \\[CI\\] Homebrew must be run under Ruby 2.3! You're running 2.0.0. \\(RuntimeError\\) [\\#936](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F936)\r\n- \"PromiseRejectionHandledWarning: Promise rejection was handled asynchronously\" when Wechat says \"当前登录环境异常\" [\\#925](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F925)\r\n- TypeError: cookieList.filter is not a function [\\#919](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F919)\r\n- TypeError: Cannot read property 'error' of null [\\#918](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F918)\r\n- ERR PuppetWebBridge init\\(\\) initPage\\(\\) onLoad\\(\\) exception: undefined [\\#917](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F917)\r\n- Sometimes Wechaty can't login \\(with puppeteer\\) [\\#899](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F899)\r\n- \\[ci\\] WebDriver Error: \"no such session\" [\\#756](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F756)\r\n- Click Web Wechat `Switch Account` Automatically to get qrcode immediately when bot logout [\\#636](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F636)\r\n- \\[ci\\] execute proxyWechaty\\(init\\) error: 503, init\\(\\) without a ready angular env [\\#329](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F329)\r\n- \\[ci log\\] watchdog reset after 120 seconds [\\#195](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F195)\r\n- Selenium WebDriver driver.getSession\\(\\) wait a long time [\\#86](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F86)\r\n\r\n**Closed issues:**\r\n\r\n- 在登录失败时的异常提示优化 [\\#898](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F898)\r\n- CANT RUN THE WECHATY-GETTING-STARTED, PUPPETWEBROWSER valid\\(\\) getSession\\(\\) [\\#891](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F891)\r\n- Error after restart  vps              invalid driver at ttl 0 [\\#788](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F788)\r\n- webdriver.executeScript wait a long time\\(26s\\) before page load [\\#2](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F2)\r\n\r\n**Merged pull requests:**\r\n\r\n- Replace WebDriver by Puppeteer \\(\\#790\\) [\\#860](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F860) ([zixia](https:\u002F\u002Fgithub.com\u002Fzixia))\r\n- chore\\(package\\): update coveralls to version 3.0.0 [\\#854](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F854) ([zixia](https:\u002F\u002Fgithub.com\u002Fzixia))\r\n","2017-10-30T16:05:46",{"id":209,"version":210,"summary_zh":211,"released_at":212},108502,"v0.9.0","# Change Log\r\n\r\n## [v0.9.0](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Ftree\u002Fv0.9.0) (2017-10-04)\r\n[Full Changelog](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Fcompare\u002Fv0.8.2...v0.9.0)\r\n\r\nBREAKING CHANGES\r\n----------------\r\n- \\[Announcement\\] Drop support for phantomjs [\\#763](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F763)\r\n\r\nNEW FEATURES\r\n------------\r\n- Support hot-reload for Wechaty events listeners [\\#820](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F820)\r\n- Add Transpond Message [\\#726](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F726)\r\n- \\[Feature request\\] @mention support? [\\#153](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F153)\r\n- Support Message Type of Image\u002FVideo  [\\#4](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F4)\r\n- \\[new feature\\] add function message.mention\\(\\) [\\#216](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F216)\r\n- \\[feature request\\] fire `room-join` when someone joins from a QR Code [\\#155](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F155)\r\n- \\#4 send image\u002Fvideo [\\#337](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F337) ([mukaiu](https:\u002F\u002Fgithub.com\u002Fmukaiu))\r\n- \\#3 support send gif [\\#438](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F438) ([mukaiu](https:\u002F\u002Fgithub.com\u002Fmukaiu))\r\n- add room.say\\(MediaMessage\\) [\\#420](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F420) ([mukaiu](https:\u002F\u002Fgithub.com\u002Fmukaiu))\r\n- add room-leave event [\\#370](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F370) ([lijiarui](https:\u002F\u002Fgithub.com\u002Flijiarui))\r\n- Add mention [\\#362](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F362) ([lijiarui](https:\u002F\u002Fgithub.com\u002Flijiarui))\r\n- added hot load bots [\\#310](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F310) ([Gcaufy](https:\u002F\u002Fgithub.com\u002FGcaufy))\r\n\r\nBUG FIXES\r\n---------\r\n- \\[bug\\] Support for send 25Mb+ size files [\\#766](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F766)\r\n- Cannot send pdf file using MediaMessage [\\#710](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F710)\r\n- \\[enhancement\\] Add pdf, docx etc support to MediaMessage\\(now only picture is supported\\) [\\#538](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F538)\r\n- Send\\(upload\\) an image twice will cause error. [\\#422](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F422)\r\n- Cannot send image after restart [\\#777](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F777)\r\n- Room.alias\\(\\) should return null if we have not set the alias in the room  [\\#283](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F283)\r\n- Fix chrome driver path problem in Windows [\\#416](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F416) ([xjchengo](https:\u002F\u002Fgithub.com\u002Fxjchengo))\r\n- fix upload media url error [\\#415](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F415) ([mukaiu](https:\u002F\u002Fgithub.com\u002Fmukaiu))\r\n- Add missing %s content for leaver not found error [\\#388](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F388) ([xinbenlv](https:\u002F\u002Fgithub.com\u002Fxinbenlv))\r\n- fix jsdoc flush issue \\#378 and minor fix on the doc examples [\\#380](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F380) ([ax4](https:\u002F\u002Fgithub.com\u002Fax4))\r\n- fix\\_function\\_room.member\\_\\#173 [\\#211](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F211) ([lijiarui](https:\u002F\u002Fgithub.com\u002Flijiarui))\r\n- \\[bug\\]Cannot read property 'getUserName' of undefined [\\#772](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F772)\r\n- Cannot send pdf file using MediaMessage [\\#710](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F710)\r\n- Click Web Wechat `Switch Account` Automatically to get qrcode immediately when bot logout [\\#636](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F636)\r\n- Concat.avatar\\(\\)  faild ,when hostname changed from https:\u002F\u002Fwx.qq.com to https:\u002F\u002Fwx2.qq.com [\\#418](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F418)\r\n- it seems RECALLED: 10002 message dose't trigger on\\\\('message'\\\\) event [\\#8](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F8)\r\n\r\n\r\nENHANCEMENTS\r\n------------\r\n- \\[jsdoc\\] additional optimizations [\\#774](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F774)\r\n- chrome-headless support [\\#739](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F739)\r\n- Click Web Wechat `Switch Account` Automatically to get qrcode immediately when bot logout [\\#636](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F636)\r\n- use babel-node to run javascript\\(.js\\) file inside docker [\\#507](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F507)\r\n- \\[Docker\\] add a `onbuild` image to Wechaty [\\#147](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F147)\r\n- add `room-bot-leave` event [\\#250](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fissues\u002F250)\r\n- Limit video file size [\\#421](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F421) ([mukaiu](https:\u002F\u002Fgithub.com\u002Fmukaiu))\r\n- support brand checking of contact  [\\#404](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F404) ([JasLin](https:\u002F\u002Fgithub.com\u002FJasLin))\r\n- Limit the size of the sending file [\\#376](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F376) ([mukaiu](https:\u002F\u002Fgithub.com\u002Fmukaiu))\r\n- room.memberAll\\(\\) & change room.member\\(\\) query to 3 types [\\#364](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F364) ([lijiarui](https:\u002F\u002Fgithub.com\u002Flijiarui))\r\n- Printout entire error trace when unhandledRejection was caught [\\#361](https:\u002F\u002Fgithub.com\u002FChatie\u002Fwechaty\u002Fpull\u002F361) ([xinbenlv](https:\u002F\u002Fgithub.com\u002Fxinbenlv))\r\n- load all memberL","2017-10-04T07:08:30",{"id":214,"version":215,"summary_zh":216,"released_at":217},108503,"v0.7.0","v0.7.0 release lots of bugfixes after v0.6, which will make your bot more stable and powerful!\n\n### NPM\n\n#### Feature\n1. Add `Contact.avatar()` method to save avatar to file\n2. Support save attachment in message to file\n3. New example: a voice to text bot\n4. Support search by `remark` in `Contact.find()` \n\n#### Bugfix\n1. Restore session correctly with domain other than \"wx.qq.com\"\n2. Add @types dependencies for NPM module right\n3. Remove `chromedriver` & `phantomjs-prebuilt` from dependencies, user need to install them separately\n4. Fix `Contact.remark()` to work right with `Contact.refresh()`\n\n### Docker\n1. Fix bugs in `entrypoint.sh`\n2. Make all installed NPM modules global\n3. Make tsconfig.json global\n","2016-12-29T13:36:08",{"id":219,"version":220,"summary_zh":221,"released_at":222},108504,"v0.6.0","### Release Notes\n\nTo use the nightly build:\n\n``` shell\n$ docker pull zixia\u002Fwechaty:latest\n\n$ npm install wechaty@next\n```\n\n#### New Feature\n1. Add support to save attachment in EMOTICNO\u002FVOICE\u002FVIDEO\u002FMICROVIDEO message to file by MediaMessage [#4](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F4)\n2. Add `Contact.remark(newRemark: string)` support #34\n3. Use CI to publish `wechaty@next` NPM Module automatically. Now you can try nightly build by run `npm install wechaty@next`.\n\n#### Bug Fix\n1. Add more DNS server when startup Docker by @JasLin [#83](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F83)\n2. Fix use `obj.from` instead of `obj.id` by @kyle-yu [#68](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F68)\n3. Fix a Singleton bug in `Config.puppetInstance()` by @JasLin [#76](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F76)\n4. Fix an undefined variable warning in `Room.memberList()` by @JasLin [#78](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F78)\n5. Ignore all emoji in room member names by @lijiarui [#64](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F64)\n\n#### Enhancement\n1. Remove the WebDriverJS promise manager [#72](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F72)\n2. Remove all default exports in Wechaty Module [#40](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F40)\n3. Print more detail helps message for `docker run zixia\u002Fwechaty`\n4. Speed up startup time for `docker run zixia\u002Fwechaty`\n5. Use npm module `is-docker` to identify whether run inside a Docker Container\n6. Add BAT unit tests for Wechaty Docker, by running both JavaScript and TypeScript bot files, ensure it is workable in both language.\n7. Add more unit test for `docker run zixia\u002Fwechaty`\n8. Linting with TypeScript v2.1\n9. Lots of code & doc clean.\n","2016-11-11T12:31:31",{"id":224,"version":225,"summary_zh":226,"released_at":227},108505,"v0.5.22","### Release Notes\n\n#### New Feature\n1. Add support to save EMOTICNO\u002FVOICE\u002FVIDEO\u002FMICROVIDEO for MediaMessage [#4](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F4)\n\n#### Bug Fix\n1. Add more DNS server when startup Docker for [#83](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F83)\n\n#### Enhancement\n1. Print more detail helps message for `docker run zixia\u002Fwechaty`\n2. Speed up startup time for `docker run zixia\u002Fwechaty`\n3. Use npm module `is-docker` to identify whether run inside a Docker Container\n\n#### Misc\n1. Add more unit test for `docker run zixia\u002Fwechaty`\n2. Linting with TypeScript v2.1\n","2016-11-10T05:13:54",{"id":229,"version":230,"summary_zh":231,"released_at":232},108506,"v0.5.9","#### Docker Image\n\n``` shell\n$ docker pull zixia\u002Fwechaty:0.5.9\n```\n\n#### NPM\n\n``` shell\n$ npm install wechaty@0.5.9\n```\n\n### Release Notes\n\n#### New Feature\n1. Add `Contact.remark(newRemark: string)` support #34\n\n#### Enhancement\n1. Use CI to publish `wechaty@next` NPM Module automatically. Now you can try nightly build by run `npm install wechaty@next`.\n2. Add unit tests for Wechaty Docker, by running both JavaScript and TypeScript bot files, ensure it is workable in both language.\n\n#### Bug Fix\n1. Fix use `obj.from` instead of `obj.id` by @kyle-yu #68\n2. Fix a Singleton bug in `Config.puppetInstance()` by @JasLin #76 \n3. Fix an undefined variable warning in `Room.memberList()` by @JasLin #78\n4. Ignore all emoji in room member names by @lijiarui #64\n\n#### Misc\n1. Remove the WebDriverJS promise manager #72\n2. Remove all default exports in Wechaty Module #40\n3. Start to require Node.js v7, because Selenium WebDriver requires v6.9 (faint) ...\n4. Lots of code & doc clean.\n","2016-11-07T15:42:34",{"id":234,"version":235,"summary_zh":236,"released_at":237},108507,"v0.5.1","### Changelog\n1. Converted to Typescript [#40](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F40) \n2. Dockerize Wechaty for easy start [#66](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F66)\n3. BREAKING CHANGE: global event `scan` listener arguments changed from 1 to 2: now is `function(this: Sayable, url: string, code: number)` instead of `function({url, code})` before.  \n4. Sayablization: Make Wechaty\u002FContact\u002FRoom `Sayable`, and all `this` inside wechaty event listeners are `Sayable` too. [#41](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F41)\n5. add test with Node.js v7.0 in CI\n6. add `npm run doctor` to diagnose wechaty and output useful debug information\n\n### Known ISSUE\n1. `FriendRequest` class can not be instanced by hand [#70](https:\u002F\u002Fgithub.com\u002Fwechaty\u002Fwechaty\u002Fissues\u002F70)\n","2016-11-03T11:13:58",{"id":239,"version":240,"summary_zh":241,"released_at":242},108508,"v0.4.0","This version is the latest Javascript version of Wechaty.\n\n## Room Operations\n1. Global events: `room-join`, `room-leave`, `room-topic`\n2. Room events: `join`, `leave`, `topic`\n3. Create a new Room: `Room.create()`\n4. Add\u002FDel\u002FTopic for Room\n5. Other methods like nick\u002Fmember\u002Fhas\u002Fetc...\n\n## Friend Request\n1. `Wechaty.on('friend', (contact, request) => {})` with Wechaty new Event `friend` \n2. `accept()` to accept a friend request\n3. `send()` to send new friend request\n\n## Cloud Manager\n1. Managed by Cloud Manager: https:\u002F\u002Fapp.wechaty.io\n2. Dockerized & Published to docker hub as: [zixia\u002Fwechaty](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fzixia\u002Fwechaty\u002F)\n","2016-10-10T04:29:50",{"id":244,"version":245,"summary_zh":246,"released_at":247},108509,"v0.2.0","1. add support to manage wechaty bot by cloud manager: https:\u002F\u002Fchatie.io  \r\n2. add support to download image message by MediaMessage.readyStream() [image bot example](https:\u002F\u002Fgithub.com\u002Fchatie\u002Fwechaty\u002Fblob\u002Fmaster\u002Fexample\u002Fimage-bot.js)\r\n3. fix lots of stable issues, and add watchdog\r\n","2016-06-29T07:24:15",{"id":249,"version":250,"summary_zh":251,"released_at":252},108510,"v0.1.1","1. add support to save & restore wechat login session\n2. add continious integration tests on Win32 platform. (powered by [AppVeyor](https:\u002F\u002Fwww.appveyor.com\u002F))\n3. add environment variables HEAD\u002FPORT\u002FSESSION\u002FDEBUG to config Wechaty\n","2016-06-09T20:28:27"]