できること

第23回「Raspberry PiからTwitterへ情報発信!(1) Twitter API編」

raspberrypi23_main
ラズベリーパイとAPIを連携させる電子工作第2弾!
今回からは、TwitterのAPIを使用して、自動で情報をつぶやくツールを作りたいと思います。botのような機能を再現するには、端末を常時起動しておく必要があるので、省電力が魅力のラズベリーパイにぴったり!
最終的には、RSSから更新情報を取得してTwitterでつぶやく、ニュース発信ツールのような形に仕上げたいと考えています。

今回はTwitterのAPIを使って、PHPのプログラムからツイートを投稿に挑戦します。APIを使うだけなら、Windows環境でテストしたものをそのまま移植すればいいはず!……と思いきや、スムーズにいかないのがラズベリーパイですね。笑
相変わらず甘くない!?今回も試行錯誤の電子工作がはじまります!

 

Twitterアプリ利用までの手順

Twitterを利用したアプリの作成には、必要な手順が2つあります。

1. Twitterアカウント作成
2. Twitter アプリを登録

まずは、Twitterアカウントの作成!
既にアカウントをお持ちの方は、そのままアプリ登録に進めます。新規作成する場合は、Twitter公式サイトからアカウントを作成しましょう。

Twitter公式サイト

アカウント登録は、メールアドレスのみで可能ですが、アプリの登録を行うには電話番号での認証が必要となります。SMSを使って認証コードを受信するため、SMSが利用できる電話番号を登録しましょう。

アカウントの準備ができたら、アプリの登録です!

Twitter Application Management

このページからログイン、または、Twitterにログインしている状態でアクセスするだけでもOKです。

raspberrypi23_img01

図1

こちらが初期画面。アプリが登録されている場合は、一覧表示されます。
「Create New App」ボタンをクリックして、アプリを新規作成しましょう!

raspberrypi23_img02

図2

必須入力項目は、アプリケーションの名前、説明文、ウェブサイトのURLの3つです。アプリケーション名は一意である必要があるようです。URLも必須入力となっていますが、Webで公開するわけではないので、とりあえず自分のtwitterページのURLを入力して試したところ……登録できてしまいました!現状、問題はないようですね(2015年5月現在)。
ページの下部に英語の利用規約が記載されているので、規約に同意(「Yes, I agree」にチェックを入れる)して、「Create your Twitter application」ボタンをクリックします。ちなみに、電話番号が登録されていない場合は、ここから先に進めない仕様となっています。

raspberrypi23_img03

図3

このような画面に遷移したら、登録完了!
ここで、「Access level」を確認しておきましょう。今回はツイートの投稿を行うので、「Read and write」になっていればOKです。わたしが試したときは、デフォルトで設定されていました。変更する場合は、「modify app permissions」のリンクをクリック、または、上部のタブから「Permissions」に切り替えると、設定画面が表示されます。

raspberrypi23_img04

図4

次に、「Keys and Access Tokens」タブをクリックします。
APIを使用するために必要なキーが、この画面で確認できます。キーは全部で4種類です。どれも英数字でできたランダム文字列です。

・Consumer key(API Key)
・Consumer secret(API Secret)
・Access Token
・Access Token Secret

「Consumer key」と「Consumer secret」は最初から画面に表示されていますが、「Access Token」と「Access Token Secret」は自分で発行する必要があります。手順は、ページの下部にある「Create my access token」ボタンをクリックするだけ!

raspberrypi23_img05

図5

クリックすると、同じページの「Your Access Token」欄にキー値が追記されます。
これで準備が整いました!それぞれのキー値をメモして、プログラムの作成に取り掛かりましょう!

 

Twitterに投稿!

それでは実際に投稿してみましょう!
認証の部分は、Twitterの公式ページでも紹介されているPHP用のライブラリ「TwitterOAuth」を使用しました。

abraham/twitteroauth · GitHub

この記事では、ver.0.5.3使用しています。バージョンによって、使い方が異なる場合もありますのでご注意ください。

TwitterOauth
公式サイトはこちらです。英語ですが、使い方のドキュメントが用意されています。プログラムへの組み込み方は、冒頭の「Installation」の項で紹介されています。また、今回は投稿を行うので、「POST」の項が参考になります。

Import the TwitterOAuth class.

require "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

ポイントはこの2行。「autoload.php」は、その名の通り、必要なファイルを全て読み込んでくれます。自分の環境に合わせてパスを書き換えましょう。
下記は、固定の文字列をTwitterに投稿するプログラムです。

/var/www/news/tweet.php

