Node.jsからDark Sky APIを用いて天気情報を得る

2019-08-05

3連休はあいにくの天気。のんびりとNode.jsを学習中です。

今日はDark Sky APIを用いた簡単なサンプルプログラムを試しました。

この機能を使えば、Fitbit Ionicのオリジナルのクロックフェース(文字盤)に天気予報を出すこともできそうですね。

仕様及び非機能要件

  • 引数で指定した天気予報の概要、現在の気温、降水確率の文字列を出力する。「結果」参照。
    • 気温は摂氏(℃)。
    • 概要情報は日本語とする。
    • 数値を指定桁で四捨五入する。
  • Dark Sky APIを使用する。
  • HTTPリクエストを簡単にするnpmのrequestモジュール使用する。
  • インターネット接続が切れた場合、エラーメッセージを表示する。
  • APIの呼び出し結果がエラーだった場合、エラーメッセージを表示する。
  • エラーメッセージは、赤字の反転とする。
  • ES6のDestructuringProperty shothandを使用する。
chalkモジュールによる赤字・反転のコンソール出力

結果

PS > node app.js 仙台市
 日本, 宮城県仙台市 の天気予報をお伝えします。
 一週間中降水なし。水曜日は最高気温34°C。
 現在の気温は28.0℃、降水確率は9%です。

コード

  • 下記のxxxxと伏せ字にしている部分は、APIのシークレットキー

app.js

const chalk = require('chalk')
const geocode = require('./utils/geocode')
const forecast = require('./utils/forecast')

const address = process.argv[2]

if (!address) {
    return console.log(chalk.red.inverse('天気予報を表示するための住所を指定してください。'))
}

geocode(address, (error,  { latitude, longtitude, location } = {}) => {
    if (error) {
        return console.log(chalk.red.inverse(error))
    }

    forecast(latitude, longtitude, (error, {summary, temperature, probability}) => {
        if (error) {
            return console.log(chalk.red.inverse(error))
        }
        console.log(location + ' の天気予報をお伝えします。')
        console.log(summary)
        console.log('現在の気温は'+temperature+'℃、降水確率は'+probability+'%です。')
    })
}) 

utils/forecast.js

const request = require('request')

const forecast = (latitude, longitude, callback) => {
    const url = 'https://api.darksky.net/forecast/xxxxxx/' + latitude + ',' + longitude + '?lang=ja&units=si'  // 秘密です 

    request ( { url, json: true }, (error, { body }) => {
        if (error) {
            callback ('天気サービスに接続できません'.undefined)
        } else if (body.error) {
            callback('その地域の天気情報を得ることができません', undefined)
        } else {
            callback(undefined, {
                summary: body.daily.summary,
                temperature: body.currently.temperature.toFixed(1),
                probability: (body.currently.precipProbability * 100).toFixed(0)
            })
        }
    })
}

module.exports = forecast 

utils/geocode.js

const request = require('request')

const geocode = (address, callback) => {
    const mapBoxAccessToken = 'pk***' // 秘密です
    const url = 'https://api.mapbox.com/geocoding/v5/mapbox.places/' + encodeURIComponent(address) + '.json?access_token=' + mapBoxAccessToken + '&limit=1&language=ja'

    request ( {url: url, json: true}, (error, { body }) => {
        if (error) {
            callback('ロケーションサービスに接続できません', undefined)
        } else if (body.features.length === 0) {
            callback('指定した地域の緯度・経度を得ることができません', undefined)
        } else {
            callback(undefined, {
                latitude: body.features[0].center[1],
                longtitude: body.features[0].center[0],
                location: body.features[0].place_name
            })
        }
    })
}

module.exports = geocode 

プロジェクト設定

ソースコードのフォルダにて以下を実行する。

npm init -y           // -yにより対話なしでデフォルトを受け入れてpackage.jsonを生成する
npm i request@2.88.0  // バージョン2.88.0のrequestモジュールを本プロジェクトにインストールする

Dark Sky APIのアカウント設定

  1. https://darksky.net/dev にアクセスする。
  2. [TRY FOR FREE]ボタンをクリックする。
  3. Registerページで電子メールアドレス、パスワードを設定し、[REGISTER]ボタンをクリックする。
  4. 送られてきたメールのリンクをクリックする。