Normally Palatable Mango

    TypeScript icon, indicating that this package has built-in type declarations

    1.20.2 • Public • Published

    Wechaty NPM Version NPM Docker


    Downloads GitHub stars Docker Pulls ES Modules

    TypeScript JavaScript Python Go Java .NET PHP Rust Scala

    WeChat Whatsapp

    Gitter Gitter room Telegram Wechaty Channel

    Connecting Chatbots

    Wechaty is a RPA (Robotic Process Automation) SDK for Chatbot Makers which can help you create a bot in 6 lines of JavaScript, Python, Go, and Java, with cross-platform support including Linux, Windows, MacOS, and Docker.


    Breaking News

    Voice of Developers

    "Wechaty is a great solution, I believe there would be much more users recognize it." link
    — @Gcaufy, Tencent Engineer, Author of WePY

    — @xinbenlv, Google Engineer, Founder of

    ”好用到哭“——你们对得起这个评价! link
    @bigbrother666sh, creator of《社长不见了》剧本杀 NPC DM

    "最好的微信开发库" link
    — @Jarvis, Baidu Engineer

    "Wechaty让运营人员更多的时间思考如何进行活动策划、留存用户,商业变现" link
    — @lijiarui, Founder & CEO of Juzi.BOT.

    "If you know js ... try Wechaty, it's easy to use."
    — @Urinx Uri Lee, Author of WeixinBot(Python)

    "Wechaty is a good project, I hope it can continue! Therefore, I became a contributors in open collective."

    See more at Wiki:Voice Of Developer

    Join Us


    Wechaty is used in many ChatBot projects by thousands of developers. If you want to talk with other developers, just scan the following QR Code in WeChat with secret code wechaty, join our Wechaty Developers' Home.

    Wechaty Friday.BOT QR Code

    Scan now, because other Wechaty developers want to talk with you too! (secret code: wechaty)

    You are also welcome to join our Gitter channel at with your GitHub account!


    Wechaty already held lots of talk and got a lot of blogs in the past 4 years, here is all of the wechaty resources:

    🚀 The World's Shortest ChatBot Code: 6 lines of JavaScript

    import { WechatyBuilder } from 'wechaty'
    const wechaty = // get a Wechaty instance
      .on('scan', (qrcode, status) => console.log(`Scan QR Code to login: ${status}\n${encodeURIComponent(qrcode)}`))
      .on('login',            user => console.log(`User ${user} logged in`))
      .on('message',       message => console.log(`Message: ${message}`))

    Notice: Wechaty requires Node.js version >= 16

    This bot can log all messages to the console after login by scan.

    You can find Wechaty Official Example at examples/ding-dong-bot.ts, and more from our Example Directory.

    🏁 Requirements

    1. Node.js version 16+
    2. NPM version 7+
    3. TypeScript version 4.4+

    Getting Started


    We have a Wechaty starter repository for beginners with the simplest setting. It will be just work out-of-the-box after you clone & npm install & npm start.

    If 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.

    Otherwise, 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.

    1. Npm

    NPM Version npm (tag)

    Downloads install size

    npm init
    npm install wechaty
    # create your first bot.js file, you can copy/paste from the above "The World's Shortest ChatBot Code: 6 lines of JavaScript"
    # then:
    node bot.js

    2. Docker

    Docker Pulls Docker Layers

    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.

    2.1. Run JavaScript

    # for JavaScript
    docker run -ti --rm --volume="$(pwd)":/bot wechaty/wechaty bot.js

    2.2. Run TypeScript

    # for TypeScript
    docker run -ti --rm --volume="$(pwd)":/bot wechaty/wechaty bot.ts

    Learn more about Wechaty Docker at Wiki:Docker.

    3. Switch Protocol(Puppet)

    Wechaty 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.

    If you cannot use Web protocol, you can apply other protocal following the instruction here: We provide free token to support developers build a valuable WeChat chatbot.

    Currently we support the following puppet providers :

    Protocol Puppet Provider Environment Variable
    Web PuppetPuppeteer export WECHATY_PUPPET=wechaty-puppet-puppeteer
    Windows PuppetWxwork export WECHATY_PUPPET=wechaty-puppet-service
    Mock PuppetMock export WECHATY_PUPPET=wechaty-puppet-mock
    Web PuppetWechat4u export WECHATY_PUPPET=wechaty-puppet-wechat4u
    iPad PuppetRock export WECHATY_PUPPET=wechaty-puppet-service
    iPad PuppetPadLocal export WECHATY_PUPPET=wechaty-puppet-service
    Windows PuppetDonut export WECHATY_PUPPET=wechaty-puppet-service
    iPad PuppetPadpro DEPRECATED export WECHATY_PUPPET=wechaty-puppet-padpro
    iPad PuppetPadchat DEPRECATED export WECHATY_PUPPET=wechaty-puppet-padchat
    iPad PuppetPadplus DEPRECATED export WECHATY_PUPPET=wechaty-puppet-padplus
    Mac PuppetMacpro DEPRECATED export WECHATY_PUPPET=wechaty-puppet-macpro

    Learn more about Wechaty Puppet from the Puppet Wiki:

    1. Puppet Directory:
    2. Puppet Compatibility:

    🎸 API

    Read the Full Documentation at Wechaty Official API Reference

    1 Class Wechaty

    Main bot class.

    A Bot is a Wechaty instance that control a specific wechaty-puppet.

    Wechaty API Description
    event login emit after bot login full successful
    event logout emit after the bot log out
    event friendship emit when someone sends bot a friend request
    event message emit when there's a new message
    event room-join emit when anyone join any room
    event room-topic emit when someone change room topic
    event room-leave emit when anyone leave the room
    event room-invite emit when there is a room invitation
    event scan emit when the bot needs to show you a QR Code for scanning
    method start(): Promise<void> start the bot
    method stop(): Promise<void> stop the bot
    method logonoff(): boolean bot login status
    method logout(): Promise<void> logout the bot
    method currentUser(): ContactSelf get the login-ed bot contact
    method say(text: string): Promise<void> let bot say text to itself

    2 Class Contact

    All wechat contacts(friends/non-friends) will be encapsulated as a Contact.

    Contact API Description
    static find(query: string): Promise<null | Contact> find contact by name or alias, if the result more than one, return the first one.
    static findAll(query: string): Promise<Contact[]> find contact by name or alias
    static load(query: string): Contact get contact by id
    property id: readonly string get contact id
    method sync(): Promise<void> force reload data for contact , sync data from lowlevel API again
    method say(text: string): Promise<void | Message> send text, Contact, or file to contact, return the message which the bot sent (only puppet-padplus supported).
    method self(): boolean check if contact is self
    method name(): string get the name from a contact
    method alias(): Promise<string> get the alias for a contact
    method alias(newAlias: string): Promise<void> set or delete the alias for a contact
    method friend(): boolean check if contact is friend
    method type(): ContactType return the type of the Contact
    method province(): string get the region 'province' from a contact
    method city(): string get the region 'city' from a contact
    method avatar(): Promise<FileBox> get avatar picture file stream
    method gender(): ContactGender get gender from a contact

    2.1 Class ContactSelf

    Class ContactSelf is extended from Contact.

    ContactSelf API Description
    method avatar(file: FileBox): Promise<void> set avatar for bot
    method qrcode(): Promise<string> get qrcode for bot
    method signature(text: string): Promise<void> set signature for bot

    2.2 Class Friendship

    Send, receive friend request, and friend confirmation events.

    Friendship API Description
    static add(contact: Contact, hello?: string): Promise<void> send a friend invitation to contact
    method accept(): Promise<void> accept Friend Request
    method hello(): string get the hello string from a friendship invitation
    method contact(): Contact get the contact from friendship
    method type(): FriendshipType return the Friendship Type(unknown, confirm, receive, verify)

    3 Class Message

    All wechat messages will be encapsulated as a Message.

    Message API Description
    static find(query: string): Promise<null | Message> find message in cache and return the first one
    static findAll(query: string): Promise<Message[]> find messages in cache, return a message list
    method from(): Contact get the sender from a message
    method to(): Contact get the destination of the message
    method room(): null | Room get the room from the message.(If the message is not in a room, then will return null)
    method text(): string get the text content of the message
    method say(text: string): Promise<void | Message> reply a Text, Media File , or contact message to the sender, return the message which the bot sent (only puppet-padplus supported).
    method type(): MessageType get the type from the message
    method self(): boolean check if a message is sent by self
    method mention(): Contact[] get message mentioned contactList.
    method mentionSelf(): boolean check if a message is mention self
    method forward(to: Contact): Promise<void> Forward the received message
    method age(): number the number of seconds since it has been created
    method date(): Date the time it was created
    method toFileBox(): Promise<FileBox> extract the Media File from the Message, and put it into the FileBox.
    method toContact(): Promise<Contact> get Share Card of the Message

    4 Class Room

    All wechat rooms(groups) will be encapsulated as a Room.

    Room API Description
    static create(contactList: Contact[], topic?: string): Promise<Room> create a new room
    static find(query: string): Promise<null | Room> Try to find a room by filter. If get many, return the first one.
    static findAll(query: string): Promise<Room[]> Find all contacts in a room
    static load(query: string): Room load room by room id
    property id: readonly string
    event join emit when anyone join any room
    event topic emit when someone change room topic
    event leave emit when anyone leave the room
    event invite emit when receive a room invitation
    method sync(): <Promise<void> force reload data for room, sync data from lowlevel API again.
    method say(text: string): Promise<void | Message> 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).
    method add(contact: Contact): Promise<void> Add contact in a room
    method del(contact: Contact): Promise<void> Delete a contact from the room
    method quit(): Promise<void> Bot quit the room itself
    method topic(): Promise<string> GET topic from the room
    method topic(newTopic: string): Promise<void> SET topic from the room
    method announce(text: string): Promise<void> SET/GET announce from the room
    method qrcode(): Promise<string> Get QR Code of the Room from the room, which can be used as scan and join the room.
    method alias(contact: Contact): Promise<string> Return contact's roomAlias in the room
    method roomAlias(contact: Contact): Promise<string | null> Same as function alias
    method has(contact: Contact): Promise<boolean> Check if the room has member contact
    method memberAll(query?: string): Promise<Contact[]> Find all contacts or with specific name in a room
    method member(query: string): Promise<null | Contact> Find all contacts in a room, if get many, return the first one.
    method memberList():Promise<Contact[]> get all room member from the room
    method owner(): null | Contact Get room's owner from the room.

    4.1 Class RoomInvitation

    Accept room invitation

    RoomInvitation API Description
    method accept(): Promise<void> accept Room Invitation
    method inviter(): Contact get the inviter from room invitation
    method roomTopic(): Promise<string> get the room topic from room invitation
    method date(): Promise<Date> the time it was created
    method age(): Promise<number> the number of seconds since it has been created


    NPM Docker Coverage Status

    Known Vulnerabilities

    Wechaty is fully automatically tested by unit and integration tests, with Continious Integration & Continious Deliver(CI/CD) support powered by CI like Travis, Shippable and Appveyor.

    To test Wechaty, run:

    npm test

    Get to know more about the tests from Wiki:Tests


    Creating 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.

    import { WechatyPlugin } from 'wechaty'
    export default const MyPlugin: WechatyPlugin = (wechaty: Wechaty) => {
      // ...

    The 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.


    1. Wechaty Plugin Support with KickOut Example #1939
    2. Wechaty Plugins Contrib


    🎷 Views Since Feb 15, 2019



    Powered by Wechaty

    Wechaty Badge

    [![Powered by Wechaty](](

    Get more embed html/markdown code from Wiki:Badge

    🌟 Projects Using Wechaty

    1. 一个用CNN深度神经网络给图片评分的wechaty项目
    2. Relay between Telegram and WeChat
    3. A chat bot managing the HaoShiYou wechat groups run by volunteers of
    4. An interactive chat bot to manage a TODO list
    5. Forward WeChat messages to telegram
    6. koa与wechaty实现的微信小助手,可定时提醒与发消息设定定时任务
    7. Wechaty Pay - 让线上没有难做的生意
    8. 开源社的微信机器人项目

    Pull Request is welcome to add yours!

    Learn more about Projects Using Wechaty at Wiki:Projects Using Wechaty

    😇 Find a Good Server

    The best practice for running Wechaty Docker/NPM 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.

    The 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.

    Location Price Ram Payment Provider
    Singapore $5 512MB Paypal DigitalOcean
    Japan $5 1GB Paypal Linode
    Korea $10 1GB Alipay, Paypal Netdedi
    Singapore $3.5 512MB Alipay, Wechat Vultr

    🎶 See Also

    💩 The Story

    In 2017 ...

    Huan's daily life/work depends on too much chat on wechat.

    • Almost 14,000 wechat friends in May 2014, before wechat restricts a total number of friends to 5,000.
    • Almost 400 wechat rooms, and most of them have more than 400 members.

    Can you imagine that? He was dying...

    So a tireless bot working for me 24x7 on wechat, monitoring/filtering 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). ;-)

    At last, It's built for huan's personal study purpose of Automatically Testing.

    Stargazers over time

    Stargazers over time

    💕 Contributors

    GitHub issues GitHub pull requests Open Collective Backers Open Collective Sponsors

    contributor contributor contributor contributor contributor contributor contributor contributor

    This project exists thanks to all the people who contribute. [Contribute].


    😎 Backers

    Backers on Open Collective

    Thank you to all our backers! 🙏 [Become a backer]

    Open Collective Wechaty

    😏 Sponsors

    Sponsors on Open Collective

    Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]

    Wechaty Sponsor

    Multi-language Wechaty

    Python Wechaty Go Wechaty Java(Kotlin) Wechaty Scala Wechaty PHP Wechaty .NET(C#) Wechatyin


    main v1.11 (Nov 22, 2021)

    Working on reduxify the Wechaty ecosystem for applying the CQRS pattern.

    v1.10 (Nov 21, 2021)

    Second beta release of Wechaty, with all ecosystem npm modules with version v1.10 (wechaty-puppet, wechaty-puppet-service, etc)

    v1.0 (Sep 2021)

    • Release v1.0 of Wechaty is the first beta release of Wechaty.


    1. v0.69: Supports ES Modules (with CJS dual support) (#2232)

    v0.68 (Aug 27, 2021)

    1. TLS support (#2231)
    2. The latest CommonJS version


    1. Huan (李卓桓), Tencent TVP of Chatbot
    2. Rui (李佳芮), Microsoft AI MVP, Founder & CEO of Juzi.BOT (YC W19 Alumni)

    Profile of Huan LI (李卓桓) on StackOverflow

    Cite Wechaty

    To cite this project in publications:

      author = {Huan LI, Jiarui LI},
      title = {Wechaty: Conversational SDK for Chatbot Makers},
      year = {2016},
      publisher = {GitHub},
      journal = {GitHub Repository},
      howpublished = {\url{}},

    Copyright & License

    • Code & Docs © 2016-now Huan, Rui, and Wechaty Community Contributors
    • Code released under the Apache-2.0 License
    • Docs released under Creative Commons
    Tip: Click on a version number to view a previous version's package page

    Current Tags

    Version History


    npm i wechaty

    DownloadsWeekly Downloads






    Unpacked Size

    2.52 MB

    Total Files


    Last publish


    • zixia
    • chatie