2009年07月23日

libcurlでのリダイレクト先URLの取得

lwpに対するlibcurlのメリットはCのプロトタイプとしてperlが使えることにある。
前回のリダイレクト先のurlの取得をcurlでやるわけだが
そもそもcurlの関数はsetoptとgetinfoぐらいしかないので引数が何かということになる。

今回の肝はずばり


$curl->getinfo( CURLINFO_EFFECTIVE_URL);

でURLが取得できる。
headを要求するには


$curl->setopt(CURLOPT_NOBODY,1);

としてbodyを抑制すれば良い。
もしも事前にヘッダーを取り込んでいたならば


$curl->setopt(CURLOPT_HEADER,0);

も必要になる。

リダイレクト回数を一回に絞ることにより次の一件だけを取得する。

#!/usr/bin/perl

use WWW::Curl::Easy;

my $url = shift;

my $curl = WWW::Curl::Easy->new();
$curl->setopt(CURLOPT_HEADER,0);
$curl->setopt(CURLOPT_NOPROGRESS, 1);
$curl->setopt(CURLOPT_NOBODY,1);

$curl->setopt(CURLOPT_FOLLOWLOCATION, 1);
$curl->setopt(CURLOPT_MAXREDIRS, 1);
$curl->setopt(CURLOPT_AUTOREFERER, 1 );

$curl->setopt(CURLOPT_TIMEOUT, 30);
$curl->setopt( CURLOPT_URL, $url );

my $resp = $curl->perform;
print $curl->getinfo( CURLINFO_EFFECTIVE_URL)."\n";
$curl->close;


CURLOPT_AUTOREFERERというのを入れてみた。
自動的にリダイレクトする前のURLをいれるらしい。
CURLOPT_MAXREDIRSをリセットする方法は見当たらないので
際限なくトレースしていいのであればCURLOPT_FOLLOWLOCATION
だけを使えば良い。
その場合 CURLINFO_EFFECTIVE_URLで得られる値は最後にアクセスしたURLになるはずだ。

そろそろsetoptの羅列もうんざりしてきたので配列渡しで使いたいのだが
phpでのみの実装らしい。
まぁ今回の場合実質必要なのは
CURLOPT_URL、CURLOPT_NOBODY,CURLOPT_FOLLOWLOCATIONの3つだけなので
頻度が多いならばユニット化するなり定数を数値化するなりすればよい。
posted by Xo_ox at 23:20| Comment(1) | perl | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
$curl->close;
はいらなくなった模様
Posted by Xo_ox at 2011年01月15日 11:15
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。