Hubot 脚本初试:自动翻译 + 端口查询

原创 2016年08月29日 20:08:33
最近玩起了 Hubot,主要原因有:
    1、想了解这货到底是何方神圣
    2、思考在公司内部是否有使用的价值
    3、能否通过其提升自己的工作效率
在这过程中,自己尝试写了几个脚本,其中最常用的就是自动翻译和端口获取了。由于代码很简单,也就不额外说明了。有兴趣的同学可以通过注释了解实现,有需要的同学直接copy吧。
ps:网上的例子几乎都是 coffeescript 实现的,不过我还是习惯 es6 格式 javascript,所以以下代码都是基于es6。
/**
 * 翻译脚本,别指望做太多,只能en和cn
 * 别问我为什么输出格式这么丑:因为我懒。
 * @format: fanyi|f|en world
 * @example: f world
 * @author Tiago
 */


'use strict'

let request = require('request');
let fs = require('fs');

/**
 * 判断是否中文
 */
function isChina(s)
{
  let patrn= /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/gi;
  return (!patrn.exec(s))? false : true;
}

/**
 * 翻译的具体逻辑
 */
function translate(robot, res)
{
    if (res.match.length < 2)
  {
    return;
  }
  let str = res.match[1];
  let [from, to] = isChina(str) ? ['zh', 'en'] : ['en', 'zh'];
  let url = `http://fanyi.baidu.com/v2transapi?from=${from}&to=${to}&query=${encodeURI(str)}&transtype=realtime&simple_means_flag=3`;
  console.log(str, isChina(str), isChinese(str));

  request.get(url, function (err, response, body)
  {
    let data = JSON.parse(body);
      if (data.trans_result.data)
    {
      res.send(JSON.stringify(data.trans_result.data));
    }
    else if (data.trans_result.dict_result)
    {
      res.send(JSON.stringify(data.trans_result.dict_result));
    }
    else
    {
      res.send(data);
    }
  });
}


module.exports = function (robot)
{
  robot.hear(
    /[fanyi|f] (.*)/i,
    (res) => translate(robot, res)
  );
}
/**
 * 常用系统功能
 *
 * @example: sys p 30000 查找30000端口号的占用
 * @example: sys k 40000 杀死进程id为40000的进程
 * @example: sys f 50000 释放50000端口的占用(杀死起进程)
 * @author Tiago
 */


'use strict'

let spawn = require('child_process').spawn;


function log(...res)
{
  console.log(...res);
}

/**
 * 获取命令的输出信息
 */
function getCommandOutput(cmd, arg1, arg2 = null, cb = null)
{
  arg1 = arg1 || [];
  arg2 = arg2 || {};
  let output = "";
  let handle = spawn(cmd, arg1, arg2);
  // 标准输出
  handle.stdout.on('data', (data) =>
  {
    //console.log('【捕获输出】:' + data);
    output = output + data.toString();
  });

  // 捕获标准错误输出并将其打印到控制台
  handle.stderr.on('data', (data) =>
  {
    console.log('【命令无法执行】:\n' + data);
  });

  // 注册子进程关闭事件
  handle.on('exit', (code, signal) =>
  {
    //console.log('【命令执行完毕】:', code, signal);
    if (code == 0 && cb)
    {
      cb(output);
    }
  });
}

/**
 * 解析NetStat的结果
 */
function parseNetStat(info)
{
  let res = {success: false};
  let idx = 0;
  for (let data of info.split(' '))
  {
    if (data == '')
    {
      continue;
    }
    switch (idx++)
    {
      case 0 :
        res.proto = data;
        break;
      case 1 :
        res.local = data;
        break;
      case 2 :
        res.foreign = data;
        break;
      case 3 :
        res.state = data;
        break;
      case 4 :
        res.pid = data;
        break;
    }
    if (idx == 4)
    {
      res.success = true;
    }
  }
  return res;
}


/**
 * 获取端口占用信息
 */
function getPortInfo(port, robot = null, res = null, cb = null)
{
  getCommandOutput('netstat', ['-ano'], null, (output) =>
  {
    let lineList = output.split("\r\n");
    let portStr = `:${port}`;
    let showInfo = `【${port}】\t 端口未被占用`;

    for (let info of lineList)
    {
      let data = parseNetStat(info);
      if (data.success == false)
      {
        continue;
      }

        if (data.success == false ||
      data.local.indexOf(portStr) == -1)
    {
      continue;
    }
        if (data.local.indexOf('::') != -1)
    {
      continue;
    }

      showInfo = `PID:${data.pid}\t${data.local} \t ${data.foreign}`;
      pid2Name(data.pid, robot, res);
      break
    }
    res ? res.send(showInfo) : console.log(showInfo);
  })
}

/**
 * 根据pid 杀死进程
 */
function killTask(pid)
{
  if (Number.parseInt(pid) == pid)
  {
    getCommandOutput('taskkill', ['/f', '/pid', pid]);
  }
  else
  {
    getCommandOutput('taskkill', ['/f', '/im', pid]);
  }

}

/**
 * 解析NetStat的结果
 */
