1221bot講習会

1,138 views

Published on

study of twitter bot.

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,138
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

1221bot講習会

  1. 1. twitter bot 講習会
  2. 2. 講師紹介 <ul><li>小林佑輔(KOBA) 上野研究室 4年 </li></ul><ul><li>卒研はフィールドワーク系 </li></ul><ul><li>twitter id:KOBA5884 </li></ul><ul><li>2008/6/12 twitterをはじめる </li></ul>
  3. 3. 【出典】「機械はどれだけ人間に近づけるのか」第2回チームラボアルゴリズムコンテストより http://www.myopenarchive.org/documents/view/440
  4. 4. <ul><li>2009 年 5 月:「あ、 twitter の bot 作りてぇ。」 </li></ul><ul><li>6 月: bot 開発関連のサイトを漁り始める </li></ul><ul><li>7 月: KOBA5884_bot の原型が完成 </li></ul>
  5. 5. @KOBA5884_bot <ul><li>定時で独り言をつぶやく。(5回/ h ) </li></ul><ul><li>話しかけると、適当に返事を返す。 </li></ul><ul><li>お願いすると歌う。寝ろと命令すると寝る。 </li></ul><ul><li>メモ機能(特定のつぶやきを記録&再送) </li></ul>
  6. 6. 本日の目標 <ul><li>botの開発環境を整えよう </li></ul><ul><li>botに何か喋らせてみよう </li></ul><ul><li>話しかけると反応するようにしよう </li></ul>
  7. 7. bot の開発環境を整えよう <ul><li>bot 用のアカウントを作ろう。 </li></ul><ul><li>今回は PHP を使って開発します。 -> xampp を使ってみよう </li></ul>
  8. 8. bot 用アカウントの作成 http://www.lifehacker.jp/2009/08/twittergmail.html Gmail では、 メールアカウント名に「 . (ピリオド)」を追加 することができ、 かつ これらのアカウントは同じアカウントで受信 さ れるようになっています。 [email_address] [email_address] m [email_address] com 本アド 偽装アド 本アドにメールが届く
  9. 9. 今回は日本語推奨 半角英数字 「いつもの」はダメ!絶対!
  10. 10. phpとは <ul><li>動的にwebページを生成する webサーバの拡張機能のひとつ サーバーサイドプログラミングってヤツです。 </li></ul><ul><li>webサーバに置かないと動作しない ->ローカル環境で動作させる環境を作ろう </li></ul>
  11. 11. xampp を使おう <ul><li>xamppのダウンロード&インストール ダウンロード: http://bit.ly/JA5bX インストール: http://bit.ly/651sFF </li></ul><ul><li>サンプルファイルのダウンロード ダウンロード: http://bit.ly/6mtZxe </li></ul><ul><li>サンプルファイルの設置 xampplite -> htdocs -> twitterbot </li></ul>
  12. 12. bot に何か喋らせてみよう <ul><li>決まった台詞を喋らせる </li></ul><ul><li>TwitterAPIについて(POST) </li></ul><ul><li>用意した台詞をランダムで喋らせる </li></ul>
  13. 14. Lesson 1
  14. 15. 【出典】 PHPでTwitterに投稿 - HIRACCHI H.D. http://d.hatena.ne.jp/hirataka 522/20080126/1201300282 <?php $username = ”your username” ; $password = ”your password” ; $params = &quot;status=&quot;. rawurlencode( ”message” ); $url = &quot; http://twitter.com/statuses/update.xml? &quot;; $result = file_get_contents($url.$params , false, stream_context_create(array( &quot;http&quot; => array( &quot;method&quot; => &quot; POST &quot;, &quot;header&quot; => &quot;Authorization: Basic &quot;. base64_encode($username. &quot;:&quot;. $password) ) ))); ?>
  15. 16. 決まった台詞を喋らせる $username = your username ; $password = your password ; $params = &quot;status=&quot;. rawurlencode( message ); とりあえず、ここだけいじればOK
  16. 17. 決まった台詞を喋らせる $username = ”KOBA5884_bot” ; $password = ”************” ; $params = &quot;status=&quot;. rawurlencode( “ メッセージ” );
  17. 18. 決まった台詞を喋らせる $username = ”your username” ; $password = ”your password” ; $mes = “ メッセージ” ; $params = &quot;status=&quot;. rawurlencode( $mes );
  18. 19. 【オマケ】投稿時のおまじない http://kuroutan.blog.shinobi.jp/Entry/3/ PHP とかをゆるりとべんきょうする twitter bot をとりあえず作ってみる (1) $url = &quot; http://twitter.com/statuses/update.xml? &quot;; $result = file_get_contents($url.$params , false, stream_context_create(array( &quot;http&quot; => array( &quot;method&quot; => &quot;POST&quot;, &quot;header&quot; => &quot;Authorization: Basic &quot;. base64_encode($username. &quot;:&quot;. $password) ) ))); 【参考サイト】
  19. 20. 鯖 php twitter API GETの要求/POST GET
  20. 21. Lesson 2
  21. 22. 用意した台詞をランダムで喋らせる $username = your username ; $password = your password ; $mes[] = “ メッセージ 1” ; $mes[] = “ メッセージ 2” ; $mes[] = “ メッセージ 3” ; $mes = $mes[mt_rand(0,count($mes)-1)]; $params = &quot;status=&quot;. rawurlencode( $mes );
  22. 23. 用意した台詞をランダムで喋らせる $username = your username ; $password = your password ; $mes[0] = “ メッセージ 1” ; $mes[1] = “ メッセージ 2” ; $mes[2] = “ メッセージ 3” ; $mes = $mes[mt_rand(0,count($mes)-1)] $params = &quot;status=&quot;. rawurlencode( $mes ); 配列の個数を数える ( この場合は 3 つ )
  23. 24. 用意した台詞をランダムで喋らせる $username = your username ; $password = your password ; $mes = array( “ メッセージ 1”,“ メッセージ 2”,“ メッセージ 3”, ); $mes = $mes[mt_rand(0,count($mes)-1)] $params = &quot;status=&quot;. rawurlencode( $mes ); 配列
  24. 25. 用意した台詞をランダムで喋らせる $username = your username ; $password = your password ; $mes = array( “ メッセージ 1”, “ メッセージ 2”, “ メッセージ 3”, ); $mes = $mes[mt_rand(0,count($mes)-1)] $params = &quot;status=&quot;. rawurlencode( $mes );
  25. 26. 用意した台詞をランダムで喋らせる $username = your username ; $password = your password ; $mes = file(“ mes.dat ”); $mes = $mes[mt_rand(0,count($mes)-1)] $params = &quot;status=&quot;. rawurlencode( $mes ); mes.dat メッセージ 1 メッセージ 2 メッセージ 3 ※ 改行毎に1要素扱い->
  26. 27. 話しかけると反応するようにしよう <ul><li>TwitterAPIについて(GET) </li></ul><ul><li>話しかけてきた人にお返事 (reply) させる </li></ul><ul><li>「どの発言に対する返事か」をわかりやすくする </li></ul><ul><li>しつこくお返事させないためには? </li></ul>
  27. 28. Lesson 3
  28. 29. http://twitter.com/statuses/mentions.xml
  29. 31. GET で得られる主な要素 <ul><li>id twitter全体での発言の通し番号 </li></ul><ul><li>text 発言の内容 </li></ul><ul><li>name ユーザー名 (KOBA) </li></ul><ul><li>screen_name ユーザーid(@KOBA5884) </li></ul>
  30. 33. id:6646318098 id:6646339011 id:6646347184 id:6646395413 KOBA5884_bot : KOBA5884_bot 428bot_2 : 小岩井よつば 2 号
  31. 34. @ + screen_name + 台詞 $mes =
  32. 35. 取得時のおまじない $replyurl = &quot; http://twitter.com/statuses/mentions.xml?count=1 &quot; ; $result = file_get_contents($replyurl , false, stream_context_create(array( &quot;http&quot; => array( &quot;method&quot; => &quot; GET &quot;, &quot;header&quot; => &quot;Authorization: Basic &quot;. base64_encode($username. &quot;:&quot;. $password) ) )));
  33. 36. 鯖 php twitter API GETの要求/POST GET
  34. 37. ↑ $result の中身 $result をソース表示してみた->
  35. 38. $id = $xml->status->id; $name = $xml->status->user->name; $screen_name = $xml->status->user->screen_name; $text = $xml->status->text; $xml = simplexml_load_string($result); 各要素を変数に突っ込んで扱いやすくする 文字列をオブジェクトとして扱うようにする
  36. 39. 返信用メッセージの生成 $mes = array( “ メッセージ 1”,“ メッセージ 2”,“ メッセージ 3”, ); $mes = $mes[mt_rand(0,count($mes)-1)]; $mes = &quot;@&quot; . $screen_name . &quot; &quot; . $mes ; 空白
  37. 40. どの発言に返信したかをわかりやすくしたい ← コレを付けたい ← 現状だとこんな感じ
  38. 41. どの発言に返信したかをわかりやすくしたい id:6646318098 id:6646339011 id:6646347184 id:6646395413
  39. 42. どの発言に返信したかをわかりやすくしたい $params = &quot;status=&quot;. rawurlencode( $mes ) .&quot;&in_reply_to_status_id=&quot;. $id ; $params = &quot;status=&quot;. rawurlencode( $mes ); 書き込み id の情報を付加してあげる
  40. 43. おまけ(Lesson 4) 特定のユーザーに対して特殊な反応を返す if($screen_name == &quot; 反応させたいユーザー id&quot;){ [ 特定のユーザーに対する処理 ] }else{ [ それ以外のユーザーに対する処理 ] }
  41. 44. おまけ (Lesson 5) 特定の単語に対して特殊な反応を返す <ul><li>if(preg_match( &quot;/ 反応させたいワード /&quot;, $text)){ </li></ul><ul><ul><li>[ 特定のワードに対する処理 ] </li></ul></ul><ul><li>}else{ </li></ul><ul><ul><li>[ それ以外のワードに対する処理 ] </li></ul></ul><ul><li>} </li></ul>
  42. 45. おまけ (Lesson 5) 特定の単語に対して特殊な反応を返す(一例) <ul><li>if(preg_match( &quot;/ おはよ /&quot;, $text)){ </li></ul><ul><ul><li>文中に「 おはよ 」が入っていれば処理を実行 例:「 おはよ う」「 おはよ ー」「皆様 おはよ うございます」 </li></ul></ul><ul><li>}else if(preg_match( &quot;/ おやすみ | 寝る /&quot;, $text)){ </li></ul><ul><ul><li>文中に「 おやすみ 」 または 「 寝る 」が入っていれば処理を実行 </li></ul></ul><ul><ul><li>例:「 おやすみ なさい」「 もう寝る 」 </li></ul></ul><ul><li>}else if(preg_match( &quot;/( メモ | memo )( : | : )/&quot;, $text)){ </li></ul><ul><ul><li>文中に以下のいずれかが入っていれば処理を実行 </li></ul></ul><ul><ul><li>「 メモ : 」「 メモ : 」「 memo : 」「 memo : 」 </li></ul></ul><ul><li>} </li></ul>
  43. 47. Lesson 6
  44. 48. 「しつこくお返事」…? <ul><li>現状だと、 最新1件の reply に対して 返信する </li></ul><ul><li>たとえ既に返信済であっても。 </li></ul>
  45. 49. id:6774038773
  46. 50. しつこくお返事させないために <ul><li>一番最後に返信した相手の発言を覚えさせれば…! </li></ul><ul><li>そんなわけで、ここでも $id を使います。 </li></ul>
  47. 51. latest.dat 0( 初期値 ) if( $latest == $id ){ [ 投稿の処理を行わない ] }else{ [ 1.投稿処理 ] [ 2. latest.dat の書き換え ] } 6774038773 $id    = [ 自分宛の呟き最新1件の id] $latest = [ 前回返信した呟きの id] # もし、それらが同一なら # 違った場合 別ファイルに 記憶させておく
  48. 52. tips: 外部ファイルの読み書き $fp = fopen(&quot; latest.dat &quot;, ' r '); $latest = fgets ($fp); fclose($fp); $fp = fopen(&quot; latest.dat &quot;, ' w '); fputs ($fp, $id ); fclose($fp); ファイルの内容を読み込む ファイルに値を書き込む
  49. 53. おまけ 【定期実行させるための環境】 1. php が動作する 2. cron が書き換え出来る サーバー上のスクリプトを自動実行 させるためのデーモン(常駐)プロセス
  50. 54. 鯖 php twitter API GETの要求/POST GET
  51. 55. 鯖 php twitter API GETの要求/POST GET cron で実行させる 外部からアクセス
  52. 56. 自動実行に関する参考サイト 【 cron が使える環境なら】  crontabの書き方 — server-memo.net http://www.server-memo.net/tip s/crontab.html 【cronが使えない環境なら】 cron タスクの設定 【 webcron の利用】    http://drupal.jp/drupal5/guide/cron_task_webcron
  53. 57. Let’s Try!!

×