
Twitter APIで世の中の声を拾おう!
世の中の声に耳を傾けて、商品開発やサービスをより良くする。様々な企業で行われているマーケティング活動です。
「世の中の声に耳を傾ける」と書くと簡単ですが、実際にはモニター調査や、アンケート調査などで出来るだけ本当のお客様の声を聴く必要があります。
しかし、アンケート調査会社に依頼するとサンプル数が増えれば、それだけ費用も掛かってしまうため悩ましいところです。
世の中にあるSNS投稿をマーケティングに生かそう
SNS上の様々な人からの投稿に耳を傾けマーケティングに生かす、という考え方が「ソーシャルリスニング」です。モニターやアンケートと異なり投稿者が自発的に感想を述べる形になるので、より自然な反応を取得できる利点があります。ただ、世の中の膨大な投稿をどのように取得するか……。
そこで、今回は多くのユーザが使用しているSNSサービスtwitterから「ソーシャルリスニング」のデータを取得するPHPスクリプトを作って、ソーシャルリスニングっぽいことをします。
(きちんとマーケティングに生かすデータにするには、それぞれの投稿を「ネガティブ」「ポジティブ」などに分け、内容を精査する必要がありますが、今回はデータを集めて眺めるまでの記事にしますよー。)
今回のお題は「ポケットティッシュ」
個人的にポケットティッシュのサイトを運営しており、日頃からポケットティッシュって世の中の人にどう思われているんだろ?という疑問を持っていました。
今回「ソーシャルリスニング」っぽいことをして、その疑問をちょっとでも氷解したいと思います。
投稿を集めるために必要な情報
調査したいキーワードを含む投稿を集めるツールを作ります。
まず、ご準備いただくのはこちら
- Twitterアカウント
- PHPが動くサーバ
- 集めたいキーワード
今回は
- Twitterアカウント:ポケットティッシュサイトで使用している[@poke_q]
- PHPが動くサーバ:ポケットティッシュサイトのサーバ(GMOのVPS Conoha)
を使用し、「ポケットティッシュ」を含むツイートを収集します。
Twitter Developersよりアプリケーションを登録する
Twitter APIを使用するにはTwitterアカウントでアプリケーションを登録して認証のためのキー(公開キーと秘密キー)を取得する必要があります。下記リンク のTwitter Developersサイトで用意したTwitterアカウントにてサインインをしてください
- Twitter Developers
https://dev.twitter.com/
ちょっとわかりづらいのですが、下記の画面を参考にしてサイトフッター部メニューの[TOOLS]-[Manage Your App]をクリックしてください。
次の画面で表示される[Create New App]ボタンを推してください。
- 入力項目
項目名 入力する内容 今回入力した内容 Name アプリケーションの名前 Search Pocket Tissue Words Description 説明 I am searching “Pocket Tissue Words” at Twitter. Website アプリケーションを動かすトップURL https://pocket-tissue.com/ Callback URL コールバックURL アプリ認証後に表示するURLだが、今回は検索結果を取得するだけでアプリ認証がないため入力なし Developer Agreement Yes, I agree(同意)するか? もちろん同意するのでチェックする
こんな感じで入力したら、[Create your Twitter Appcation]ボタンを押す。
これで、アプリケーションを登録が完了します。
アプリケーションの設定
登録が完了すると下記のような画面になります。
赤丸で囲んだ部分がタブになっており、各種設定や認証キーの確認ができます。
- Details
アプリケーションの詳細確認 - Settings
作成時に入力した設定値の変更や作成者(組織)の入力、アイコンの設定 - Keys and Access Tokens
認証キー(公開キー・秘密キー)の確認・再発行
アクセストークンの発行・確認 - Permissions
アプリケーションの実行権限の設定
[Keys and Access Tokens]タブを選択すると、アプリケーションの認証キー(公開キー・秘密キー)が表示されます。(モザイク処理されている部分にランダムな文字列で構成された認証キーが表示されています。)
ちなみに認証キーの下にある項目[Access Lavel]ですが、[Permissions]タブにてアプリケーションが実行できる操作を限定しています。
「読み込みのみ許可」「読み書き許可」「読み書き、ダイレクトメッセージ送信許可」の3レベルから選択でき、今回のアプリケーションは検索結果の読み込みのみですので読み込みのみ許可の[Read only]に設定されています。
認証キーとアクセストークン
アプリケーションでTwitter APIを使用するためには認証キーとアクセストークンが必要となります。
認証キーはこのアプリケーションをTwitterが認証し識別するためのキーとなります。
では、アクセストークンは何のために必要なの?
例えば、いろいろなユーザーが自分のアカウントでTwitterに読み込みや書き込みをするアプリケーションを作る場合、アプリケーションは使用するユーザのアカウントとパスワードを取得する必要があります。
しかし、ユーザーとしては大切なアカウントとパスワードを教えたくない。
そのため、アプリケーションを使う際に「このアプリケーションは書き込みをしますよ」という認証画面を表示し、同意するとユーザーのアカウントとパスワードではなく、「書き込みしていいですよ」という「アクセストークン」をユーザー側からアプリケーションに渡します。
アプリケーションはその「アクセストークン」を使用して書き込みをおこなうことができるという仕組みになっています。
これなら、大切なアカウントとパスワードを渡すことなく、アプリケーションのサービスを受けることができるようになります。
「アクセストークン」はユーザーがアプリケーションの操作に与える許可証のようなものです。
いろいろなユーザーが使用するアプリケーションの場合、このアクセストークンをユーザーから取得するための作りこみが必要となるのですが、今回のアプリケーションは@poke_qユーザーを使って検索した結果を取得するだけですので、@poke_qのアクセストークンだけわかれば問題ありません。
その場合は、プログラミングの必要はなく[Keys and Access Tokens]タブ画面下の方に[Token Action]-[Create my access token]ボタンを押すだけで、アクセストークンを取得することができます。
さあ、ツールを作ろう!
今回は「ポケットティッシュ」を含むツイートを100個表示するツールをPHPで作成していきます。
Twitterの検索APIを使用して、「ポケットティッシュ」を含むツイートを集めて表示させます。
検索APIのResource URLは
https://api.twitter.com/1.1/search/tweets.jsonです。
下記のリファレンスにパラメータなどの詳細が掲載されています。
https://dev.twitter.com/rest/reference/get/search/tweets
検索するキーワードは「ポケットティッシュ」、取得数は100ですので
https://api.twitter.com/1.1/search/tweets.json?q=ポケットティッシュ&count=100
なのですが、そのままリクエストしても取得はできません。TwitterAPIを利用するにはOAUTH認証をする必要があります。
OAUTH認証からツイートのの流れは下記の通りです。
1:OAuth1.0認証の署名を生成する
2:1で生成した署名を含む認証ヘッダを生成する
3:cURLでリクエストURL・認証ヘッダを送信する
4:レスポンスを表示する
OAUTH認証の署名を生成しよう
キーとデータを作成しHMAC-SHA1方式のハッシュ値に変換し、base64エンコードをして署名を作ります。
キー
Twitterアプリケーションを登録した際に取得した「認証のための秘密キー(Consumer Secret (API Secret))」と「アクセス秘密トークン(Access Token Secret)」をURLエンコードして「&」でつなげた文字列です。
/***** OAuth1.0認証の署名生成 *****/
// キー部分の作成
$oauth_signature_key = rawurlencode(認証のための秘密キー) . '&' . rawurlencode(アクセス秘密トークン) ;
データ
まず、「パラメータ名=値」をアルファベット順で「&」で接続した文字列を作ります。
パラメータ名 | 値内容 | 今回入力した内容 |
---|---|---|
count | 取得するツイート数(APIのパラメータ) | 100 |
oauth_consumer_key | 認証のための公開キー(Consumer Key(API Key)) | Twitterアプリケーションを登録した際に取得した値 |
oauth_nonce | ランダムな文字列 | microtime()で取得したをURLエンコードした文字列を流用 |
oauth_signature_method | データの変換方式の指定(HMAC-SHA1) | HMAC-SHA1 |
oauth_timestamp | リクエスト作成時の時間(タイムアウトの起点) | time()で取得した値 |
oauth_token | アクセストークン | Twitterアプリケーションを登録した際に取得した値 |
oauth_version | 使用するoauthのバージョン | 1.0 |
q | 検索キーワード(APIのパラメータ) | 「ポケットティッシュ」をURLエンコードした値 |
// パラメータの生成・編集
$oauth_nonce = microtime();
$oauth_timestamp = time();
$oauth_signature_param = 'count=' . 取得するツイート数(APIのパラメータ) .
'&oauth_consumer_key=' . 認証のための公開キー(Consumer Key(API Key)) .
'&oauth_nonce='.ランダムな文字列 .
'&oauth_signature_method='. データの変換方式の指定(HMAC-SHA1) .
'&oauth_timestamp=' . リクエスト作成時の時間(タイムアウトの起点) .
'&oauth_token=' . アクセストークン .
'&oauth_version=' . 使用するoauthのバージョン .
'&q=' . 検索キーワード(APIのパラメータ);
リクエストメソッド(今回は検索結果の取得なので[GET])とTwitter APIのURLならびに先ほど作ったパラメータ文字列をそれぞれURLエンコードしたものを「&」で接続したらデータの完成です。
// データ部分の作成
$oauth_signature_date = rawurlencode(リクエストメソッド) . '&' . rawurlencode(Twitter APIのURL) . '&' . rawurlencode(パラメータ文字列);
署名の生成
下記のソースのように、データとキーを使ってHMAC-SHA1方式のハッシュ値に変換しbase64エンコードしたら、OAuth1.0認証の署名の完成になります。
// 上記のデータとキーを使ってHMAC-SHA1方式のハッシュ値に変換
$oauth_signature_hash = hash_hmac( 'sha1' , データ , キー , TRUE ) ;
// base64エンコードしてOAuth1.0認証の署名作成
$oauth_signature = base64_encode( $oauth_signature_hash );
Authorizationヘッダーを生成しよう
署名作成時に使ったパラメータをつかってAuthorizationヘッダーを生成します。
先頭に「Authorization: OAuth 」をつけて各パラメータをURLエンコードして「,」で接続して、最後に「oauth_signature=URLエンコードした署名」を接続した文字列を作ります。cURLで送信する際にarrayで送信するので配列に文字列を入れます。
/***** Authorizationヘッダーの作成 *****/
$req_oauth_header = array("Authorization: OAuth " . 'count=' . rawurlencode(取得するツイート数(APIのパラメータ)) .
',oauth_consumer_key=' . rawurlencode(認証のための公開キー(Consumer Key(API Key))) .
',oauth_nonce='.str_replace(" ","+",ランダムな文字列) .
',oauth_signature_method='. rawurlencode(データの変換方式の指定(HMAC-SHA1)) .
',oauth_timestamp=' . rawurlencode(リクエスト作成時の時間(タイムアウトの起点)) .
',oauth_token=' . rawurlencode(アクセストークン) .
',oauth_version=' . rawurlencode(使用するoauthのバージョン) .
',q=' . rawurlencode(検索キーワード(APIのパラメータ)) .
',oauth_signature='.rawurlencode(生成したOAUTH認証の署名));
リクエストURLを生成しよう
各APIのパラメータをURLエンコードして文字列として生成します。
/***** リクエストURLの作成 *****/
$TWITTER_API_URL .= '?q=' . rawurlencode(検索キーワード(APIのパラメータ)) . '&count=' . rawurlencode(取得するツイート数(APIのパラメータ));
cURLによるリクエスト実行しよう
下記のソースでcURLをつかってリクエストを実行します。
/***** cURLによるリクエスト実行 *****/
// セッション初期化
$curl = curl_init() ;
// オプション設定
curl_setopt( $curl , CURLOPT_URL , リクエストURL ) ; // リクエストURL
curl_setopt( $curl , CURLOPT_HEADER, false ) ; // ヘッダ情報の受信なし
curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $REQUEST_METHOD ) ; // リクエストメソッド設定
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書検証なし
curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す
curl_setopt( $curl , CURLOPT_HTTPHEADER , Authorizationヘッダー ) ; // リクエストヘッダー設定
curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数設定
// セッション実行
$res_str = curl_exec( $curl ) ;
// セッション終了
curl_close( $curl ) ;
リクエスト実行結果を取得して表示しよう
curl_execコマンドで受け取ったjsonデータをデコードして配列からツイートと投稿日時を取出し表示します。
/***** リクエスト実行結果取得 *****/
$res_str_arr = json_decode($res_str, ture) ; // JSONを変換
/***** 検索結果表示 *****/
foreach ($res_str_arr['statuses'] as $twit_result){
$twit_content = $twit_result['text'];
$twit_time = date("Y-m-d H:i:s",strtotime($twit_result['created_at']));
echo $twit_content." | ".$twit_time ;
echo "<br />" ;
}
PHPソース全体はこちら
いままでのPHPソースは下記のとおりです。
ソース内の$OAUTH_CONSUMER_KEY・$OAUTH_SECRET・$OAUTH_TOKEN・$OAUTH_TOKEN_SECRETには「アプリケーションの設定」で取得した「認証キーとアクセストークン」を設定してください。
世の中の「ポケットティッシュ」を聴こう!
作ったツールで「ポケットティッシュ」を含むツイートを集めてみました。
結構な人がポケットティッシュを入れたまま洗濯をして絶望を感じしているようですよ。
なお、ポケットティッシュまみれになった洗濯物は乾燥機にかけると取れやすくなります。
こんな感じで世の中の声をマーケティングに生かしてみるのかいかがでしょうか?
ちょっと、面白いですよー。
参考サイト
・OAuth1.0の署名(Signature)を作成する方法
https://syncer.jp/how-to-make-signature-of-oauth-1
・Twitter APIの使い方まとめ
https://syncer.jp/twitter-api-matome
・OAuth1.0:エンドポイント仕様 – Yahoo!デベロッパーネットワーク
https://developer.yahoo.co.jp/other/oauth/endpoint.html
卒業制作でクライアントを製作中でして、もしよろしければ
GMOのVPS Conohaを使用した際のプランやイメージ等の内容を教えていただけませんか?
すみません、一点だけ質問をさせてください。。。
この記事の最後に掲載いただいている、「PHPソース全体」をコピーし
認証キー等、必要な箇所のみ変更をしアップロードしました。
結果、ツイート表示はされるのですが、暫く立つと(日付が変わると?)消えてしまいます。
何か、考えれられる問題はございますでしょうか。
// 1リクエストで取得するツイート数(最大100個まで)は、1件です。
他は、/***** 検索結果表示 *****/部分のhtmlを少し編集した程度です。
知識不足でご迷惑をおかけしてしまい申し訳ございませんが
どんな事でも良いので、ご教授いただけますと幸いです。
よろしくお願いします。