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));
}

相关文章推荐

bearychat+hubot chatops运维机器人

1.安装nodejsyum安装: [root@node1 ~]# yum install -y epel-release [root@node1 ~]# yum install -y npm [roo...

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

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

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

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

分布式事务处理方案:将多虚拟机事务变为单一虚拟机XA事务

处理过程: 1、服务A业务1使用注解开启分布式事务 2、分布式事务代理类(通过Spring AOP对注解进行处理的类),通过SOCKET通知事务处理中心开启分布式事务,将分布式事务流水号写入线程变量 ...

Kafka源码深度解析-序列14 -Server核心组件之3-SocketServer与NIO- 1+N+M 模型

对于任何服务器程序来讲,网络框架都是其最基础的部分。在前面我们分析了Producer端的NIO和Network框架,本篇将详细分析服务器端的Network框架。入口 KafkaServer让我们从ma...

开发调试linux服务时几个好用的进程和端口查询命令组合和简单脚本(ps netstat awk grep)

这几天在搭建flume服务并在其框架下开发,反复调试输入命令让人不厌其烦,因此在这里记录一下自己找到的一些小技巧: 首先,把自己的应用程序做成一个service是一个很好的选择,一个service就...

shell脚本下小程序初试-进度条

相信进度条大家都不陌生,每次下载东西的或软件的时候都会有提示当前下载任务达到多少,当然可以有不同语言来实现,今天我就   用shell脚本实现进度条 首先需要知道的是,进度条分为进度、显示百分比,和...

初试Unity 3D——理解U3D的组件和脚本

哈哈,昨晚弄清楚了U3D的组件到底是怎么个机制,今天中午就通过写博客来梳理一遍吧!1、首先,一个游戏之中会有很多的游戏场景(Scene),游戏场景中有很多的游戏物体(GameObject),包括摄像机...

 网络端口扫描器

  • 2006年09月12日 15:07
  • 112KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hubot 脚本初试:自动翻译 + 端口查询
举报原因:
原因补充:

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