1=encoding utf8 2 3=head1 NAME 4 5WWW::Mixi::Cookbook - WWW::Mixiのクックブック 6 7=head1 DESCRIPTION 8 9このドキュメントにはWWW::Mixiの典型的な使い方を示すいくつかのサンプルが入っています。 10 11=head1 mixiからのデータ取得 12 13WWW::Mixiモジュールには、ログイン用のloginメソッドと、それから1メソッドで直接コメントなどを取得できるデータ取得メソッドがあります。 14これらを使うと、mixiへのアクセスは非常に簡単です。 15 16=head2 ログイン 17 18mixiへのログインは、loginコマンド一つで完了します。 19ログイン後には、LWP::UserAgentスタイルでのRequestメソッドやget、postメソッドでのmixiアクセスも、mixiからのデータ取得メソッドでのデータ取得も可能になります。 20 21 use WWW::Mixi; 22 use HTTP::Request::Common; 23 24 my $mixi = WWW::Mixi->new('me@mixi.user', 'mixi_password'); 25 26 print "ログインします。\n"; 27 my $response = $mixi->login; 28 29=head2 マイミクシイ最新日記の取得 30 31mixiからの情報取得も、私がデータ取得メソッドと読んでいるいくつかの便利なメソッドで簡単に済ませることができます。 32すべてのデータ取得に対応しているわけではありませんが、それを使うのが一番簡単な方法です。 33 34まず、マイミクシイ最新日記用のデータ取得メソッド"get_new_friend_diary"を紹介しましょう。 35このメソッドは、次のような配列のリファレンスを返します。 36 37 { 38 'subject' => 'mixiの本。', 39 'link' => 'http://mixi.jp/list_item_review.pl?reviewer_id=xxxx&item_id=xxxxx', 40 'name' => '塚本牧生', 41 'time' => '2004/08/18 13:18' 42 } 43 44例として、マイミクシイ最新日記をテキストで出力するスクリプトを挙げましょう。 45 46 use WWW::Mixi; 47 48 my $mixi = WWW::Mixi->new('me@mixi.user', 'mixi_password'); 49 50 print "ログインします。\n"; 51 my $response = $mixi->login; 52 53 print "マイミクシイ最新日記を取得します。\n"; 54 my =item get_new_friend_diary; 55 print "マイミクシイ最新日記を出力します。\n"; 56 foreach my $item (@items) { 57 my $subject = $item->{'subject'}; 58 my $link = $item->{'link'}; 59 my $name = $item->{'name'}; 60 my $time = $item->{'time'}; 61 print "■ $subject\n[日時] $time\n[名前] $name\n[Link] $link\n\n"; 62 } 63 64ちょっと気を付けておきたいのは、mixiの文字コードがEUCだということです。 65Windowsのコマンドラインなどで使う時には、文字コードをSJISにしてやる必要があるでしょうから、その時はJcodeモジュールなども組合わせてみてください。 66 67=head2 その他のデータ取得メソッド 68 69マイミクシイ最新日記用のget_new_friend_diaryの他にも、いくつかのデータ取得メソッドがあります。 70以下は0.21版で利用できるデータ取得メソッドの一部ですが、基本的には後述の「parse_~」というメソッドには、対応する「get_~」メソッドがあると思ってまず間違いはありません。 71正確で完全な一覧は、ドキュメントを確認してください。 72 73多くのデータ取得メソッドは、get_new_friend_diaryと同じように引数なしで実行でき、それぞれ決まった形式の(でもget_new_friend_diaryと似た感じの)ハッシュリファレンスを複数返します。 74 75=over 4 76 77=item get_information 78 79ホームに表示される「管理者からのお知らせ」を取得します。 80 81=item get_list_comment 82 83最近のコメントに表示される「最近のコメント一覧」を取得します。 84 85=item get_list_message 86 87メッセージに表示される「受信箱」を取得します。 88 89=item get_new_bbs 90 91コミュニティ最新書き込みを取得します。 92 93=item get_new_comment 94 95日記コメント記入履歴を取得します。 96 97=item get_new_friend_diary 98 99マイミクシイ最新日記を取得します。 100 101=item get_new_review 102 103マイミクシイ最新レビューを取得します。 104 105=item get_show_log 106 107あしあとを取得します。 108 109=back 110 111例外として、メインメニュー項目を取得するget_main_menu、バナーを取得するget_banner、ツールバー項目を取得するget_tool_barの3つは、引数でURLを指定できます。 112これらはどのページにでもあるからです。 113URLは"home.pl"のように、ページ名の部分だけでも構いません。 114 115 my =item get_main_menu("home.pl"); 116 117URLを省略した時には、最後にデータ取得メソッドか、getまたはpostメソッドで取得したページになります。 118 119=over 4 120 121=item get_main_menu 122 123ページ先頭部のメインメニューを取得します。 124 125=item get_banner 126 127バナーを取得します。 128 129=item get_tool_bar 130 131メインメニューの下に標示されるツールバーを取得します。 132 133=back 134 135また、別の例外としてget_show_log_countはあしあと数を返します。 136同様に、get_self_idは自分のIDを返します。 137これらの返り値は配列でも、ハッシュリファレンスでもなく、単なるスカラです。 138 139 my $count = $mixi->get_show_log_count; 140 my $id = $mixi->get_self_id; 141 142=over 4 143 144=item get_show_log_count 145 146あしあとを取得します。 147 148=item get_self_id 149 150自分のIDを取得します。 151 152=back 153 154=head1 LWP::UserAgentスタイルでのアクセス 155 156ログインとデータ取得メソッドを使ったコーディングは簡単ですが、取得できるデータは限られますし、エラーハンドリングの弱さが泣き所です。 157もう少し細かい制御と自由な利用を考えるのであれば、これをLWP::UserAgentだと思って使ってみてください。 158 159実際に、WWW::MixiのスーパークラスはLWP::RobotUAで、さらにそのスーパークラスはLWP::UserAgentです。 160多くのメソッドがLWP::UserAgentから継承されており、それほど違いを感じることはないでしょう。 161 162=head2 ログイン 163 164LWP::UserAgentスタイルでコーディングするにしても、ログインはloginメソッドを使ってしまって良いでしょう。 165 166LWP::UserAgentを使う時のログイン作業は、POSTのHTTP::Requestオブジェクトを生成し、Cookieを有効にし、ログインページにアクセスするといった手順になります。 167ログインメソッドは、内部的には単にこれを順番に行います。 168その後はCookieでセッションIDが自動的に送受信されますので、LWP::UserAgentでするようにrequestやsimple_requestメソッドで各ページにアクセスできます。 169 170例えば、ログイン後にホームのHTML部分を出力するには以下のようにします。 171 172 use WWW::Mixi; 173 use HTTP::Request::Common; 174 175 my $mixi = WWW::Mixi->new('me@mixi.user', 'mixi_password'); 176 177 print "ログインします。\n"; 178 my $response = $mixi->login; 179 180 print "ホームを取得します。\n"; 181 $request = &HTTP::Request::Common::GET('http://mixi.jp/home.pl'); 182 $response = $mixi->request($request); 183 print $response->content; 184 185=head2 getメソッド 186 187LWP::UserAgentモジュールでの標準的なページ取得は(1)HTTP::Requestオブジェクトの生成、(2)requestメソッドでリクエストの処理の手順になります。 188WWW::Mixiモジュールでは、この他にgetとpostという簡易的なメソッドを用意しており、これを使うこともできます。 189 190例えば、上では次の様にしてホームを取得しました。 191 192 use WWW::Mixi; 193 use HTTP::Request::Common; 194 195 (略) 196 197 print "ホームを取得します。\n"; 198 $request = &HTTP::Request::Common::GET('http://mixi.jp/home.pl'); 199 $response = $mixi->request($request); 200 print $response->content; 201 202getを使うと、HTTP::Request::Commonモジュールなどを使ったリクエストの生成をせずに、直接URLを指定すれば済みます。 203また、URLも'http://'から始まる絶対URLではなく、最後のファイル名(またはそこから拡張子の'.pl'を省いたもの)を指定すれば十分です。 204つまり、下のように書けば同じ事ができます。 205 206 use WWW::Mixi; 207 208 (略) 209 210 print "ホームを取得します。\n"; 211 $response = $mixi->get('home.pl'); 212 print $response->content; 213 214=head2 postメソッド 215 216簡単にGETでページを取得するためのメソッドとして、WWW::Mixiにはgetというメソッドが用意されていました。 217 218同様にPOSTでフォームの入力値を送信するには、postという簡易的なメソッドを使うことができます。 219postでは、URLの他にフォームデータを引数で渡します。 220例えば、次のようにすれば日記の投稿ができます。 221 222 use WWW::Mixi; 223 224 my %diary = ( 225 'submit' => 'confirm', # プレビュー:main、作成:confirm、修正:cancel 226 'diary_title' => 'WWW::Mixiで日記の投稿', 227 'diary_body' => "WWW::Mixiモジュールで日記を投稿してみます。\nPOSTメソッドの試験です。", 228 'photo1' => '', 229 'photo2' => '', 230 'photo3' => '', 231 ); 232 233 my $mixi = WWW::Mixi->new('me@mixi.user', 'mixi_password'); 234 235 print "ログインします。\n"; 236 my ($result, $response) = $mixi->login; 237 238 print "日記を投稿します。\n"; 239 $response = $mixi->post('add_diary.pl', %diary); 240 241フォームの値は、送信前に自動的にエンコードされます。 242意識的にエンコードやエスケープをする必要はありません。 243 244=head2 ファイルの送信 245 246postメソッドでは写真など、ファイルを送信することも考慮されています(が、まったく試験されていません。ぜひ試験して、結果を教えてください)。 247 248例えば、日記のプレビューを表示するためのアクションでは、日記に貼付する写真を「photo1」「photo2」「photo3」の3つのフィールドに入れてやることができます。 249フィールド値にファイルを指定したい時は、ファイルパスだけを持つ配列リファレンスを指定します。 250 251 use WWW::Mixi; 252 253 my %diary = ( 254 'submit' => 'main', # プレビュー:main、作成:confirm、修正:cancel 255 'diary_title' => 'WWW::Mixiで日記の投稿', 256 'diary_body' => "WWW::Mixiモジュールで日記を投稿してみます。\nPOSTメソッドの試験です。", 257 'photo1' => ['c:\My Documents\photos\walrus.png'], 258 'photo2' => '', 259 'photo3' => '', 260 ); 261 262 my $mixi = WWW::Mixi->new('me@mixi.user', 'mixi_password'); 263 264 print "ログインします。\n"; 265 my ($result, $response) = $mixi->login; 266 267 print "日記を投稿します。\n"; 268 $response = $mixi->post('add_diary.pl', %diary); 269 270=head2 メインメニューの解析メソッド 271 272コンテンツの取得が済めば、次は必要なデータを取り出すための解析をするでしょう。 273WWW::Mixiモジュールには、いくつかのページ用の解析メソッドがあります。 274 275解析系で一番簡単な(そして最初に作られた)解析メソッドがメインメニュー(ページ先頭のmixiのログと一緒に「ホーム」「検索」等のボタンが埋め込まれたメニューです)を解析するparse_main_menuメソッドです。 276このメソッドは、次のような配列のリファレンスを返します。 277 278 { 279 'subject' => 'ホーム', 280 'link' => 'http://mixi.jp/home.pl' 281 } 282 283例として、ホームを取得してメインメニューの各項目を出力するスクリプトを挙げましょう。 284ただしホームの取得までの部分は、「ページの取得」の項で出てきたものと同じなのでざっくり済ませています。 285 286 use WWW::Mixi; 287 288 my $mixi = WWW::Mixi->new('me@mixi.user', 'mixi_password'); 289 print "ログインします。\n"; 290 my $response = $mixi->login; 291 print "ホームを取得します。\n"; 292 $response = $mixi->get('home.pl'); 293 294 print "メインメニューを出力します。\n"; 295 my =item parse_main_menu($response); 296 foreach my $item (@items) { 297 my $subject = $item->{'subject'}; 298 my $link = $item->{'link'}; 299 print "$subject -> $link\n"; 300 } 301 302なお、$responseを指定しなかった時は、最後にgetまたはpostメソッドで取得したデータを解析します(requestやsimple_requestは対象外です)。 303上の例では、解析しているのは最後にgetで取得したデータなので、下のように$responseの指定は省いても構いません。 304 305 my =item parse_main_menu(); 306 307=head2 その他の解析メソッド 308 309メインメニュー用のparse_main_methodの他にも、いくつかの解析メソッドが設けられています。 310 311解析メソッドはいずれも$responseを引数に取り、ほとんどはハッシュリファレンスの配列を返します。 312$responseを指定しなかった時の解析対象は、最後にgetまたはpostメソッドで取得したデータです。 313ハッシュリファレンスの持つキー項目は、メソッドごとに違います。 314 315以下は0.21版で利用できる解析用メソッドの一覧です。 316最新版ではメソッドが追加されていたり変更されていたりするかも知れませんので、詳細はドキュメントを確認してください。 317 318=over 4 319 320=item parse_main_menu 321 322ページ先頭部のメインメニューを解析します。 323 324=item parse_banner 325 326メインメニューに埋め込まれているバナーを解析します。 327 328=item parse_tool_bar 329 330メインメニューの下に標示されるツールバーを解析します。 331 332=item parse_information 333 334ホーム(home.pl)に表示される「管理者からのお知らせ」を解析します。 335 336=item parse_community_id 337 338コミュニティトップ(view_community.pl)、トピック一覧(list_bbs.pl)、トピック(view_bbs.plのメイン部)などを解析します。 339 340=item parse_list_bbs 341 342トピック一覧(list_bbs.plのメイン部)を解析します。 343 344=item parse_list_bbs_next 345 346トピック一覧(list_bbs.plのメイン部)の「次のページ」へのリンクを解析します。 347 348=item parse_list_bbs_previous 349 350トピック一覧(list_bbs.plのメイン部)の「前のページ」へのリンクを解析します。 351 352=item parse_list_bookmark 353 354お気に入り(list_bookmark.pl)を解析します。 355 356=item parse_calendar 357 358カレンダー(calendar.pl)上のイベント(参加イベント、不参加イベント、マイミクシィの誕生日)を解析します。 359 360=item parse_calendar_term 361 362カレンダー(calendar.pl)が表示している期間(年月)を解析します。 363 364=item parse_calendar_next 365 366カレンダー(calendar.pl)の「次の月」へのリンクを解析します。 367 368=item parse_calendar_previous 369 370カレンダー(calendar.pl)の「前の月」へのリンクを解析します。 371 372=item parse_list_comment 373 374最近のコメント(list_comment.pl)に表示される「最近のコメント一覧」を解析します。 375 376=item parse_list_community 377 378コミュニティ一覧(list_community.pl)に表示されるコミュニティを解析します。 379 380=item parse_list_community_next 381 382コミュニティ一覧(list_community.pl)の「次のページ」へのリンクを解析します。 383 384=item parse_list_community_previous 385 386コミュニティ一覧(list_community.pl)の「前のページ」へのリンクを解析します。 387 388=item parse_list_diary 389 390日記(list_diary.pl)の日記項目を解析します。 391 392=item parse_list_diary_next 393 394日記(list_diary.pl)の「次のxx件」へのリンクを解析します。 395 396=item parse_list_diary_previous 397 398日記(list_diary.pl)の「前のxx件」へのリンクを解析します。 399 400=item parse_list_friend 401 402友人・知人一覧(list_friend.pl)の友人・知人を解析します。 403 404=item parse_list_friend_next 405 406友人・知人一覧(list_friend.pl)の「次のページ」へのリンクを解析します。 407 408=item parse_list_friend_previous 409 410友人・知人一覧(list_friend.pl)の「前のページ」へのリンクを解析します。 411 412=item parse_list_member 413 414メンバー一覧(list_member.plのメイン部)を解析します。 415 416=item parse_list_member_next 417 418メンバー一覧(list_member.plのメイン部))の「次を表示」へのリンクを解析します。 419 420=item parse_list_member_previous 421 422メンバー一覧(list_member.plのメイン部))の「前を表示」へのリンクを解析します。 423 424=item parse_list_message 425 426メッセージ(list_message.pl)に表示される「受信箱」を解析します。 427 428=item parse_list_request 429 430承認待ち一覧(list_request.plのメイン部)を解析します。 431 432=item parse_new_bbs 433 434コミュニティ最新書き込み(new_bbs.pl)を解析します。 435 436=item parse_new_bbs_next 437 438コミュニティ最新書き込み(new_bbs.pl)の「次を表示」へのリンクを解析します。 439 440=item parse_new_bbs_previous 441 442コミュニティ最新書き込み(new_bbs.pl)の「前を表示」へのリンクを解析します。 443 444=item parse_new_comment 445 446日記コメント記入履歴(new_comment.pl)を解析します。 447 448=item parse_new_friend_diary 449 450マイミクシイ最新日記(new_friend_diary.pl)を解析します。 451 452=item parse_new_friend_diary_next 453 454マイミクシィ最新日記(new_friend_diary.pl)の「次のページ」へのリンクを解析します。 455 456=item parse_new_friend_diary_previous 457 458マイミクシィ最新日記(new_friend_diary.pl)の「前のページ」へのリンクを解析します。 459 460=item parse_new_review 461 462マイミクシイ最新レビュー(new_review.pl)を解析します。 463 464=item parse_release_info 465 466リリース情報・障害情報(release_info.pl)を解析します。 467 468=item parse_show_log 469 470あしあと(show_log.pl)を解析します。 471 472=item parse_show_log_count 473 474あしあと(show_log.pl)の「ページ全体のアクセス数」を解析します。 475このメソッドの返り値はアクセス数で、ハッシュリファレンスの配列ではありません。 476 477=item parse_view_bbs 478 479トピック(view_bbs.plのメイン部)を解析します。 480 481=item parse_add_diary_preview 482 483日記作成のプレビュー(add_diary.pl)を解析し、各ボタンに相当するフォームの値を返します。 484 485=item parse_self_id 486 487おすすめレビュー(list_review.pl)を解析し、自分のIDを返します。 488このメソッドの返り値はIDで、ハッシュリファレンスの配列ではありません。 489 490=back 491 492=head1 SEE ALSO 493 494L<WWW::Mixi>, L<LWP::UserAgent>, L<WWW::RobotUA>, L<HTTP::Request::Common> 495 496=head1 COPYRIGHT 497 498Copyright 2004-2004 TSUKAMOTO Makio. 499 500This text is free document; you can redistribute it and/or 501modify it under the same terms as Perl itself. 502 503=cut 504