Twitterのbotを作る #2「画像もアップできた」

2015年4月7日

サービス プログラミング 特集

前回の記事で、bot作成には成功しているのですが、 botでブログを公開していると、せっかくアイキャッチをつけて、1記事1画像にしているのに、twitterでツイートが文字よURLだけなんで、魅力半減に思えて仕方がない。 どうせbotでアップするのであれば、アイキャッチ画像も一緒にアップしたいと思い、色々調べてみました。

mysqlでアイキャッチの画像ファイルを取得する

wordpressの関数を用いてアイキャッチのファイルパスを取得するのは簡単なんですが、botシステムは、wordpressの外部で構築しているので、mysqlでコマンドを叩いて直接取得するしかないので、データベースを調べてみた。

1.記事の取得※ランダムで1記事(前回記事参照)

$mysqli->set_charset("utf8"); $result = $mysqli->query('select ID,post_title from news_posts where post_status="publish" and post_type="post" ORDER BY RAND() limit 1'); $row = $result->fetch_assoc(); $row['ID'] 、記事IDが取得できる。

2.記事IDからmeta_idを取得(TABLE : news_postmeta)

$result2 = $mysqli->query("select meta_value from news_postmeta where post_id=".$row['ID']." AND meta_key='_thumbnail_id'"); $row2 = $result2->fetch_assoc(); $row2['meta_value'] 、media-IDが取得できます。

3.media-IDから、ファイルパスを取得

$result3 = $mysqli->query("select meta_value from news_postmeta where post_id=".$row2['meta_value']." AND meta_key='_wp_attached_file'"); $row3 = $result3->fetch_assoc(); $row3['meta_value'] 、メディアフォルダ内のファイルパスが取得できる。

4.URLに変換

$img_url = "http://wordpress.ideacompo.com/wp-content/uploads/".$row3['meta_value']; wordpressの表示URLになるように、ドメインなどを付けてURLに成形する。

5.アップロード処理

# 前回コード $statues = $connection->post("statuses/update", array("status" => $message)); # 書き直しコード $media1 = $connection->upload('media/upload', array('media' => $img_url)); $parameters = array( 'status' => $message, 'media_ids' => implode(',', array($media1->media_id_string)), ); $result = $connection->post('statuses/update', $parameters); 画像はローカルに保存されている画像でなくても、URLを記入しても送信できるようなので、 今回はローカルPATHではなく、URLをサポートしてみた。 この方が汎用性が高いからね。 $media1を配列に入れているのは、複数の画像がアップできるようだ。 でも、これで、画像をアップできるようになったので、色々と面白いことができる予定。

Issue

画像を縮小してサムネイルレベルにした方がいい。 wordpressのアイキャッチはテンプレートにもよるが、画像の一部しか表示されないが、twitterにアップするとtwitpicにアップされ、それが表示されるようなので、画像が全領域表示されるようだ。 アイキャッチと少し印象が変わる可能性があるので、できるのであれば、PHP側でimageMagickなどを使って、縮小 and 切り抜きを行うともう少し便利になるかもしれないが、画像作成時にコントロールできるという意見もあるので、現時点ではこのままにしておく。

ライブラリ参考

https://twitteroauth.com/