気温を通知してくれる slack ボットを作ってみた


## Open Weather Mapのトークンを取得する

http://openweathermap.org/ にてアカウントを作成し、api_keys 画面にてAPI_KEYを取得する。


## Slackのボットテスト用トークンを取得する

botのトークンの取得方法の説明は、slack の api マニュアルに譲る。

参考URL : https://api.slack.com/bot-users


## プログラム例

今回のプログラムでは、緯度・経度を指定して、該当する地域の気温を取得している。

bot.py には、実際に気温を取得し、slackのチャンネルにつぶやく処理を記述している。
settings.py には、Open Weather Map、slackのトークンなどを設定している。


### ディレクトリ構成
```
norths_weather_bot
├── bot.py
└── settings.py
```

### bot.py
``` python
#/usr/bin/env python2.7                                                                                                                                                                                     
#-*- coding: utf-8 -*-                                                                                                                                                                                      

import json
import urllib
import urllib2

import settings

class Weather(object):
    """                                                                                                                                                                                                     
    """
    def __init__(self):
        """                                                                                                                                                                                                 
        """
        params = {'appid' : settings.OPEN_WETHER_APP_ID,
                  'lat'   : settings.OPEN_WETHER_LAT,
                  'lon'   : settings.OPEN_WETHER_LON,
                  'units' : settings.OPEN_WETHER_UNITS,
                  }

        params = urllib.urlencode(params)
        response = urllib2.urlopen(settings.OPEN_WETHER_URL + '?' + params)

        self.json = json.loads(response.read())


    def get_temp(self):
        """                                                                                                                                                                                                 
        """
        return {'max' : self.json['main']['temp_max'],
                'min' : self.json['main']['temp_min'],
                'now' : self.json['main']['temp'], }


class Bot(object):
    """                                                                                                                                                                                                     
    """
    def __init__(self):
        """                                                                                                                                                                                                 
        """
        self.set_serif()

    def set_serif(self, serif=''):
        """                                                                                                                                                                                                 
        """
        self.serif = serif

    def speak(self):
        """                                                                                                                                                                                                 
        """
        params = {'token'  : settings.SLACK_TOKEN,
                  'channel': settings.SLACK_CHANNEL,
                  'text'   : self.serif,}

        params = urllib.urlencode(params)

        req = urllib2.Request(settings.SLACK_URL)

        req.add_header('Content-Type', 'application/x-www-form-urlencoded')
        req.add_data(params)

        res = urllib2.urlopen(req)

        body = res.read()


if __name__ == "__main__":
    """                                                                                                                                                                                                     
    entry point                                                                                                                                                                                             
    """
    temp = Weather().get_temp()

    bot = Bot()
    bot.set_serif('現在の気温 : {0}℃ , 最高気温 : {1}℃ , 最低気温 : {2}℃'.format(temp['now'], temp['max'], temp['min']))
    bot.speak()
```


### settings.py
``` python
#-*- coding: utf-8 -*-                                                                                                                                                                                      

OPEN_WETHER_URL = "" # API URL
OPEN_WETHER_APP_ID = "" # API KEY
OPEN_WETHER_LAT = "" # 緯度
OPEN_WETHER_LON = "" # 経度
OPEN_WETHER_UNITS = "" # 摂氏 か 絶対温度 かを指定。metricの場合は、摂氏となる。

SLACK_URL = "" # URL
SLACK_TOKEN = "" # トークン
SLACK_CHANNEL = "" # 投稿したいチャンネル
```


## GITレポジトリ

https://bitbucket.org/ponsuke/norths_weather_bot