{"id":28445078,"url":"https://github.com/wechaty/plugin-contrib","last_synced_at":"2025-06-29T20:32:45.734Z","repository":{"id":46781998,"uuid":"260429208","full_name":"wechaty/plugin-contrib","owner":"wechaty","description":"Wechaty Plugin Ecosystem Contrib Package","archived":false,"fork":false,"pushed_at":"2024-01-17T14:31:56.000Z","size":306,"stargazers_count":34,"open_issues_count":11,"forks_count":11,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-06-06T10:11:35.510Z","etag":null,"topics":["contrib","plugin","wechaty"],"latest_commit_sha":null,"homepage":"https://paka.dev/npm/wechaty-plugin-contrib","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wechaty.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-05-01T10:09:32.000Z","updated_at":"2025-04-13T10:50:55.000Z","dependencies_parsed_at":"2024-01-23T21:15:48.358Z","dependency_job_id":"859b9935-43ee-4d16-9ef5-f78e8c126445","html_url":"https://github.com/wechaty/plugin-contrib","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wechaty/plugin-contrib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechaty%2Fplugin-contrib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechaty%2Fplugin-contrib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechaty%2Fplugin-contrib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechaty%2Fplugin-contrib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wechaty","download_url":"https://codeload.github.com/wechaty/plugin-contrib/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wechaty%2Fplugin-contrib/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262663257,"owners_count":23345029,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["contrib","plugin","wechaty"],"created_at":"2025-06-06T10:11:15.903Z","updated_at":"2025-06-29T20:32:45.722Z","avatar_url":"https://github.com/wechaty.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wechaty-plugin-contrib [![Wechaty Plugin Contrib](https://img.shields.io/badge/Wechaty%20Plugin-Contrib-brightgreen.svg)](https://github.com/wechaty/wechaty-plugin-contrib)\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-plugin-contrib?color=brightgreen)](https://www.npmjs.com/package/wechaty-plugin-contrib)\n[![NPM](https://github.com/wechaty/wechaty-plugin-contrib/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-plugin-contrib/actions?query=workflow%3ANPM)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWechaty Plugin Contrib Package for the Community\n\n![Wechaty Plugin](docs/images/plugin.png)\n\n\u003e Image Credit: [What is Plugin](https://www.computerhope.com/jargon/p/plugin.htm)\n\n[![Powered by Wechaty](https://img.shields.io/badge/Powered%20By-Wechaty-brightgreen.svg)](https://github.com/Wechaty/wechaty)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## Introduction\n\nWhen you find yourself writing repetitive code, it's time to extract it into a plugin.\n\nWechaty has a great support for using Plugins by calling `Wechaty.use(WechatyPlugin())`. A Wechaty Plugin is a JavaScript function that returns a function which accepts a Wechaty instance.\n\nThe first Wechaty Plugin system was design by our core team developer [@gcaufy](https://github.com/gcaufy) from issue [#1939](https://github.com/wechaty/wechaty/issues/1939)(Wechaty Plugin Support with Kick out Example) to PR [#1946](https://github.com/wechaty/wechaty/pull/1946)(feat: added wechaty plugin).\n\nThis package is for publishing the Wechaty Plugins that are very common used by the core developer team.\n\n## Requirements\n\n1. Wechaty v0.40 or above versions\n\n## Plugins Contrib\n\n- [Paka Docs](https://paka.dev/npm/wechaty-plugin-contrib)\n\nYou are welcome to send your plugin to our contrib by creating a Pull Request!\n\n| # | Plugin | Author | Feature |\n| :--- | :--- | :--- | :--- |\n| 1 | DingDong | @huan | Reply `dong` if bot receives a `ding` message. |\n| 2 | EventLogger | @huan | Log Wechaty Events for `'scan' \\| 'login' \\| 'message'` ... etc. |\n| 3 | QRCodeTerminal | @huan | Show QR Code for Scan in Terminal |\n| 4 | Heartbeat | @huan | Send emoji periodically |\n| 5 | ChatOps | @huan | Forward DM \u0026 Mention messages to a room |\n| 6 | RoomConnector | @huan | Connect rooms together with `1:N`, `M:1`, and `M:N` modes |\n| 7 | FriendshipAccepter | @huan | Accept friendship automatically, and say/do something for greeting. |\n| 8 | RoomInviter | @huan | Invite user to rooms by keyword |\n| 9 | EventHotHandler | @huan | Hot reloading event handler module files |\n| 10 | RoomInvitationAccepter | @huan | Automatically accepting any room invitations |\n| 11 | MessageAwaiter | @ssine | Wait for a particular message using `await` syntax [#13](https://github.com/wechaty/wechaty-plugin-contrib/issues/13) |\n\n### 1 DingDong\n\n- Description: Reply `dong` if bot receives a `ding` message.\n- Author: @huan\n\n```ts\nimport { DingDong } from 'wechaty-plugin-contrib'\n\nconst config = {\n  mention : true,    // default: true - Response to Mention Self (@/at) Message in Room\n  contact : true,    // default: true - Response to Direct Message\n  room    : true,    // default: true - Response to Rooms Message\n  self    : true,    // default: true - Response to Message that send from the bot itself\n}\n\nwechaty.use(DingDong(config))\n```\n\n#### `config` as a Function\n\n`config` can also be a function which receives a `message: Message` and returns a `boolean` result to decide whether response a `ding` message.\n\n`Config: (message: Message) =\u003e boolean | Promise\u003cboolean\u003e`\n\n### 2 EventLogger\n\n- Description: Log Wechaty Events: `\"dong\" | \"message\" | \"error\" | \"friendship\" | \"heartbeat\" | \"login\" | \"logout\" | \"ready\" | \"reset\" | \"room-invite\" | \"room-join\" | \"room-leave\" | \"room-topic\" | \"scan\"`\n- Author: @huan\n\n```ts\nimport { EventLogger } from 'wechaty-plugin-contrib'\nconst config = ['login', 'ready', 'message']\n// Do not provide an config will log all events.\nwechaty.use(EventLogger(config))\n```\n\n### 3 QR Code Terminal\n\n- Description: Show QR Code for Scan in Terminal\n- Author: @huan\n\n```ts\nimport { QRCodeTerminal } from 'wechaty-plugin-contrib'\nconst config = {\n  small: false,   // default: false - the size of the printed QR Code in terminal\n}\nwechaty.use(QRCodeTerminal(config))\n```\n\n### 4 Heartbeat\n\n- Description: Send emoji periodically\n- Author: @huan\n\n```ts\nimport { Heartbeat } from 'wechaty-plugin-contrib'\nconst config = {\n  contact: 'filehelper',    // default: filehelper - Contact id who will receive the emoji\n  emoji: {\n    heartbeat: '[爱心]',    // default: [爱心] - Heartbeat emoji\n  },\n  intervalSeconds: 60 * 60, // Default: 1 hour - Send emoji for every 1 hour\n}\nwechaty.use(Heartbeat(config))\n```\n\n### 5 ChatOps\n\n- Description: Forward DM \u0026 Mention messages to a ChatOps room for logging.\n- Author: @huan\n\n```ts\nimport { ChatOps } from 'wechaty-plugin-contrib'\n\nconst config = {\n  room : 'xxx@chatroom',      // required: room id for ChatOps\n  mention?  : true,                // default: true - Response to Mention Self (@/at) Message in Room\n  contact?  : true,                // default: true - Response to Direct Message\n  whitelist?: ChatOpsFilter,  // whitelist for messages that allow to send to ChatOps Room\n  blacklist?: ChatOpsFilter,  // blacklist for messages that forbidden to send to ChatOps Room\n}\n\nwechaty.use(ChatOps(config))\n```\n\n### 6 `RoomConnector`(s)\n\nConnect rooms together, it supports three modes:\n\n1. `1:N` - `OneToManyRoomConnector` can broadcast the messages in one room to others.\n1. `M:1` - `ManyToOneRoomConnector` can summary messages from rooms into one room.\n1. `M:M` - `ManyToManyRoomConnector` will broadcast every message between rooms.\n1. `M:N` - `SourceToTargetRoomConnector` will broadcast every message from source room(s) to target room(s).\n\nThe difference between `SourceToTargetRoomConnector` and `ManyToManyRoomConnector` is that:\n\n1. `SourceToTargetRoomConnector` have two options to specify:\n    1. `source`: use `RoomMatcherOptions` to specify the source rooms\n    1. `target`: use `RoomFinderOptions` to specify the target rooms\n1. `ManyToManyRoomConnector` have one option to specify:\n    1. `many`: use `string[]` as list of room ids to broadcast to\n\n#### 6.1 `OneToManyRoomConnector()`\n\n```ts\nimport { OneToManyRoomConnector, OneToManyRoomConnectorConfig } from 'wechaty-plugin-contrib'\nconst config: OneToManyRoomConnectorConfig = {\n  blacklist: [ async () =\u003e true ],\n  many: [\n    '20049383519@chatroom',     // 小句子测试\n    '5611663299@chatroom',      // 'ChatOps - Mike BO'\n  ],\n  map: async message =\u003e message.talker().name() + '(one to many): ' + message.text(),\n  one: '17237607145@chatroom',  // PreAngel 动态\n  whitelist: [ async message =\u003e message.type() === Message.Type.Text ],\n}\nwechaty.use(OneToManyRoomConnector(config))\n```\n\n#### 6.2 `ManyToOneRoomConnector()`\n\n```ts\nimport { ManyToOneRoomConnector, ManyToOneRoomConnectorConfig } from 'wechaty-plugin-contrib'\nconst config: ManyToOneRoomConnectorConfig = {\n  blacklist: [ async () =\u003e true ],\n  many: [\n    '20049383519@chatroom',     // 小句子测试\n    '5611663299@chatroom',      // 'ChatOps - Mike BO'\n  ],\n  map: async message =\u003e message.talker().name() + '(many to one): ' + message.text(),\n  one: '17237607145@chatroom',  // PreAngel 动态\n  whitelist: [ async message =\u003e message.type() === Message.Type.Text ],\n}\nwechaty.use(ManyToOneRoomConnector(config))\n```\n\n#### 6.3 `ManyToManyRoomConnector()`\n\n```ts\nimport { ManyToManyRoomConnector, ManyToManyRoomConnectorConfig } from 'wechaty-plugin-contrib'\nconst config: ManyToManyRoomConnectorConfig = {\n  blacklist: [ async () =\u003e true ],\n  many: [\n    '20049383519@chatroom',     // 小句子测试\n    '5611663299@chatroom',      // 'ChatOps - Mike BO'\n  ],\n  map: async message =\u003e message.talker().name() + '(many to many): ' + message.text(),\n  whitelist: [ async message =\u003e message.type() === Message.Type.Text ],\n}\nwechaty.use(ManyToManyRoomConnector(config))\n```\n\n#### 6.4 `SourceToTargetRoomConnector()`\n\n```ts\nimport { SourceToTargetRoomConnector, SourceToTargetRoomConnectorConfig } from 'wechaty-plugin-contrib'\nconst config: SourceToTargetRoomConnectorConfig = {\n  blacklist: [ async () =\u003e true ],\n  source: [\n    '5611663299@chatroom',\n    /source room topic/i,\n  ],\n  target: [\n    '20049383519@chatroom',\n    /target room topic/i,\n  ],\n\n  map: async message =\u003e message.talker().name() + '(source to target): ' + message.text(),\n  whitelist: [ async message =\u003e message.type() === Message.Type.Text ],\n}\nwechaty.use(SourceToTargetRoomConnector(config))\n```\n\n### 7 FriendshipAccepter\n\nAccept friendship automatically, and say/do something for greeting.\n\n```ts\nimport { FriendshipAccepter, FriendshipAccepterConfig } from 'wechaty-plugin-contrib'\nconst config: FriendshipAccepterConfig = {\n  greeting: 'we are friends now!',\n  keyword: '42',\n}\nwechaty.use(FriendshipAccepter(config))\n```\n\n1. `greeting` will be sent after the friendship has been accepted.\n1. `keyword` if set, the friendship must match the `keyword` text.\n\n### 8 RoomInviter\n\nInvite a contact to the room with `password`, `welcome`(public message), and `rule`(private message) options supported.\n\n```ts\nimport { RoomInviter, RoomInviterConfig } from 'wechaty-plugin-contrib'\nconst config: RoomInviterConfig = {\n  password : 'wechaty',\n  room     : '18171595067@chatroom',\n  welcome  : 'Welcome to join the room!',\n  rule     : 'Please be a good people',\n  repeat   : 'You have already in our room',\n}\nwechaty.use(RoomInviter(config))\n```\n\n### ~~9 EventHotHandler~~ DEPRECATED after v0.15\n\nHot reloading event handler module files.\n\n```ts\nimport { EventHotHandler, EventHotHandlerConfig } from 'wechaty-plugin-contrib'\nconst config: EventHotHandlerConfig = {\n  login: './handlers/on-login',\n  logout: './handlers/on0-logout',\n}\nwechaty.use(EventHotHandler(config))\n```\n\n### 10 RoomInvitationAccepter\n\nAutomatically accepting any room invitations.\n\n```ts\nimport { RoomInvitationAccepter } from 'wechaty-plugin-contrib'\nwechaty.use(RoomInvitationAccepter())\n```\n\n### 11 messagePrompter\n\n- Description: Wait for a particular message using `await` syntax (`await messagePrompter(message)(...)`).\n- Author: @ssine (refactored by @huan)\n\n```ts\nimport { messageAwaiter } from 'wechaty-plugin-contrib'\n\nwechaty.on('message' async (message) =\u003e {\n  const prompter = messagePrompter(message)\n\n  const reply = prompter('Hello')\n  if (reply) {\n    await message.say('hint message')\n    // do anything you want...\n  }\n})\n```\n\nOther arguments ~~include `regex` which is tested on the message and~~ `timeoutSecond` which automatically rejects the dialog after specified seconds.\n\nLearn more from:\n\n- [New Plugin: Message Awaiter #13](https://github.com/wechaty/wechaty-plugin-contrib/issues/13)\n- [Refactor the MessageAwaiter plugin #60](https://github.com/wechaty/plugin-contrib/issues/60)\n\n## Wechaty Plugin Directory\n\nThe Wechaty Plugin Contrib will only accept simple plugins which does not dependence very heavy NPM modules, and the SLOC (Source Line Of Code) is no more than 100.\n\nThere are many great Wechaty Plugins can not be included in the contrib because they are too powerful. They will be published as a NPM by itself.\n\nWe are listing those powerful Wechaty Plugins outside the contrib as in the following list, and you are welcome to add your plugin below if you have published any!\n\n[![Wechaty Plugin Contrib](https://img.shields.io/badge/Wechaty%20Plugin-Directory-brightgreen.svg)](https://github.com/wechaty/wechaty-plugin-contrib#wechaty-plugin-directory)\n\n1. [VoteOut Plugin](https://github.com/Gcaufy/wechaty-voteout) by [@gcaufy](https://github.com/gcaufy) - help you to have a vote and kick out feature for you room.\n1. [Schedule](https://github.com/Gcaufy/wechaty-schedule) by [@gcaufy](https://github.com/gcaufy) - easily schedule jobs for your Wechaty bots.\n1. [GotKicked](https://github.com/wechaty/wechaty-got-kicked-out) by [@JesseWeb](https://github.com/JesseWeb) - monitor whether your bot got kicked out of group chat. Just few line of code to implement this instead fussy judging.\n1. [WebPanel](https://github.com/gengchen528/wechaty-web-panel) by [@Leo_chen](https://github.com/gengchen528) - help you quickly access the web panel\n1. [Intercom](https://github.com/wechaty/wechaty-plugin-intercom) by [@huan](https://github.com/huan) - helps you to manage your customers/leads/users in the WeChat Room, with the power of the Intercom service.\n1. [Wechaty Vorpal](https://github.com/wechaty/wechaty-vorpal) by [@huan](https://github.com/huan) - CLI for Chatbot - Extensible Commands for ChatOps, Powered by Vorpal.\n1. [Freshdesk](https://github.com/wechaty/wechaty-freshdesk) by [@huan](https://github.com/huan) - Managing Conversations in WeChat Rooms by Freshdesk.\n1. [QnAMaker](https://github.com/wechaty/wechaty-plugin-qnamaker) by [@huan](https://github.com/huan) - Wechaty QnAMaker Plugin helps you to answer questions in WeChat with the power of \u003chttps://QnAMaker.ai\u003e.\n1. [Weixin OpenAI](https://github.com/wechaty/wechaty-weixin-openai) by [@windmemory](https://github.com/windmemory) - Wechaty Weixin OpenAI Plugin helps you to answer questions in WeChat with the power of \u003chttps://openai.weixin.qq.com\u003e.\n1. [YouDao Translate](https://github.com/chs97/wechaty-plugin-youdao) by [@Chs97](https://github.com/chs97) - Wechaty YouDao Translate Plugin helps you to translate word in WeChat with the power of \u003chttps://ai.youdao.com/\u003e.\n1. [Log Monitor](https://github.com/archywillhe/wechaty-log-monitor) by [@ArchyWillHe](https://github.com/archywillhe) - For log-related DevOps using only WeChat! Fully functional! Very loose coupling! Pretty much pure (other than side effects in I.O.)! Also contains features like QR Rescue (aka 掉线给码) for 2 Wechaties to rescue one another when one is disconnected from the grpc server.\n1. [Wechaty Xyao](https://github.com/watertao/wechaty-plugin-xyao) by [@watertao](https://github.com/watertao) - Wechaty Xyao Plugin gives bot ability to execute instruction with distributed brain module.\n1. [Wechaty-fanli](https://github.com/gengchen528/wechaty-fanli) by [@Leo_chen](https://github.com/gengchen528) - help you quickly access the rebate robot about taobao\n\n## History\n\n### master v1.0\n\n1. Add `SourceToTargetRoomConnector` to connect a source room to a target room by forward messages to target room.\n1. Support ES Modules\n    1. Deprecated `EventHotHandler` due to ESM\n1. Change `MessageAwaiter` plugin to `messagePrompter` helper function. ([#60](https://github.com/wechaty/plugin-contrib/issues/60))\n\n### v0.14 master\n\n1. Add `types.SayableMessage` and `types.toSayableMessage`\n1. Normalize config option:\n    1. `dm` renamed to `contact`\n    1. `at` renamed to `mention`\n\n### v0.10 (Jun 14, 2020)\n\n1. Export `talkers.*`, `finders.*`, and `matchers.*`\n1. Add [Mustache](https://github.com/janl/mustache.js) template \u0026 view support for all talkers.\n1. Add `mappers.messageMapper()`\n1. Add `matcher.languageMatcher()`\n\n### v0.8 (Jun 13, 2020)\n\nAdd more helper utility functions.\n\n1. Matchers: `RoomMatcher`, `ContactMatcher`, `MessageMatcher`\n1. Talkers: `RoomTalker`, `ContactTalker`, `MessageTalker`\n1. Finders: `RoomFinder`, `ContactFinder`\n\n### v0.6 (Jun 9, 2020)\n\n1. New Plugins: `OneToManyRoomConnector`, `ManyToOneRoomConnector`, and `ManyToManyRoomConnector`.\n1. New Plugin: `FriendshipAccepter` for setting to accept friendship automatically.\n1. New Plugin: `RoomInviter` for invite user to rooms with `password`, `rule`, and `welcome` options support.\n1. New Plugin: `EventHotHandler` for hot reloading event handler module files.\n\n### v0.4 (May 2020)\n\n1. New plugin: `ChatOps`: forward all DM \u0026 Mention messages to a Room for logging.\n\n### v0.2 (May 2020)\n\nAdded the following Wechaty Plugins:\n\n1. DingDong\n1. EventLogger\n1. QRCodeTerminal\n1. Heartbeat\n\n### v0.0.1 (Apr 2020)\n\nThe `wechaty-plugin-contrib` project was kicked off by the issue [Wechaty Plugin Support with Kickout Example #1939](https://github.com/wechaty/wechaty/issues/1939) and the PR [feat: added wechaty plugin #1946](https://github.com/wechaty/wechaty/pull/1946).\n\n## Contributors\n\n[![contributor](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/images/0)](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/links/0)\n[![contributor](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/images/1)](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/links/1)\n[![contributor](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/images/2)](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/links/2)\n[![contributor](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/images/3)](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/links/3)\n[![contributor](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/images/4)](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/links/4)\n[![contributor](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/images/5)](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/links/5)\n[![contributor](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/images/6)](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/links/6)\n[![contributor](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/images/7)](https://sourcerer.io/fame/huan/wechaty/wechaty-plugin-contrib/links/7)\n\n## Maintainers\n\n- @gcaufy - [Gcuafy](https://github.com/Gcaufy), Creator of [WePY](https://github.com/tencent/wepy)\n- @huan - [Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)), Tencent TVP of Chatbot\n\n## Copyright \u0026 License\n\n- Code \u0026 Docs © 2020 Wechaty Contributors \u003chttps://github.com/wechaty\u003e\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwechaty%2Fplugin-contrib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwechaty%2Fplugin-contrib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwechaty%2Fplugin-contrib/lists"}