2017.06.02   |   Python

Slackのステータスに今の天気を表示してみた

この前Slackに追加されたユーザーのステータス機能面白いですね。
本来の使い方である自分の状態などをこまめに変更している人は少ないですが、
各自思い思いの絵文字を表示していてSlackのタイムラインが楽しいことになってます。

このステータス機能、API叩いても更新できるそうです。
スケジューラーとかを利用して自動で変更したらまた面白い使い道がありそうです。

とりあえずAPI叩いて遊んでみたかったので、試しに「今の天気」を表示してみることにしました。
天気なら対応する絵文字もデフォルトでありますし、APIも転がってそうです。

早速ですがスクリプト(Python3)をぺたり。

# coding: utf-8

from os import environ
import json
import datetime

import requests  # pip install requests


AREA_ID = 1850147  # Tokyo,JP
WEATHERMAP_API = 'http://api.openweathermap.org/data/2.5/weather'
SLACK_STATUS_API = 'https://slack.com/api/users.profile.set'

WEATHERMAP_APPID = environ['WEATHERMAP_APPID']
SLACK_TOKEN = environ['SLACK_TOKEN']


def get_weather(city_id):
    result = requests.get(url=WEATHERMAP_API, params={'id': city_id, 'appid': WEATHERMAP_APPID})
    if result.ok:
        return result.json()


def update_status(emoji, text):
    data = {
        'token': SLACK_TOKEN,
        'profile': json.dumps({'status_text': text, 'status_emoji': emoji})
    }
    result = requests.post(url=SLACK_STATUS_API, data=data)
    return result


def k2c(k):
    return k - 273.15


def weather2emoji(wid):
    """ FIXME: https://openweathermap.org/weather-conditions"""
    w = wid // 100
    if w == 2: return 'thunder_cloud_and_rain'
    if w in (3, 5): return 'umbrella_with_rain_drops'
    if w == 6: return 'snowman'
    if wid == 800: return 'sunny'
    if wid == 801: return 'mostly_sunny'
    if w == 8: return 'cloud'
    if wid == 701: return 'foggy'
    return 'mega'


def weather2ja(wid):
    """ FIXME: """
    w = wid // 100
    if w == 2: return '雷'
    if w in (3, 5): return '雨'
    if w == 6: return '雪'
    if wid == 800: return '快晴'
    if wid == 801: return '晴れ'
    if w == 8: return 'くもり'
    if wid == 701: return '霧'
    return '??({})'.format(wid)

def main():
    weather = get_weather(AREA_ID)
    if not weather:
        return print("Fail to fetch weather")
    print(weather)

    emoji = ':{}:'.format(weather2emoji(weather['weather'][0]['id']))
    text = '{} {}/{}℃ {}%'.format(weather2ja(weather['weather'][0]['id']), k2c(weather['main']['temp_max']), k2c(weather['main']['temp_min']), weather['main']['humidity'])
    text += datetime.datetime.now().strftime(' (%H:%M現在)')
    print('{} {}'.format(emoji, text))

    result = update_status(emoji, text)
    print(result)


if __name__ == '__main__':
    main()

OpenWeatherMapという天気のAPIがあったので、そこから天気を取ってきて、Slackに更新をかけるだけのスクリプトです。
WEATHERMAP_APPID SLACK_TOKEN 環境変数にそれぞれOpenWeatherMapのAPPIDとSlackのTokenを入れてあげれば動きます。
WebAPI叩くだけなので特に難しい事なく使えますね。
(一番面倒なのはSlackのTokenを取るところかもしれません。)


実行してみると無事ステータスが更新されています。
あとはスケジューラーを設定して定期的に叩くようにしてあげましょう。

ステータスのアイコンやマウスオーバーで天気が分かるので結構便利です。
そのうちSlack内で「天気の人」としての知名度が上がるかもしれません。

他にも面白い使いみちないか模索中です。
何かしらのセンサーと絡めると面白いかもですね。

参考

Qiita: Slack の Status emoji を API で変更する
users.profile.set method | Slack