wechaty是目前看来最优雅的机器人库了。使用方式也很简单,官方的demo例子就几行代码,不过看到他们的hot-import-bot.js就感觉慌了。毕竟在同一个页面里,还能直接使用bot变量(例子中实例化的时候,用的是bot,const bot = new Wechaty());但分拆成单独的文件后就没有相应的用法。
看源码中是有这样的代码:
- public on (event: 'dong', listener: string | ((this: Wechaty, data?: string) => void)) : this
是看到确实对每一个件事都是传入两个参数,然而demo里都是类似这样:
- async function onLogin (user) {
- console.log(`${user} login`)
- }
也没有看到有传入第二个变量。如果你主动 传入第二个参数,会直接报undefined。在这样分拆的页面怎么使用bot呢?
我找了一下node的全局变量,发现nodejs有一个global变量。嗯,变量名就叫:global.....,于是将除了message以外的事件放到主文件index.js中。并在onlogin中赋值:global.bot = bot;
然后在分拆后的message中,const bot = global.bot; 果然就可以用了。
问了一下群里,发现有人也这样用,但。。。Huan Li(Huan (李卓桓))说了,其实可以在方法里面直接 const wechaty = this;就可以用了。。。
这么说。。。this就可以直接用?果然不会Ts就是不懂。然后 他还更新了一下 git,并在里面加入了使用方法,详见:https://github.com/wechaty/wechaty-getting-started/blob/master/examples/professional/hot-import-bot/listeners/on-friend.js
- /**
- * Wechaty - https://github.com/chatie/wechaty
- *
- * @copyright 2016-2018 Huan LI <zixia@zixia.net>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
- async function onFriend (contact, request) {
- /**
- * We can get the Wechaty bot instance from this:
- * `const wechaty = this`
- * Or use `this` directly:
- * `console.info(this.userSelf())`
- */
- if(request){
- let name = contact.name()
- // await request.accept()
- console.log(`Contact: ${name} send request ${request.hello()}`)
- }
- }
- module.exports = onFriend
最后想说的是,感觉
- public on (event: 'dong', listener: string | ((this: Wechaty, data?: string) => void)) : this
这个this的用法就象python的self一样。虽然不懂,但是感觉很厉害的样子。
最近在尝试使用他做了个小机器人,就是当群里有人问天气的时候自动回复了一下。。。目前只是demo。没有细纠,但这时候发现 Room.alias(Contact)。没有拿到群昵称,准备这两天再看看问题是啥。