Chomado's Blog
You Are Reading

[PHP] Twitter 天気予報 bot を作った [Yahoo! Weather API]

2
PHP

[PHP] Twitter 天気予報 bot を作った [Yahoo! Weather API]

php お天気bot

誕生日(11/27)の次の日に, PHPで Twitter bot を作りました. @chomado_bot です.
現在の主な機能は2つあり,
* 呟きリストからランダムに1つ呟くのと,
* 現在の天気 & 明日の天気予報を取得し, 呟く機能です.
コードは github にあげています.

目次

  1. サンプルツイート
  2. PHP を選んだ理由
  3. 現在の機能
  4. コード
  5. 今後のこと
  6. なんでPHP辞めることにしたか

サンプルツイート

我ながら可愛いbotになったぞ!(((o(゚▽゚)o)))

まだ英語だ〜>< (APIから引っ張ってきた天気予報データが全文英語なので.)

PHP を選んだ理由

  1. Twitter bot を作りたくて, ググったら, PHPで書いたものばかり出てくるから.

    • (私のような初心者には, 資料が潤沢ということはとても大切.)
  2. 利用しているレンタルサーバーがPHPしか使えない.

    • (これは調べ直したら実は『使用可能言語: PHP, Ruby, Python, Perlの4つ』だったことがわかった.)
    • (けど当時はPHPだけだと思ってた)
  3. OAuth認証は絶対自力では書きたくないので, ライブラリをググったら, 真っ先にPHPのやつが出てきたから.

現在の機能

  • list.txt からランダムに1行選び、ツイートする
  • Yahoo Weather API から天気情報を引っ張ってきて、ツイートする

まだメンション機能などは無い

コード

github に置いてあります!(((o(゚▽゚)o))) https://github.com/chomado/chomado_bot

bot.php メインの本体
list.txt 発言一覧です! ただのテキストファイルです
weather.php 天気情報を取ってきて整形する Weather Class が書いてある

