我第一次使用了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 });

按这样做,即使连接中断也能自动重新连接。

广告
将在 10 秒后关闭
bannerAds