気象衛星ひまわりからリアルタイムに送られてくる写真を、ひたすら Slack に投稿する

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/2537cec1-6862-4799-cc0f-2724c9ad074d.png)

ひまわりが撮影した写真を簡単に取得出来る [himawari.js](https://github.com/jakiestfu/himawari.js) を使って、地球の画像を Slack に定期的にポストしていきます。

こんな雄大な地球の姿を見たら、きっと怒る人もいなくなりますね。職場の雰囲気を良くするためにも、あらゆるチャンネルにガンガンポストしていきましょう。

# ひまわりの画像を取得する

たったこれだけで、取得出来ます。

```js
var himawari = require('himawari');

himawari({
  zoom: 1,
  date: 'latest',
  debug: false,
  infrared: false,
  outfile: '/path/to/output/earth.jpg',
  skipEmpty: true,

  success: function () { process.exit(); },

  error: function (err) { console.log(err); },

  chunk: function (info) {
    console.log(info.outfile + ': ' + info.part + '/' + info.total);
  }
});
```
いくつかオプションを説明すると、
`zoom` は 1 〜 5 を指定する事ができ、値が大きくなるほど画像サイズが上がります。
`date` は、いつの写真を取ってくるかを、`Date()` か文字列で指定する事が出来ます。また、`latest` とすると最新の写真を取ってきます。（ちなみに、写真は 10 分毎に撮影されます）
`infrared` は `true` にすると、赤外光スペクトルでの画像を取得できるとのこと。

# Slack にポストする

\#earth チャンネルに地球の画像をアップする `postToSlack` 関数を実装しました。`token` は各自の bot の token を入れて下さい。`himawari` で作成した画像の `filename` を引数としています。

```js
function postToSlack(filename) {
  var fs = require('fs');
  var path = require('path');
  var request = require('request');

  var payload = {
    channels: '#earth',
    token: 'hogehoge',
    file: fs.createReadStream(path.join(__dirname, filename)),
    filename: filename,
    username: 'pekepek'
  }

  var options = {
    uri: 'https://slack.com/api/files.upload',
    formData: payload
  }

  request.post(options, function(error, response, body){
    if (!error && response.statusCode == 200) {
      console.log(body.name);
    } else {
      console.log('error: '+ response.statusCode);
    }
  });
};
```

# 10 分毎に衛星写真をポストする

[node-cron](https://github.com/ncb000gt/node-cron) を使って、10 分毎に写真の取得、Slack へのポストを行います。

```js
var cronTime = '*/10 * * * *';
CronJob = require('cron').CronJob;

var job = new CronJob({
  cronTime: cronTime,

  onTick: function() {
    // ひまわり画像の取得
    // Slack へポスト
  },

  start: false
});

job.start();
```

これで準備 OK

# 組み合わせる

```js:post_earth.js
function postToSlack(filename) {
  var fs = require('fs');
  var path = require('path');
  var request = require('request');

  var payload = {
    channels: '#earth',
    token: 'hogehoge',
    file: fs.createReadStream(path.join(__dirname, filename)),
    filename: filename,
    username: 'pekepek'
  }

  var options = {
    uri: 'https://slack.com/api/files.upload',
    formData: payload
  }

  request.post(options, function(error, response, body){
    if (!error && response.statusCode == 200) {
      console.log(body.name);
    } else {
      console.log('error: '+ response.statusCode);
    }
  });
};

var cronTime = '*/10 * * * *';
CronJob = require('cron').CronJob;

var job = new CronJob({
  cronTime: cronTime,

  onTick: function() {
    var himawari = require('himawari');

    himawari({
      zoom: 1,
      date: 'latest',
      debug: false,
      infrared: false,
      outfile: './earth.jpg',
      skipEmpty: true,

      success: function (info) {
        postToSlack('earth.jpg');
      },

      error: function (err) { console.log(err); },

      chunk: function (info) {
        console.log('Saved' + ': ' + info.part + '/' + info.total);
      }
    });
  },

  start: false
});

job.start();
```

できた！
あとは実行するだけ

```
node post_earth.js &
disown
```

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/e8e3d62a-a57d-493f-f646-8b6e2dbcbfb5.png)

できたー！
きれいだなあ！！

ただ、あれですね。10 分毎だと全然変化ないですね。