#!/usr/local/bin/perl -w
###########################################
# ymsend - Send an IM to Y!Messenger
# Mike Schilli, 2010 (m@perlmeister.com)
###########################################
use strict;
use LWP::UserAgent;
use Sysadm::Install qw(qquote);
use URI;
use JSON;

my $user         = "zangzongzing";
my $passwd       = "*********";
my $recipient    = "mikeschi1li";

my $api_key      = "******************";
my $secret       = "*************";

my $login_url      = "https://login.yahoo.com/WSLogin/V1/get_auth_token";
my $auth_token_url = "https://api.login.yahoo.com/oauth/v2/get_token";
my $session_url    = "http://developer.messenger.yahooapis.com/v1/session";
my $message_url    = "http://developer.messenger.yahooapis.com/v1/message/yahoo/$recipient";

my($msg) = join ' ', @ARGV;

die "usage: $0 message" unless
  length $msg;

my $ua = LWP::UserAgent->new();

my $url = URI->new( $login_url );

$url->query_form(
  login              => $user, 
  passwd             => $passwd, 
  oauth_consumer_key => $api_key );

my $resp = $ua->get( $url );

if( $resp->is_error() ) {
  die "Can't get request token: ", 
  $resp->message(), " ", $resp->content();
}

my($request_token) = 
 ($resp->content() =~ /RequestToken=(.*)/);

$url = URI->new($auth_token_url);

$url->query_form( 
  oauth_consumer_key => $api_key,
  oauth_nonce => int( rand 10000000 ),
  oauth_signature => "$secret&",
  oauth_signature_method => "PLAINTEXT",
  oauth_timestamp => time(),
  oauth_token => $request_token,
  oauth_version => "1.0"
);

$resp = $ua->get( $url );

if( $resp->is_error() ) {
  die "Can't get access token: ", 
  $resp->message(), " ", $resp->content();
}

my $u = URI->new();
$u->query( $resp->content() );
my %form = $u->query_form;

$session_url = URI->new( $session_url );

$session_url->query_form( 
  oauth_consumer_key => $api_key,
  oauth_nonce => int( rand 10000000 ),
  oauth_signature => 
       "$secret&$form{oauth_token_secret}",
  oauth_signature_method => "PLAINTEXT",
  oauth_timestamp => time(),
  oauth_token => $form{oauth_token},
  oauth_version => "1.0"
);

$resp = $ua->post( $session_url, 
  Content_Type => 
         'application/json; charset=utf-8',
  Content => 
  q[ {"presenceState"   : 0, 
      "presenceMessage" : "I'm alive!" }] );

if( $resp->is_error() ) {
  die "Can't get session: ", 
  $resp->message(), " ", $resp->content();
}

my $data = from_json( $resp->content() );

$message_url = URI->new( $message_url );

$message_url->query_form( 
  oauth_consumer_key => $api_key,
  oauth_nonce => int( rand 10000000 ),
  oauth_signature => 
       "$secret&$form{oauth_token_secret}",
  oauth_signature_method => "PLAINTEXT",
  oauth_timestamp => time(),
  oauth_token => $form{oauth_token},
  oauth_version => "1.0",
  sid => $data->{sessionId},
);

$resp = $ua->post( $message_url, 
  Content_Type => 
         'application/json; charset=utf-8',
  Content => 
  '{"message" : ' . qquote($msg) . ' }'
);

if( $resp->is_error() ) {
  die "Can't send message: ", 
  $resp->message(), " ", $resp->content();
}
