#動機
天気予報見てなかったら洗濯物が全滅した
#OpenWeatherMap
##使い方
解説はすでにあるので悩んだところだけ
Freeのプランで選択できるのはCurrent weather data
、5 day / 3 hour forecast
、Weather map layers
の三つ。今回は予報がしたいので5 day / 3 hour forecast
を選択。
$json = file_get_contents("http://api.openweathermap.org/data/2.5/forecast/city?id=(都市のID)&APPID=(APIのキー)");
$row_data = json_decode($json,true);
とすれば簡単に配列に予報データが入る。
array(5) {
["city"]=>array(6) {
["id"]=>int(都市ID)
["name"]=>string(11) "都市名"
["coord"]=>array(2) {
["lon"]=>float(経度)
["lat"]=>float(緯度)
}
["country"]=>string(2) "JP"
["population"]=>int(0)
["sys"]=>array(1) {
["population"]=>int(0)
}
}
["cod"]=>string(3) "200"
["message"]=>float(0.0207)
["cnt"]=>int(37)
["list"]=>array(37) { //ここのlistに予報データが全部格納されてる
[0]=>array(8) {
["dt"]=>int(1464858000)
["main"]=>array(8) {
["temp"]=>float(22.91)
["temp_min"]=>float(21.32)
["temp_max"]=>float(22.91)
["pressure"]=>float(1015.57)
["sea_level"]=>float(1019.24)
["grnd_level"]=>float(1015.57)
["humidity"]=>int(51)
["temp_kf"]=>float(1.58)
}
["weather"]=>array(1) {
[0]=>array(4) {
["id"]=>int(800)
["main"]=>string(5) "Clear"
["description"]=>string(9) "clear sky"
["icon"]=>string(3) "01d"
}
}
["clouds"]=>array(1) {
["all"]=>int(0)
}
["wind"]=>array(2) {
["speed"]=>float(7.51)
["deg"]=>float(356.006)
}
["rain"]=>array(0) {
}
["sys"]=>array(1) {
["pod"]=>string(1) "d"
}
["dt_txt"]=>string(19) "2016-06-02 09:00:00"
}
以下略
["list"]
以下に単純に番号が振られて予報データが入っている。["dt_txt"]
でほしいデータを見分けないといけない。
今回ほしかったのは["weather"]["id"]
。ほしいデータは選んで取得できないので全部取ってこないといけない(当然)。
["cod"]
がステータスなので、200以外だったらエラーなのかもしれない。あと時間はUTC
なのでそこも注意。
これで天気IDが取得できるので、
を参考にswitch-case
とか使っていい感じに。
800番台なら晴れorくもり
700番台なら霧とか砂嵐とか
600番台なら雪
500番台なら雨
300番台なら霧雨
200番台なら雷雨
900番台ならやばい
900番台は起こり得るのかな?天気アイコンもないみたいだし、天気じゃなくて風とかだし無いのかも。
#Twitter
Twitterに投稿するところはmpywさんのTwistOAuth
を使えば一瞬なので省略。
参考
http://qiita.com/tsunet111/items/9309801cd3e3bcf6e32a#comment-c9e56af1c481560cb642
ほんとはOpenWeatherMap側が提供している天気アイコンの画像付きでツイッターに投稿しようかなと考えていたのですが、毎回同じ画像をアップロードするのもなぁと思ってやめました。絵文字で代用できるしね。同じ画像を複数の投稿で共有って無理かな、無理だよね。
#まとめ
超簡単に天気予報bot作れました。あまり参考にならないかもしれませんが、ほんとにこれだけです。