<?php
require_once("/var/www/news/twitteroauth/autoload.php");
use Abraham\TwitterOAuth\TwitterOAuth;

//メッセージ作成
$message = 'テスト投稿!';

//認証
$consumerKey       = '★★★★★';
$consumerSecret    = '★★★★★';
$accessToken       = '★★★★★';
$accessTokenSecret = '★★★★★';
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
//投稿
$statues = $connection->post('statuses/update', array('status' => $message));
//結果
if(isset($statues->errors)){
    //エラー発生
    foreach($statues->errors as $err){
        echo '【エラーメッセージ】'.$err->message.PHP_EOL;
    }
}else{
        echo '【投稿完了】'.$statues->text.PHP_EOL;
}

「★★★★★」の部分は、先程取得したTwitterの各キー値と差し替えてください。
投稿が完了した場合は投稿内容を、失敗した場合はエラーメッセージを「echo」で出力しています。
先にWindowsマシンのローカル環境(xampp)からテスト実行してみたところ、無事に投稿されたことが確認できました!
次は、ラズベリーパイから実行!……しようとしたところでトラブル発生!?

 

ラズベリーパイでTwitterOauthを使うときの注意点

raspberrypi23_img06

図6

先程のソースをラズベリーパイから実行しようとすると、コマンドラインに大量のエラーが……!

PHP Notice: Use of undefind cnstant CURLOPT_CAINFO - assumed ‘CURLOPT_CAINFO’ in /var/www/news/twitteroauth/src/TwitterOAuth.php on line 296

このような、定数のundefindエラーがずらっと続いて……

PHP Fatal error: Call to undefind function Abraham\TwitterOAuth\curl_init() in /var/www/news/twitteroauth/src/TwitterOAuth.php on line 340

最後に、関数のundefindエラーが1件出てきて終了。
どちらもTwitterOAuth.phpの中で発生しており、データの送受信に使用している「cURL(カール)」に関するエラーでした。PHPの関数である「curl_init」が見つからないということは、プログラムではなく環境に問題がある……?
調べてみると、ラズベリーパイでcURLを使用するには、「php5-curl」というパッケージを別途インストールする必要があるそうです。(そういえばxamppでcURLを使う環境を整えるためにphp.iniファイルをいじったりしたなぁと、調べながら思い出しました……)

Debian — Details of package php5-curl in sid
CURL は FTP, GOPHER, HTTP サーバからファイルを取得するライブラリです。
PHP (PHP: Hypertext Preprocessor の再帰的頭字語) は広く使われているオープン ソースな汎用スクリプト言語で、特にウェブ開発に適しており、HTML に組み込むこ とができます。

そんなわけで、気を取り直して再挑戦!

インストールコマンド
apt-get install php5-curl

わたしの環境では、このパッケージをインストールするだけでcURLが使えるようになりました。再起動なしで動いてしまったことにちょっとびっくり(自動でやってくれているのでしょうか)。

実行コマンド
php /var/www/news/tweet.php

raspberrypi23_img07

図7

無事に投稿完了!
実際にTwitterを見てみると……

raspberrypi23_img08

図8

きちんと投稿されていました!

ちなみに、同じ文字列を連続で投稿しようとすると、

raspberrypi23_img09

図9

「Status is a duplicate.」というエラーが発生してしまいました。これは、Twitterの仕様によるものです。

Twitterヘルプセンター | ツイートできない
ツイートの投稿時に [既に同じツイートを送信済みです。] というエラーメッセージが表示される場合、最近別のツイートでまったく同じテキストを投稿しているため、次のツイートでは新しい内容を投稿することが推奨されることを示しています。

APIからの投稿に限らず、Twitter側で制限されています。投稿に関する制限は他にもあるので、自動投稿の機能を実装する際には注意が必要ですね!

 

まとめ

ラズベリーパイとTwitterのAPIの連携ができたところで、今回はここまで。
botを作成するサービスは多々ありますが、手元にあるラズベリーパイが勝手につぶやいてくれると思うと面白いですね!手作りの良さをいかして、なにか電子部品も取り付けてみたいところです。温度や湿度など、時間によって変化のある値をつぶやかせると、電子工作ならではのツールになりそうですね!

次回は、Twitterに投稿する中身となる情報を、RSSから取得してみたいと思います。定期的な自動投稿を実現するには、cronの設定や、どこまで投稿したかの管理など、細かな環境整備が必要になります。少しずつ作り込んでいきたいと思います!

アバター画像

プロフィール:プログラミング暦通算4年、最近IT業界に舞い戻ってきたプログラマーです。女子です。

学生ロボコン2017 出場ロボット解剖計画