zoukankan      html  css  js  c++  java
  • 基于node的cmd迷你天气查询工具

    image

    1、前几天网上看到的,于是自己小改了一下,更换了天气查询的接口,当作练习一下node。
    2、收获挺大的,捣鼓了一天,终于学会了发布npm包。
    3、接下来,就介绍一下这个 mini-tianqi 的主要代码及实现。

    安装方法:

    $ npm install mini-tianqi -g
    

    使用方法:

    $ mini-tianqi shanghai // 中文和中文拼音都可以
    

    源代码:https://github.com/tangxu2424/mini-tianqi

    希望大家star一下,算是对我的鼓励哈


    1、天气接口

    我们使用心知天气的逐日天气预报接口:
    https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&start=0&days=3&location=
    location参数: 可以允许很多种类型:
    1、城市中文名,
    2、城市拼音/英文,
    3、ip地址 等等
    start和days参数: 代表起始时间和需要从起始时间返回的天数

    返回结果及具体参数,参考:https://www.seniverse.com/doc#now

    2、核心代码

    mini-tianqi

    #!/usr/bin/env node
    
    var colorful = require("colorful");
    colorful.toxic(); //Let's posion the string object, just like colors does:'hello'.red
    var package = require("../package.json");
    //node mini-tianqi -h
    //node mini-tianqi abcd mdzz
    var param = process.argv[2];
    if(process.argv.length > 3 || (param && param.toUpperCase() == "-H")){
      console.log('tianqi ~ ' + package.version.green);
      console.log(package.description.grey);
      console.log("  $ ".cyan + "mini-tianqi 上海");
      console.log("  $ ".cyan + "mini-tianqi shanghai");
      return;
    }
    //如果有城市名这个参数,或者没有城市名这个参数则调用index.js的函数
    //node mini-tianqi shanghai
    //node mini-tianqi
    var tianqi = require("../src/index");
    tianqi(param);
    

    1、第一行代码很关键,就是让此文件用node命令来执行,install以后可直接用mini-tianqi命令。
    2、图片中命令行的字体颜色就是用了colorful这个包
    3、根据参数数量来显示提示语或调用主函数显示天气

    index.js

    var request = require("request");
    var config = require("../config");
    var print = require("./print");
    
    module.exports = function (word) {
      if (word) {
        getDataByCityName(word);
      } else {//没有输入城市名则默认根据读取当前城市的天气
        request.get(config.ip.url, function (error, response, body) {
          var ipResult = JSON.parse(body);
          getDataByCityName(ipResult.ip);
        });
      }
    };
    
    function getDataByCityName(word) {
      word = encodeURIComponent(word);//可把字符串作为 URI 组件进行编码
      var options = {
        url: config.weather.url + word,
      };
      request.get(options.url, function (error, response, body) {
        //console.log(body);
        if (!error && response.statusCode == 200) {
          print.print(JSON.parse(body));
        }
      });
    }
    

    这两段代码其实很简单,就是用request做请求,
    第一段是获取你当前所在城市的ip,http://whois.pconline.com.cn/ipJson.jsp?json=true
    第二段是根据城市ip或者名称获取天气json
    其实可以不用请求获取当前所在城市的ip地址:
    “ip”两个字母 自动识别请求IP地址,例如:location=ip

    print.js

    exports.print = function (data) {
      if (data) {
        //console.log(data.results[0].location);
        printToday(data.results[0].location, data.results[0].daily[0]);
        printForecast(data.results[0].daily);
      } else {
        console.log(data.errMsg.red);
      }
    };
    function printToday(city,today) {
      console.log("
     " + city.name.cyan.bold+"今日天气".cyan.bold)
      var todayStr = "
     "+today.date.bold + "白天 ".bold + today.text_day.green + "   晚上 ".bold + today.text_night.green;
      todayStr += "  最低温度 " + today.low.cyan;
      todayStr += "  最高温度 " + today.high.red;
      todayStr += "  风力 " + today.wind_scale.yellow;
      todayStr += "
    ";
      console.log(todayStr);
    }
    function printForecast(forecast) {
      console.log( "
    "+" 未来两天预报~".cyan.bold);
      forecast.forEach(function (data,index) {
        if(index<1){return false};
        var str =  "
     " + data.date.bold + "白天 ".bold + data.text_day.green + "   晚上 ".bold + data.text_night.green;
        str += " 最低温度 " + data.low.cyan;
        str += "  最高温度 " + data.high.red;
        str += "  风力 " + data.wind_scale.yellow;
        str += "
    ";
        console.log(str);
      });
    }
    

    这段代码很简单,就是打印内容的排版,对返回天气json的解析拼接

    3、总结一下

    这个迷你天气算是我这个node菜鸟的小练习,不算是完全原创,有模仿之嫌。
    主要的收获是学会了怎么发布npm包,还涉及到了Travis-cipackage.json的配置

    下个目标:做一个vue的插件,然后发布到npm,fighting~

  • 相关阅读:
    netty ByteToMessageDecoder 分析
    netty 编/解码处理
    MAC 入门
    netty 学习
    php ioc and web rest design
    spring 启动流程
    淘宝美衣人
    ecslipe cdt lib link
    阿里巴巴中间件团队招人了!
    架构师速成-架构目标之伸缩性安全性
  • 原文地址:https://www.cnblogs.com/papi/p/7027199.html
Copyright © 2011-2022 走看看