A start towards Net::OpenID::UserProfile

Brad Fitzpatrick brad at danga.com
Wed May 25 23:12:41 PDT 2005


The silly thing, though, is that it crawls a document that was already
crawled in creating the VerifiedIdentity object.  Now, if we could hand
WWW::Blog::Metadata the URL and <head> section as a scalar, that'd be more
interesting.

But we also need a way to tell it that only URLs under the root one can be
trusted when making the profile.

- Brad


On Wed, 25 May 2005, Benjamin Trott wrote:

> Hi,
>
> I decided to take my own advice and play around with WWW::Blog::Metadata, to
> see how it could be the basis of a Net::OpenID::UserProfile module. It's
> already plugin-based & knows how to get a bunch of information about a URI
> (doesn't have to a blog, despite the name).
>
> What I came up with is below. It's a plugin called
> WWW::Blog::Metadata::Profile, and when put in place, it will look in the
> FOAF file or a feed (RSS or Atom) to find profile information. Sample usage
> is the same as with any other WWW::Blog::Metadata usage:
>
>     #!/usr/bin/perl -w
>     use strict;
>
>     use WWW::Blog::Metadata;
>     use Data::Dumper;
>
>     my $uri = 'http://btrott.typepad.com/';
>     my $meta = WWW::Blog::Metadata->extract_from_uri($uri)
>         or die WWW::Blog::Metadata->errstr;
>     print Dumper $meta;
>
> With both ::Profile and WWW::Blog::Metadata::Icon (looks in a bunch of
> places for an image for the URI) installed, this outputs:
>
> $VAR1 = bless( {
>                  'feeds' => [
>                               'http://btrott.typepad.com/typepad/atom.xml',
>                               'http://btrott.typepad.com/typepad/index.rdf'
>                             ],
>                  'weblog_title' => 'Stupidfool.org',
>                  'name' => 'Benjamin Trott',
>                  'foaf_icon_uri' =>
> 'http://btrott.typepad.com/ben-vienna.jpg',
>                  'generator' => 'http://www.typepad.com/',
>                  'favicon_uri' => 'http://btrott.typepad.com/favicon.ico',
>                  'foaf_uri' => 'http://btrott.typepad.com/foaf.rdf',
>                  'weblog_url' => 'http://btrott.typepad.com/typepad/',
>                  'icon_uri' => 'http://btrott.typepad.com/ben-vienna.jpg'
>                }, 'WWW::Blog::Metadata' );
>
> Module below.
>
> Ben
>
> # $Id$
>
> package WWW::Blog::Metadata::Profile;
> use strict;
>
> our $VERSION = '0.01';
>
> use XML::FOAF;
> use XML::Feed;
> use URI::Fetch;
>
> WWW::Blog::Metadata->mk_accessors(qw( name email weblog_url weblog_title ));
>
> sub _fetch {
>     my $res = URI::Fetch->fetch($_[0]) or return;
>     \$res->content;
> }
>
> sub on_finished {
>     my $class = shift;
>     my($meta) = @_;
>
>     if (my $uri = $meta->foaf_uri) {
>         $class->_profile_foaf($meta, $uri);
>     } elsif (my $feeds = $meta->feeds) {
>         $class->_profile_feed($meta, $feeds->[0]);
>     }
> }
> sub on_finished_order { 99 }
>
> sub _profile_foaf {
>     my $class = shift;
>     my($meta, $uri) = @_;
>     my $xml = _fetch $uri or return;
>     my $foaf = XML::FOAF->new($xml, $uri) or return;
>     my $person = $foaf->person;
>     $meta->name($person->name);
>     $meta->weblog_url($person->weblog);
>     if ($person->mbox && $person->mbox =~ /^mailto:(.*)$/) {
>         $meta->email($1);
>     }
> }
>
> sub _profile_feed {
>     my $class = shift;
>     my($meta, $uri) = @_;
>     my $xml = _fetch $uri or return;
>     my $feed = XML::Feed->parse($xml) or return;
>     $meta->weblog_title($feed->title);
>     $meta->weblog_url($feed->link);
>     $meta->name($feed->author);
> }
>
> 1;
>
> _______________________________________________
> yadis mailing list
> yadis at lists.danga.com
> http://lists.danga.com/mailman/listinfo/yadis
>
>


More information about the yadis mailing list