function parseTaskList(info)
{
  let res = {success: false};
  let idx = 0;
  for (let data of info.split(' '))
  {
    if (data == '')
    {
      continue;
    }
    switch (idx++)
    {
      case 0 :
        res.name = data;
        break;
      case 1 :
        res.pid = data;
        break;
      case 2 :
        res.sessionName = data;
        break;
      case 3 :
        res.sessionId = data;
        break;
      case 4 :
        res.memory = data;
        break;
    }
    if (idx == 4)
    {
      res.success = true;
    }
  }
  return res;
}


/**
 * pid 转换为名字
 */
function pid2Name(pid, robot = null, res = null, cb = null)
{
  getCommandOutput('tasklist', [], null, (output) =>
  {
    let lineList = output.split("\r\n");
    let showInfo = `【${pid}】\t该进程不存在`;
    for (let info of lineList)
    {
      let data = parseTaskList(info);
      if (data.success == false || data.pid != pid)
      {
        continue;
      }
      showInfo = `${data.name}【PID : ${data.pid}】`
      break;
    }
    res ? res.send(showInfo) : console.log(showInfo);
  });
}

module.exports = function (robot)
{
  robot.hear(/p (.*)/i, (res) => getPortInfo(res.match[1], robot, res));
  robot.hear(/sys p (.*)/i, (res) => getPortInfo(res.match[1], robot, res));
  robot.hear(/sys k (.*)/i, (res) => killTask(res.match[1], robot, res));
  robot.hear(/k (.*)/i, (res) => killTask(res.match[1], robot, res));
}

基于Hubot打造自己的聊天机器人服务(二)

开发自定义机器人脚本 集成聊天机器人到微信
  • yaoyasong
  • yaoyasong
  • 2016年05月19日 09:20
  • 4396

在 Linux 上搭建 Hubot 聊天机器人服务器

在 Linux 上搭建 Hubot 聊天机器人服务器 1. 先确定安装了 Node.js 如果还没安装Node.js,就先安装Node.js。Node.js是绿色软件,只要解压安装包即可。这里假设已...
  • iw1210
  • iw1210
  • 2017年05月07日 15:46
  • 1343

使用GitHub进行团队合作

原文: Team Collaboration With GitHub GitHub已经成为的一切开放源码软件的基石。开发人员喜欢它,基于它进行协作,并不断通过它开发令人惊叹的项目。除了​...
  • lw5180822
  • lw5180822
  • 2013年11月04日 11:31
  • 2558

基于Hubot打造自己的聊天机器人服务(一)

本地运行HubotHubotHubot是Github开发并开源的chatbot,但它并不仅仅是一个聊天机器人,Hubot已经广泛应用于Github的日常运维工作,被称为最忙碌的员工。安装HubotHu...
  • yaoyasong
  • yaoyasong
  • 2016年05月16日 15:37
  • 9826

人工智能标记语言AIML聊天机器人:产生、种类、应用、实例、AIML概述、知识库、公司、业界(20k字经典收藏版)

聊天机器人(chatterbot)是一个用来模拟人类对话或聊天的程序,试图建立程序让真人认为在和另一个人聊天。在NLP/AIML技术加多样性语库支撑下,采用免费人工语言在线计算机实体ALICE人工智能...
  • qq_28260611
  • qq_28260611
  • 2017年02月25日 22:23
  • 1031

bearychat+hubot chatops运维机器人

1.安装nodejsyum安装: [root@node1 ~]# yum install -y epel-release [root@node1 ~]# yum install -y npm [roo...
  • zxf_668899
  • zxf_668899
  • 2017年02月07日 14:52
  • 995

hubot安装初探

来自info的介绍 Hubot作为GitHub的开源chatbot,正在彻底又革命的改变GitHub的运维工作:自动部署、报表、监控、精简配置、发推,还有许多其他功能一起打造并增强着GitHub的远...
  • wang1144
  • wang1144
  • 2016年12月03日 06:50
  • 1235

Hubot插件开发:井字游戏

Hubot插件开发:井字游戏此项目实施的主要目的: 学习Hubot脚本的开发方法. 学习使用CoffeeScript. 温习Tic-Tac-Toe玩法. 此项目实现的主要目标: 在Slack上与Rob...
  • baidu_zhongce
  • baidu_zhongce
  • 2015年06月05日 19:46
  • 481

hubot机器人

hubot安装首先,需要有nodejs和npm,这些安装了,才能安装hubot generator;推荐使用git工具。 % npm install -g yo generator-hubot ...
  • hsx1612727380
  • hsx1612727380
  • 2016年01月12日 21:52
  • 1132

hubot的插件使用

hubot是一个开源的聊天机器人框架,支持很多的插件。hubot的插件安装都是通过npm install来执行,安装完之后,通常需要在external-scripts.json里面追加新安装的插件名(...
  • felix_yujing
  • felix_yujing
  • 2018年02月06日 19:59
  • 33
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hubot 脚本初试:自动翻译 + 端口查询
举报原因:
原因补充:

(最多只允许输入30个字)