A start towards Net::OpenID::UserProfile

ydnar ydnar at shaderlab.com
Wed May 25 23:33:51 PDT 2005


Seems to me that both Net::OpenID::Consumer and Net::OpenID::Identity 
(or WWW::Blog::Metadata) all depend on extracting a list of link objects 
from an HTML header.

Why not extract the relevant code from both into a seperate module that 
returns a list of links, with rel, type, title, href attributes blessed 
into some package that can do the check to determine if the particular 
link is under a certain root?


Benjamin Trott wrote:

>Agreed, there's no point in parsing the same document twice.
>
>You can use WWW::Blog::Metadata->extract_from_html and hand it a ref to a
>scalar containing the HTML to parse, and then you could let it handle
>parsing the HTML, calling the plugins, etc. It only makes one pass over the
>HTML.
>
>Agreed re: trusted URLs, but you could probably do that with an on_finished
>callback with a very low order (like 0 or 1), and remove any members that
>were discovered during the parsing step that have untrusted URLs. Not great,
>but...
>
>Ben
>
>
>On 5/25/05 11:12 PM, "Brad Fitzpatrick" <brad at danga.com> wrote:
>
>  
>
>>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
>>>
>>>
>>>      
>>>
>
>_______________________________________________
>yadis mailing list
>yadis at lists.danga.com
>http://lists.danga.com/mailman/listinfo/yadis
>
>  
>


More information about the yadis mailing list