Twitter OAuth 周りは twitteroauth というライブラリ( https://github.com/abraham/twitteroauth )にて。

bot.php

bot本体のメインのファイルです。

require_once('twitteroauth/twitteroauth.php'); // OAuth
require_once('botconfig.php'); // アクセストークンとか色々大事な定数が保存してある。
require_once('weather.php'); // 天気情報クラス

// 現在時刻. タイムゾーンはJST指定
$time = new DateTime('now', new DateTimeZone('Asia/Tokyo'));

// ファイルの行をランダムに抽出
$filelist 	= file('list.txt');
shuffle($filelist);
$message 	= $filelist[0] . PHP_EOL;

// 現在の天気と明日の予報を入手 (from weather.php)
$weather	= new Weather('tokyo'); // まだ東京固定
$now 		= $weather->GetCondition();
$tomorrow 	= $weather->GetTomorrow();

// 呟く文に天気情報を加える
$message	.= '東京の現在('
			. $time->format('m/d H:i')
			. ')の天気は'
			. $now['weather']
			. '('
			. $now['temp']
			. '℃)です.'
			. PHP_EOL
			. '明日は'
			. $tomorrow["weather"]
			. 'で, '
			. '最高気温は'
			. $tomorrow['high']
			. '℃, 最低気温は'
			. $tomorrow['low']
			. '℃ です.';

// Twitterに接続
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
$req = $connection -> OAuthRequest(
	"https://api.twitter.com/1.1/statuses/update.json"
	, "POST"
	, array("status"=> $message )
	);

という感じです。
37行目の

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

ここでTwitterとのコネクションを確立しています! 私は詳しいことはよくわからないんですけど, OAuth認可とかいうやつを通しています!(((o(゚▽゚)o)))

ここで使っている変数(定数)の CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET は botconfig.php という名前をつけた別ファイルに定義してあります!
これらの文字列は外部には漏らしてはいけないものですφ(゚▽゚)oメモメモ
だからこの辺をサーバにアップロードするとき, アクセス権限を600とか700とかにしました!( ゚▽゚ っ)З

list.txt

発言一覧です! どんどん増やすぞ!(((o(゚▽゚)o)))
1行が1つぶやきです.
天気予報の分もあるので, その天気予報ぶんの文字数を足しても140字制限は超えないように, 長過ぎずで.

ちょまど(*゚▽゚* っ)З	
(((o(*゚▽゚*)o)))(((o(*゚▽゚*)o)))
ちょまっちょま(((o(*゚▽゚*)o)))
ちょまどbot!(*゚▽゚* っ)З
(*゚▽゚* っ)З ちょまぎょ!
┌(┌ *゚▽゚*)┐ チョマドォ...
(((o(*゚▽゚*)o))) ちょまどbot
https://github.com/chomado/chomado_bot/blob/master/list.txt からランダムにツイート.
(((o(*゚▽゚*)o))) ちょまどbotは git管理されています https://github.com/chomado/chomado_bot	

weather.php

天気情報をごにょごにょしてるクラスです.
Yahoo Weather API( https://developer.yahoo.com/weather/ (英語)) から天気情報を引っ張ってきています.

このAPIについて読むと,

Rate Limits
Use of the Yahoo Weather API should not exceed reasonable request volume. Access is limited to 2,000 signed calls per day.

一日2000回までのリクエストなら大丈夫らしい. そんなに行かないので大丈夫

Terms of Use
The above feeds are provided free of charge for use by individuals and non-profit organizations for personal, non-commercial uses.

個人用で商用目的じゃないので大丈夫です

ということで問題無く使えるぞ(((o(゚▽゚)o)))

<?php
// 天気情報クラス
class Weather
{
	private $city;
	private $info;
	
	public function __construct($city)
	{
		$this->city = $city;
		$this->info = $this->GetWeather();// API呼び出しを1回で済ませるためにここでgetしておく
	}

	// 華氏→摂氏変換関数
	private function FtoC($f)
	{
		return round(($f - 32) * 0.555, 1);
	}

	// yahoo の天気予報 API から引っ張ってくる
	private function GetWeather()
	{
		return json_decode(file_get_contents(
			'https://query.yahooapis.com/v1/public/yql?q=select%09*%20from%20%09weather.forecast%20%20where%20%09woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22' 
			. $this->city
			. '%2C%20jp%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys'
			))->query->results->channel->item;
	}

	// 現在の天気
	public function GetCondition()
	{
		$now = [
			'weather'	=> $this->info->condition->text
			, 'temp'	=> $this->FtoC($this->info->condition->temp)
		];
		return $now;
	}

	// 明日の天気情報
	public function GetTomorrow()
	{
		$tomorrow = [
			'weather'	=> $this->info->forecast[1]->text
			, 'high'	=> $this->FtoC($this->info->forecast[1]->high)
			, 'low'		=> $this->FtoC($this->info->forecast[1]->low)
		];
		return $tomorrow;
	}
}

まだ東京指定だけど, 今後ユーザが自由に都市名を指定して使えるようになれればなと思います.
メンションで都市名を指定して, それを読み取って, みたいな.

でもそしたら今のこのコードは良くなくて, なんでかというと, 25行目で
. $this->city
と, 入力値をそのままベタ埋めしています.
これは危ないですね. いずれなんとかしたいです

今後のこと

bot 作り 楽しい!(((o(゚▽゚)o))) 私はツイ廃なので, Twitterを遊び場にするのはとても楽しい(((o(゚▽゚)o)))

早速なんですけどRubyで全部書き換えたいです.
本当は Haskell か C++ でやりたいんですけど, 今のレンタルサーバーは動かないので…><

使用可能言語: PHP, Ruby, Python, Perlの4つ

とのことで, この中だったら Ruby かなあ(((o(゚▽゚)o)))

なんでPHP辞めることにしたか

スクリーンショット 2014-12-02 20.38.39

true になるのか…

参考) PHPの文字列の評価

  • 文字列は、’.’、’e’、’E’ のどれかが含まれている場合は float (←あまりにアバウトで二度見した)、それ以外は整数として評価されます。
  • 文字列の最初の部分により値が決まります。
  • 文字列が、 有効な数値データから始まる場合、この値が使用されます。(←だから ‘2abcdefg’ == 2 ってなるのか)
  • その他の場合、 値は 0 (ゼロ) となります。
  • 有効な数値データは符号(オプション)の後に、 1 つ以上の数字 (オプションとして小数点を 1 つ含む)、 オプションとして指数部が続きます。指数部は ‘e’ または ‘E’ の後に 1 つ以上の数字が続く形式です。

参考: PHP マニュアル > 言語リファレンス > 型 の『文字列の数値への変換』の節参照

まず文字列と数値が比較できてるあたりで既に驚愕(まあJSとか他の言語でもよくありますけどね) なのですが, さらに扱いがちょっと新しい境地で理解するのは大変そうだ…

(a == b) && (a == c)
で b == c にならないΣ(・□・;)

PHP出来る人はすごく強いし需要があるイメージがある!
でも私のような初心者には難しい言語だと思いました>< あと保守性とか, 実はどこが「ゆるやかな比較」がされているのか分からないし, こういう意図してなかったのに「動いてしまっているからミスに気づかない」とかも怖いし…>< ううう Haskell やりたい…
でもPHP出来る人はすごい需要あるしweb業界では大活躍ってイメージなので.

あと, こういうゆるふわなやつのほうがやりやすい人や有用な場面もあるだろうし,
私はまだまだ浅学なので何もわからないです><

まだこんな超絶小規模なものだったら全然問題無いと思う.
でももっと色々やりたくて複雑になってきたら, 自分のやりやすい言語で開発したほうが良いんだろうなあと思いました.


Madoka Chomado (ちょまど)

千代田まどかです。よく「ちょまど」と呼ばれます。Microsoft 社員。文系出身プログラマ兼マンガ家です。

(7) Comments

  1. […] [PHP] Twitter 天気予報 bot を作った [Yahoo! Weather API] | @chomado ちょまど帳 Twitter OAuth 周りは twitteroauth というライブラリ( https://github.com/abraham/twitteroauth )にて。 bot.php bot本体のメインのファイル […]

  2. […] [PHP] Twitter 天気予報 bot を作った [Yahoo! Weather API] | @chomado ちょまど帳 Twitter OAuth 周りは twitteroauth というライブラリ( https://github.com/abraham/twitteroauth )にて。 bot.php bot本体のメインのファイル […]

  3. nori says:

    PHPごとき1言語で人生語る人間の言うこと真に受けないほうがいいと思いますがね

  4. 言語を比較することに意味はあるのか? says:

    例えば日本語と英語を比較して単語数がぁ~とか
    漢字がぁ~とか言うのと同じで言語同士を比較する事に
    意味があるように思えない。

    それぞれの言語にはそれぞれのお国柄(成り立ち)が
    あるのだから。

    使いたい言語をその土地土地(鯖やシチュエーション)で
    使い分ければいいと思います。

    1. コメントありがとうございます!

      > 言語を比較することに意味はあるのか?
      > 言語同士を比較する事に意味があるように思えない。
      比較すること自体には意味はあると思います. 知識が深まりますし, なにより面白い(interesting)です.
      それぞれが, 何かの分野に特化していたり, それぞれの長所を持っていて, とても良いと思います. それらを比べてそれぞれの特徴を掴むことが楽しいと感じます.
      とくに Bruce A. Tate (著), まつもとゆきひろ (監訳) の 『7つの言語 7つの世界』という, 異なる言語が出てくる有名な本があります, この本はとても面白いし, 私はこれで異なる言語間の違いに興味を持ちました. ぜひ.

      > 使いたい言語をその土地土地(鯖やシチュエーション)で使い分ければいいと思います。
      全く同意権です.
      その使い分けのためにも比較は大切な役割を果たすと考えていました

  5. […] chomado_bot です. 現在の主な機能は2つあり, * 呟きリストからランダムに1つ呟くのと, * 現在の天気 & 明日の天気予報を取得し, 呟く機能です. コードは github にあげています.(続きを読む) […]

  6. gkrsnama says:

    言語ってのは、どれもしくみ・からくりです。適材適所選べばいい。

    いままでJAVA勉強してきて、PHPに移ったら、いきなりデータベースサーバからWEBサーバからIDEからインストールされてしまって、道具がすべて揃って、仰天してます。コードもHTMLにちょいと書いておけば動作する(らしい)!クラスだの定義だの何のってなしでも。

    Webやるのに、JAVAからはじめるのははるかに遠い道のりで、推薦できませんねえ(しみじみ)。Javaは一応何でもできる、高速実行環境って言われてるんですが。

    変数の取り扱いが変(勝手にキャストがかかる=Javaではキャストはなるだけ使ってはならない劇薬とされてるみたいですよ。)なのは、プログラマががんばるしかないですね。整数を文字として扱ってほしかったら、頭にマーク入れるとかね。後から除外するコードが必要なんで、余計な負担バグの元ですが。

gkrsnama へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です