Weblog

ファイルからURLを抽出し、そのURLからPing送信先を探してみる

Posted at 2003-10-12T02:34:00+09:00 in Blog

自動TrackBackスクリプトのためのサブルーチンを二つ書いてみました。

引数に渡されたファイルから、URLを抽出するサブルーチン。HTML::LinkExtorってすごいな。

sub extract_urls {
  my $entry_path = $_[0];
  my @urls;

  my $p = HTML::LinkExtor->new(\&callback);
  sub callback {
    my($tag, %attr) = @_;
    if ($tag eq 'a' and ($attr{'href'} =~ m!^http://!)) {
      push(@urls, $attr{'href'});
    }
  }
  $p->parse_file($entry_path);

  return @urls;
}

引数に渡されたURLから、Ping送信先URLを探すサブルーチン。Ping送信先URLを見つけると、Ping送信先URLと1が返ってきます。

sub extract_ping_url {
  my $url = $_[0];
  my $flag = 0;

  my $ua = LWP::UserAgent->new(
    agent => "TrackBack/1.1",
    timeout => 15,
    parse_head => 0,
  );
  my $req = HTTP::Request->new(GET => $url);
  my $res = $ua->request($req);
  if ($res->is_success) {
    my $content = $res->content;
    $url =~ s/#.*$//;
    while ($content =~ m!(<rdf:RDF.*?</rdf:RDF>)!sg) {
      my $rdf = $1;
      my($perm_url) = $rdf =~ m!dc:identifier="([^"]+)"!;
      if ($perm_url eq $url) {
        if ($rdf =~ m!trackback:ping="([^"]+)"!) {
          $url = $1;
          $flag = 1;
        }
        elsif ($rdf =~ m!about="([^"]+)"!) {
          $url = $1;
          $flag = 1;
        }
      }
    }
  }

  return($url, $flag);
}

ネスト深すぎですよ。

とりあえず、自動的にTrackBack Pingを送るスクリプトはほとんど完成したので、実験をどうやってやろうかと考え中。自分のblogのエントリでやるべきだな(当たり前)。

うげ。Net::TrackBackモジュールにTrackBack ping URL auto discoveryの機能あったよ!2番目のコードは考える必要なかった・・・。

Recent entries from same category

同じカテゴリに分類された最近10件のエントリです。

  1. RSS Ping
  2. Pingoat
  3. blogの掃除
  4. blogsnow
  5. Blog Hackers Conference 2004
  6. FeedMesh
  7. Blog Hacks: Hack #79
  8. コメント・スパム対策いろいろ
  9. 1000エントリまでの道
  10. weblogUpdates.pingはなかったことに

Comments

JavaScriptに対応または有効な環境の場合、ここにはてなブックマークでのこのエントリに対するコメントが表示されます。

Weblog archives

by Category

This page was last modified on 2004-03-21T04:31:06+09:00 (in 0.102 secs).