(Work in progress - will update as the code becomes more stable)

I had a neat idea to have asterisk send me a MSN message based on an Asterisk event.
I was able to have asterisk execute an AGI that would send me a MSN msg for every incoming call.


It took me about 45 minutes to get this all working (msn msgs with callerid of incoming calls)
I think it is kind of neat and will (as time permits) enhance this.
If anyone is interested in this, email me voip (at) les (dot) net.
Based on the response, I may speed up development.


My current asterisk setup answers the phone, greets the caller with a paranoid disclaimier (we monitor calls, etc)
Then does a DIAL to my known phone numbers.
I will modify this action to send me a MSN message with the callerid of who is calling as a MSN message.
The caller will be placed in a meetme or some kind of limbo.
Upon receiving the MSN message, I will type "accept" "drop" "voicemail" or something to that effect
based on my MSN response, the caller will branch as directed from my MSN reply.

I used the following software:

I wrote an AGI script that would append the callerid+did into a text file in the /tmp directory.
I modified the MSN php code to poll for the text file once a second (Ugly, yes I know)
Upon finding the text file, it would load its contents line by line and message them to my primary MSN account.
It would then delete the text file.
I modified my extensions.conf to call the AGI on every single incoming call, then dispatch it to my normal DID handler.

The result was a MSN message that arrived for every caller to my system.


Phase 1

1) Create a new MSN account for originating the messages
2) Login to the account, and add your existing MSN as a contact
3) Logout, and Login as your existing MSN account and accept the new contact.
4) Program the MSN script with your newly created account/password

Phase 2

Modify msnp9.class.php and add a timeout on function __get()
function _get()
stream_set_timeout($this->fp, 1); <---- add this line
if ($data = @fgets($this->fp, 4096))
This will cause the _get function to fall through the fgets after 1 second.

Phase 3

Modify msnp9.class.php in the function rx_data()
Before case 'RNG' add

case 'ILN':
$online = 1;

This will set a flag to say "we are online now, we can send out messages"

Phase 4

Modify msnp9.class.php in the function rx_data()

$online = 0;
while (! feof($this->fp))

if ($online) {
if (file_exists("/tmp/msn.txt")) {
$cid = fopen("/tmp/msn.txt","r");
$sbsess = new switchboard;
while (!feof($cid)) {
$num = chop(fgets($cid,4096));
if ($num != '') {
$sbsess->tx_im($this->fp, "CID: $num", $this->passport, 'l###YOUR NEW MSN ACCOUNT###');

$data = $this->_get();

Phase 5

Create an AGI script that opens, appends, and writes a single line to /tmp/msn.txt, and closes the file.

Phase 6

Run the msn php script like a daemon from the command line
Add #!/usr/bin/php -q to the beginning of the script
and run ./msn.php

This will cause the msn script to run, login to msn, and loop forever.

See also:

Go back to Asterisk

Created by: lesnet, Last modification: Sun 07 of Aug, 2005 (21:19 UTC) by mcukstorm
Please update this page with new information, just login and click on the "Edit" or "Discussion" tab. Get a free login here: Register Thanks! - Find us on Google+