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