我第一次使用了Node.js。我第一次制作了一个聊天中继机器人的故事
这是什么?
用Nodejs创建Slack机器人的故事。
虽然我是一名基础架构工程师,但我也想学会编写代码,于是我花了一点时间来做机器人的工作。
以下是当时的备忘录。
用什么
只需要一个选项,将以下内容用中文进行原生译述:
使用Botkit工具包。
和Hubot有什么不同?我没有进行过调查。但是因为有人推荐说可以方便地以现代感创建,所以我尝试使用了它。
复述成汉语的话,只需要一个选项:
程式码
代码不是很长,所以我直接贴在这里。
可以执行 npm install –save botkit,并创建 package.json(我想)。
如果频道是私人频道,则可以在 https://api.slack.com/methods/groups.list/test 确认频道的 ID。如果是公共频道,则可以在 /channels.list/test 中确认。这只适用于 Slack,对于 Facebook Messenger 等可能有其他获取方法。
token 是用于机器人的。可以从 https://app.slack.com/apps/new/bot 创建。关于自定义机器人,请参考此链接:https://api.slack.com/bot-users。
const Botkit = require('botkit');
const os = require('os');
// 色々変数チェック。他dest,originについてはここの説明では略
if (!process.env.token) {
console.warn('Error: Specify token in environment');
process.exit(1);
}
const controller = Botkit.slackbot({
debug: true,
});
controller.spawn({
token: process.env.token,
}).startRTM();
const destChannel = process.env.destChannel;
const originChannel = process.env.originChannel;
controller.hears('.*https?://www.example.com[sS]*', 'ambient', (bot, message) => { // [sS]* は改行含む全一致。.*だと改行入らない。ambient はbotが全発言を拾うということ(direct_messageとかもある)。
// 指定のチャンネルのときのみ発言を拾う
if (message.channel === originChannel) {
const matchMessage = message.text;
const userId = message.user;
bot.api.users.info({ user: userId }, (userApiError, userApiRes) => {
const userName = userApiRes.user.profile.real_name;
bot.api.channels.info({ channel: message.channel }, (channelApiError, channelApiRes) => {
// private channel はchannels apiからは情報取得できない。groups apiなら取れるが、privateチャンネル名は知られなくても良い
const channelName = (channelApiError !== 'channel_not_found') ? channelApiRes.channel.name : 'どこかprivate channel';
bot.say(
{
text: `${userName}さんが作品リンクを投稿しました(in #${channelName}) \n -------------------------- \n ${matchMessage} \n --------------------------`,
channel: destChannel,
});
});
});
}
});
启动
originChannel='<channel_id1>' destChannel='<channel_id2>' token=<bot_token> node urlcopy_bot.js
其他
我试用了eslint。
它能很好地解决明显的拼写错误,让代码变得更整洁,还能指出容易产生误解的表达方式,总体而言,感觉还不错。
我想在其他地方也尝试使用lint。
添加备注
出力の結果の検証には `RECONNECT_MS` というパラメーターを利用してタイムアウトを設定しました。
これにより、接続が切れても一定時間内に再接続を試みるようになりました。
const controller = Botkit.slackbot({ retry: Infinity });
按这样做,即使连接中断也能自动重新连接。