#! /usr/bin/perl # $Id: twitter_delicious_sync.pl,v 1.0 2009/03/03 19:48:30 subbarao Exp $ # Sync Twitter contacts to del.icio.us use Net::Twitter; use Net::Delicious; use Log::Dispatch::Screen; use strict; my ($debug, %following); $ARGV[0] eq '-d' and $debug = 1, shift; @ARGV > 1 or die "usage: $0 [-d] twitter_username:password delicious_username:password\n"; my ($twusername, $twpasswd) = split(/:/, $ARGV[0], 2); my ($delusername, $delpasswd) = split(/:/, $ARGV[1], 2); my $tw = Net::Twitter->new({apiurl => 'https://twitter.com/', apihost => 'twitter.com:443', username => $twusername, password => $twpasswd}) or die "Couldn't connect to twitter\n"; my $friends; my $page = 1; do { $friends = $tw->friends({page => $page++}) or die("twitter: ".$tw->get_error->{error}."\n"); foreach my $friend (@$friends) { $following{$friend->{screen_name}} = $friend->{name}; } } while @$friends; my $del = Net::Delicious->new({endpoint => 'https://api.del.icio.us/v1/', user => $delusername, pswd => $delpasswd}) or die "Couldn't connect to del.icio.us\n"; # Workaround for Net::Delicious:all_posts() not supporting a tags argument: # $del->all_posts({tag => 'twitter'}) $del->config('delicious_posts_all.tag' => ''); my $res = $del->_execute_method("delicious.posts.all", {tag => 'twitter'}) or die "Error calling delicious posts/all\n"; my $posts = $del->_getresults($res, 'post'); foreach my $post ($del->_buildresults('Post', $posts)) { my $username = $post->href; $username =~ s#^http://twitter.com/##; if (exists $following{$username}) { delete $following{$username} } else { # Delete stale entries $del->delete_post({url => "http://twitter.com/$username"}); $debug and print "Deleted $username\n"; } } # Add new entries foreach my $username (keys %following) { $del->add_post({url => "http://twitter.com/$username", description => "Twitter / $following{$username}", tags => 'twitter'}); $debug and print "Added $username\n"; }