Are you one of those who has this need to ping all your buddies with a message? If so, your search ends here! Here’s what you need to do:

  1. Get Firefox browser.
  2. Get greasemonkey addon.
  3. Grab my greasemonkey script here.
  4. Login to www.meebo.com.

That’s about it. Fill up the textbox and hit send. The message will be sent to all your IM buddies.

If you are savvy enough, you can make some customizations to the script.

  1. Right click on greasemonkey icon and click on “Manage User Scripts”.
  2. Select “meebo all at once” and click “Edit” at the bottom of the window.
  3. The script will be opened for editing in your favourite text editor.
  4. Follow the instructions and make changes to the block marked in the source code.
  5. Then reload www.meebo.com.

That’s pretty much it. I quickly hacked it up in couple of hours so there might be some loose ends. If so, please let me know and I will fix it at the earliest. If you wish to make improvements yourself, you can fork the script at the Github repository.

Summary

  1. Link to the script.
  2. Link to the repository.

If you are even more savvy, you might want to check the Meebo analysis below.

Analysis of Meebo

Meebo makes heavy use of the Comet programming paradigm. Once the user is logged on, the server returns a session key and a client ID. After that, it makes a series of “event” AJAX requests. Each of those requests receive a JSON response. E.g. {“rev”:3,”events”:[{“type”:”buddy::online”,”data”:{“user”:”aswinanand@meebo.org\/Meebo”, … The rev parameter that is sent with each request is incremented by one for every request from a given client ID. The list of buddies for a given provider – Yahoo! Messenger, Google Talk etc. – are received in parts over multiple long lived HTTP requests.

Once the list of buddies are received, it constructs a few javascript global objects based on the JSON response. Such objects include:

  1. gBuddyList – instance of meebo.BuddyList
  2. gNetworkMgr – instance of meebo.NetworkMgr. This is the core network manager that handles AJAX requests and their asynchronous responses.
  3. gIMGateway – contains the client ID required to make the AJAX request

… and many more.

I found out these global objects by enumerating the properties of window javascript object. There’s a property called m_buddies in gBuddyList that contains the set of buddies and their related metadata such as whether the user is online or not, their status message, network (yahoo, gtalk etc.) and other such details. It also has a length property and a nice bunch of helper methods such as getByIndex, getBuddyById etc.

AJAX Requests

When a message is sent to a buddy, an AJAX request is fired to http://www.meebo.com/mcmd/send with a list of parameters that include: receiver, sender, protocol, clientID, sessionKey, mt, msg. In the usual scenarios, we need to reconstruct the AJAX request. But when we have gNetworkMgr global object, this stuff becames a breeze. Hence, a simple called to gNetworkMgr.doRequest(“send”, args) fired the request with the needed parameters. Here, args is a custom constructed javascript object that contains the request parameters. The first parameter “send” is used by gNetworkMgr to construct the actual URL at which the AJAX request has to be sent.

Currently, the script doesn’t monitor the AJAX response. But it could be done if required. Do try out the greasemonkey script and give feedback. Hope you enjoyed the lecture 😛

Comments are closed.