NAME
Net::YMSG - Interface to the Yahoo! Messenger IM protocol
SYNOPSIS
use
Net::YMSG;
my
$yahoo
= Net::YMSG->new(
id
=>
'your_yahoo_id'
,
password
=>
'your_password'
,
);
$yahoo
->login or
die
"Can't login Yahoo!Messenger"
;
$yahoo
->
send
(
'recipient_yahoo_id'
,
'Hello World!'
);
DESCRIPTION
Net::YMSG is a client class for connecting with the Yahoo! Messenger server, and transmitting and receiving a message.
Since implement of a protocol is the result of analyzing and investigating a packet, it has an inadequate place. However, it is working as expected usually.
METHODS
This section documents method of the Net::YMSG class.
Net::YMSG->new()
It should be called with following arguments (items with default value are optional):
id
=> yahoo id
password
=> password
pre_login_url
=> url which refers to setting information.
hostname
=> server hostname
(
default
'scs.yahoo.com)
Returns a blessed instantiation of Net::YMSG.
Note: If you plan to connect with Yahoo!India (yahoo.co.in), it sets up as follows.
my
$yahoo_japan
= Net::YMSG->new(
hostname
=>
'cs.yahoo.co.in'
,
);
Since it connects with Yahoo!(yahoo.com), this procedure is unnecessary in almost all countries.
$yahoo->id([$yahoo_id])
This method gets or sets the present Yahoo Id.
$yahoo->password([$password])
This method gets or sets the present password.
$yahoo->login()
Call this after new()
to logon the Yahoo!Messenger service.
$yahoo->send($yahoo_id, $message)
This method send an Instant-Message $message to the user specified by $yahoo_id.
$yahoo->chatsend($chatroom, $message)
This method send a Message $message to the given $chatroom.
$yahoo->change_state($busy, $status_message)
This method sets the status messages for the current user. 'Status message' is set by $status_message
. 'Busy icon' is set by the numerical value of $busy
.
The $busy
should be called with following arguments:
0 - I'm Available
1 - Busy
2 - Sleep
$yahoo->recv()
This method reads the message from a server socket and returns a corresponding Event object. The Event object which will be returned is as follows:
Net::YMSG::InvalidLogin - Invalid Login
Net::YMSG::Login - Succeeded in Login.
Net::YMSG::GoesOnline - Buddy
has
logged in.
Net::YMSG::ReceiveMessage - Message was received.
Net::YMSG::ChangeState - Buddy
has
change status.
Net::YMSG::GoesOffline - Buddy logged out.
Net::YMSG::NewFriendAlert - New Friend Alert.
Net::YMSG::ChatRoomLogon - Log in chat room
Net::YMSG::ChatRoomReceive- Log in chat room
Net::YMSG::ChatRoomLogoff - Log in chat room
Net::YMSG::UnImplementEvent - Un-implemented event was received.
All event objects have the following attributes:
- $event->from
-
Yahoo id which invoked the event.
- $event->to
-
Yahoo id which should receive an event.
- $event->body
-
The contents of an event. The message and state which were transmitted.
- $event->code
-
The event number on Yahoo Messenger Protocol.
$yahoo->get_connection()
This method returns a raw server socket. When connection has already ended, the socket is returned, and when not connecting, it connects newly.
$yahoo->set_event_hander($event_handler)
This method sets the Event handler for a specific Yahoo!Messenger server event. $event_handler
is the sub class of Net::YMSG::EventHandler.
Note: The event which can be overwritten should look at the method signature of Net::YMSG::EventHandler.
$yahoo->add_event_source($file_handle, $code_ref, $flag)
This method adds the file handle (event sauce) to supervise. The file handle to add is specified by $file_handle
. The code reference to the processing to perform is specified by $code_ref.
C<
$flag
> eq
'r'
- set
when
the file handle to add is an object
for
read
.
C<
$flag
> eq
'w'
- set
when
the file handle to add is an object
for
write
.
By adding another handle (for example, STDIN), processing can be performed based on those inputs. Usually, the server socket of 'Yahoo!Messenger server' is set as a candidate for surveillance.
ex:
# The input of STDIN is transmitted to 'EXAMPLE_YAHOO_ID'.
$yahoo
->add_event_source(\
*STDIN
,
sub
{
my
$message
=
scalar
<STDIN>;
chomp
$message
;
$yahoo
->
send
(
'EXAMPLE_YAHOO_ID'
,
$message
);
},
'r'
);
$yahoo->start()
If you're writing a fairly simple application that doesn't need to interface with other event-loop-based libraries, you can just call start() to begin communicating with the server.
$yahoo->invisible()
This method makes you invisible to other users..
$yahoo->join_room($roomname,$roomid)
This method logs you in $roomname. You need to provide the $id along with Roomname. Check out http://www.cse.iitb.ac.in/varunk/YahooProtocol.php for the list of RoomIDs corresponding to the Room you wish to join.[This is a comprehensive list and might not list all available rooms at that moment; Follow instructions to get the roomid of the room you wish to join]
$yahoo->logoffchat()
This method logs you off any chat rooms you are currently logged into.
Receiving Offline Messages
All offline messages would be displayed on login by declaring the Event_handler of ReceiveMessage as following :
my $first=0; sub ReceiveMessage { my $self = shift; my $event = shift; my @from = split("\x80",$event->from); my @body = split("\x80",$event->body); my $i; if($first==0 && $#from >= 1) { # offline messages print "Your Offline messages :\n[They have been saved in the file \'offline\' in the current directory]\n"; open(OFFLINE,">>offline") || printf "Error opening file offline"; for($i=0;$i<=$#from;$i++) { print OFFLINE "[".$from[$i]."]: ".$body[$i]."\n"; } close(OFFLINE); } $first=1; for($i=0;$i<=$#from;$i++) { if ($body[$i] ne "") { $body[$i] =~ s{</?(?:font|FACE).+?>}{}g; if( ! defined $nametonum{"$from[$i]"} ) { $nametonum{"$from[$i]"} = $count; $numtoname{"$count"}=$from[$i]; $count++; }
my
$message
=
sprintf
"[%s(%s)] %s \n"
,
$from
[
$i
],
$nametonum
{
"$from[$i]"
},
$body
[
$i
];
$message
;
}
}
}
EXAMPLE
Send message
Change Status message
Become Invisible
Received message output to STDOUT
#!perl
use
Net::YMSG;
use
strict;
my
$yahoo
= Net::YMSG->new(
id
=>
'yahoo_id'
,
password
=>
'password'
,
);
$yahoo
->set_event_handler(new ToStdoutEventHandler);
$yahoo
->login or
die
"Can't login Yahoo!Messenger"
;
$yahoo
->start;
package
ToStdoutEventHandler;
use
strict;
sub
ChangeState {}
sub
GoesOffline {}
sub
GoesOnline {}
sub
UnImplementEvent {}
sub
ReceiveMessage
{
my
$self
=
shift
;
my
$event
=
shift
;
printf
"%s: %s\n"
,
$event
->from,
$event
->body;
}
__END__
Connect to Yahoo!Japan Messege server
Join Room 1 of Linux, FreeBSD, Solaris
my $chatroom="Linux, FreeBSD, Solaris:1"; my $chatroomcode="1600326591"; my $message= "Hi Room!"; #!perl use Net::YMSG; use strict;
my
$yahoo
= Net::YMSG->new(
id
=>
'yahoo_id'
,
password
=>
'password'
,
);
$yahoo
->login or
die
"Can't login Yahoo!Messenger"
;;
# Join chat room C<$chatroom>
my
$msg
=
$yahoo
->pre_join();
my
$msg
=
$yahoo
->join_room(
$chatroom
,
$chatroomcode
);
# Send message to chatroom $yahoo->chatsend($chatroom,$message);
# Log off chatroom
$yahoo
->logoffchat();
__END__
AUTHOR Varun Kacholia <varunk@cse.iitb.ac.in> http://www.cse.iitb.ac.in/varunk/ Hiroyuki OYAMA <oyama@crayfish.co.jp> http://ymca.infoware.ne.jp/ =cut
See Also http://www.cse.iitb.ac.in/varunk/YahooProtocol.php
Please refer to the use agreement of Yahoo! about use of the Yahoo!Messenger service.
2 POD Errors
The following errors were encountered while parsing the POD:
- Around line 863:
=cut found outside a pod block. Skipping to next block.
- Around line 873:
Unknown directive: =COPYRIGHT