以下の記事を参考にさせていただき、twitter botのプログラムを勉強したいと思います。
http://d.hatena.ne.jp/tek_koc/20080804/1217822667
[PHPによる誰でも出来る簡単Twitterbotの作り方]
http://d.hatena.ne.jp/hirataka522/20080126/1201300282
[PHPでTwitterに投稿]
ソースを見ていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $url = "http://twitter.com/statuses/update.xml?"; $username = your username; $password = your password; $params = "status=". rawurlencode(message); $result = file_get_contents($url.$params , false, stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ".base64_encode($username. ":". $password) ) ))); ?> |
1行目、「<?php」からスタートしています。ここから13行目の「?>」まで、これがhtml上に埋め込まれて1連のPHPプログラムとして動作することになります。
2行目「$url = "http://twitter.com/statuses/update.xml?";」
ここから「$○○○=×××;」という文が続きますが、これは$○○○という変数に×××という中身をセットするということです。
$urlという変数に「http://twitter.com/statuses/update.xml?」を入れたら何が起こるかというと、「http://twitter.com/statuses/update.xml?」という文字列を使いたいときには今度から「$url」とだけ書けば良いということになります。
このアドレスの意味はこの時点では不明なので、後ほど。
※変数のシステムはどのプログラム言語でも基本のことですが、PHPは型を定義しなくても、代入した値に応じて勝手に変数の型を決定してくれるみたいです。
3行目、4行目も2行目と同じく変数にセットを行っています。
サンプルソースの「your username」、「your password」はそれぞれtwitterの自分のユーザIDとパスワードに置き換えます。
ここで気をつけるのは、それぞれの文字列はさきほどのurlと同じようにダブルクォートで囲む必要があるということです。
これで、「$username」、「$password」にそれぞれユーザIDとパスワードがセットされました。
5行目。「$params = "status=". rawurlencode(message);」です。
サンプルソースの「message」はtwitterに送信するメッセージに置き換えます。
ドットは前後の文字列を連結してくれます。
つまり"status="と「rawurlencode(message)」を連結した文字列を$paramsにセットするということですが、rawurlencode~はダブルクォートで囲まれていませんのでそのまま文字列ではありません。関数です。
関数は、ここでは、「カッコ内(この場合だとmessage)の文字列を使ってなんか変換した値に置き換わる」というイメージでみていくとわかりやすいと思います。(関数の厳密な定義とは異なるので、あくまでイメージです)
rawurlencodeという関数はもともとPHPにあるもので、これはカッコ内の文字列をRFC1738 に基づきURL エンコードした値に置き換えます。
※何故エンコードを行うかというと、ソースの引用元にもあるように、「メッセージにスペース(空白)があると、そこで切れてしまうから」です。どうしてかはとりあえず考える必要はなくて、そういうものだと思っておきます。
蛇足を書けば、空白がなければエンコードしなくていいってことです。つまり自分は絶対空白をメッセージにいれないという場合はrawurlencodeしなくて良いのです。
しかし、エンコードしておけばどっちにも対応できるのでここではエンコードします。
そんなわけで、最終的に$paramsには、
「status=[メッセージをRFC1738 に基づきURL エンコードした文字列]」がセットされました。
次は7行目~12行目ですが、これらはまとめて1文のプログラムです。
いまさらですがプログラムの1文の終わりはセミコロンが示しています。そんなわけでちょっと長めのこの文を見ていきます。
$result = file_get_contents($url.$params , false, stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ".base64_encode($username. ":". $password) ) ))); |
まずはじめに「$result =」とあるので、これも変数$resultに、なにか値をセットしているんだなーということがわかります。
次にfile_get_contentsとありますがこれは関数です。カッコ内に引数としてファイル名、インクルードファイルの検索の有無、コンテキストリソースをコンマで区切ってセットすると、指定したファイルを指定した形式で呼び出して、ファイルの内容を文字列に読み込むという関数です。
ここでは、
ファイル名=「$url.$params」、
インクルードファイル検索=「false」、
コンテキストリソース=「stream_context_create(array("http" => array( "method" => "POST", "header" => "Authorization: Basic ". base64_encode($username. ":".$password))))」
となります。
つまりこれらの情報をもとにデータを呼び出し、$resultにセットされるということになります。
ファイル名「$url.$params」は先ほど設定した$urlと$paramsを連結したものなので、具体的には「http://twitter.com/statuses/update.xml?status=[messageをRFC1738 に基づきURL エンコードした文字列]」ですね。
インクルードファイルについてはここでは気にしなくていいです。falseなので検索しません。
コンテキストリソースを見ていきます。
stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ". base64_encode($username. ":". $password)))) |
stream_context_createは関数です。これはストリームコンテキストを作成する関数だそうです。まんまです。
正直ぱっとみてこれを理解するのはむずかしいんですが、コンテキストとはこの場合、プログラムに与える条件のことで、その条件でプログラムを実行しろという命令をします。
この場合、「"http" => array(~)」はHTTPコンテキストを~の条件で実行するということで、その内訳が
「メソッドはPOST」、「"Authorization: Basic ". base64_encode($username. ":".$password)というヘッダを付加する」となります。
base64_encodeはbase64形式にエンコードする関数なので、その結果をドットで連結して、headerは「Authorization: Basic["ユーザID:パスワード"をbase64形式にエンコードした文字列]」になります。
※methodとかheaderはHTTPコンテキストを実行するためにもともと持つ設定値で、他にもいろいろあるんですが今回はmethodとheaderだけ設定しています。
※arrayは配列を示す構文で、arrayのカッコ内のコンマで区切った複数の値を、ひとつのまとまりとして扱っています。
最終的に7~12行目は、
「http://twitter.com/statuses/update.xml?status=[messageをRFC1738 に基づきURL エンコードした文字列]」で指定されるファイルを、メソッドはPOSTで、「Authorization: Basic["ユーザID:パスワード"をbase64形式にエンコードした文字列]」をヘッダに付加して実行する。
ということになります。
なんだかこんがらがりそうですが、とりあえずこれが一通りのソースの流れです。