موزش ارسال IM به Yahoo توسط PHP روش ارسال پیغام شخصی به یاهو مسنجر توسط php که خیلی ها سوال کرده بودن رو براتون می گذارم. البته شاید روشای مختلفی باشه ولی به نظرم این روش خیلی جامع و کامل و اختراع اهالی open source هستش. نکته مهم در مورد این روش اینه که علاوه بر یاهو به msn,icq,aol هم می تونید ارسال کنید (البته من تست نکردم ولی باید بشه). خوب یه توضیح مختصر درباره این روش اینه که اساسش اسفاده از Jabber هستش. حتما خیلی هاتون می دونید جابر چیه ؟ جابر یه سرور که بر روی platform های مختلف نصب می شه و به عنوان یک سرور پیغام رسان مثل سرور یاهو عمل می کنه. حالا transport هایی هم برای Jabber نوشته شده که سرور نصب شده رو به سرورهای پیغام رسان دیگه مثل yahoo یا msn متصل می کنه. (توضیح بیشتر: http://www.jabber.org) خوب برای اینکه شما بتونید به یک سرور jabber متصل بشید باید اول یه account تو سرور مربوطه باز کنید که این کار رو به راحتی می تونید توسط یک client مخصوص که معمولا تو سایت مربوطه معرفی میکنه، انجام بدید.(من خودم Trillian رو معرفی می کنم که حتما می شناسیدش) بعد طبق فایل هایی که براتون ارسال کردم بقیه کارو انجام می دید. فقط دقت کنید که سروری که انتخاب می کنید transport های مربوط رو نصب کرده باشه (مثال: netlab.cz و jaim.at) یعنی اگه می خواهید به یاهو ارسال کنید سرور مربوطه transport یاهو رو نصب کرده باشه. فکر کنم بقیه ماجرا خیلی واضح و روشن باشه (با دیدن فایلها) اگه سوالی بود در خدمتم. اول این کلاس رو به نام فایل class.jabber.php ذخیره کنید : PHP Code: <?php /*************************************************************************** , , , ,Class.Jabber.PHP ,v0.4 , , , ,© ,2002 ,Carlo ,"Gossip" ,Zottmann , , , ,http://phpjabber.g-blog.net ,*** ,gossip@jabber.g-blog.net , , , ,The ,FULL ,documentation ,and ,examples ,for ,this ,software ,can ,be ,found ,at , , , ,http://phpjabber.g-blog.net ,(not ,many ,doc ,comments ,in ,here, ,sorry) , , , ,last ,modified: ,27.04.2003 ,13:01:53 ,CET ,***************************************************************************/ /*************************************************************************** ,* ,* ,***************************************************************************/ /* , , , ,Jabber::Connect() , , , ,Jabber:isconnect() , , , ,Jabber::SendAuth() , , , ,Jabber::AccountRegistration($reg_email ,{string}, ,$reg_name ,{string}) , , , ,Jabber::Listen() , , , ,Jabber::SendPacket($xml ,{string}) , , , ,Jabber::RosterUpdate() , , , ,Jabber::RosterAddUser($jid ,{string}, ,$id ,{string}, ,$name ,{string}) , , , ,Jabber::RosterRemoveUser($jid ,{string}, ,$id ,{string}) , , , ,Jabber::RosterExistsJID($jid ,{string}) , , , ,Jabber::Subscribe($jid ,{string}) , , , ,Jabber::Unsubscribe($jid ,{string}) , , , ,Jabber::CallHandler($message ,{array}) , , , ,Jabber::CruiseControl([$seconds ,{number}]) , , , ,Jabber::SubscriptionApproveRequest($to ,{string}) , , , ,Jabber::SubscriptionDenyRequest($to ,{string}) , , , ,Jabber::GetFirstFromQueue() , , , ,Jabber::GetFromQueueById($packet_type ,{string}, ,$id ,{string}) , , , ,Jabber::SendMessage($to ,{string}, ,$id ,{number}, ,$type ,{string}, ,$content ,{array}[, ,$payload ,{array}]) , , , , ,Jabber::SendIq($to ,{string}, ,$type ,{string}, ,$id ,{string}, ,$xmlns ,{string}[, ,$payload ,{string}]) , , , ,Jabber::SendPresence($type ,{string}[, ,$to ,{string}[, ,$status ,{string}[, ,$show ,{string}[, ,$priority ,{number}]]]]) , , , ,Jabber::SendError($to ,{string}, ,$id ,{string}, ,$error_number ,{number}[, ,$error_message ,{string}]) , , , ,Jabber::TransportRegistrationDetails($transport ,{string}) , , , ,Jabber::TransportRegistration($transport ,{string}, ,$details ,{array}) , , , ,Jabber::GetvCard($jid ,{string}[, ,$id ,{string}]) , , , ,-- ,EXPERIMENTAL ,-- , , , ,Jabber::GetInfoFromMessageFrom($packet ,{array}) , , , ,Jabber::GetInfoFromMessageType($packet ,{array}) , , , ,Jabber::GetInfoFromMessageId($packet ,{array}) , , , ,Jabber::GetInfoFromMessageThread($packet ,{array}) , , , ,Jabber::GetInfoFromMessageSubject($packet ,{array}) , , , ,Jabber::GetInfoFromMessageBody($packet ,{array}) , , , ,Jabber::GetInfoFromMessageError($packet ,{array}) , , , ,Jabber::GetInfoFromIqFrom($packet ,{array}) , , , ,Jabber::GetInfoFromIqType($packet ,{array}) , , , ,Jabber::GetInfoFromIqId($packet ,{array}) , , , ,Jabber::GetInfoFromIqKey($packet ,{array}) , , , , ,Jabber::GetInfoFromIqError($packet ,{array}) , , , ,Jabber::GetInfoFromPresenceFrom($packet ,{array}) , , , ,Jabber::GetInfoFromPresenceType($packet ,{array}) , , , ,Jabber::GetInfoFromPresenceStatus($packet ,{array}) , , , ,Jabber::GetInfoFromPresenceShow($packet ,{array}) , , , ,Jabber::GetInfoFromPresencePriority($packet ,{array}) , , , ,Jabber::AddToLog($string ,{string}) , , , ,Jabber::PrintLog() , , , ,MakeXML::AddPacketDetails($string ,{string}[, ,$value ,{string/number}]) , , , ,MakeXML::BuildPacket([$array ,{array}]) */ class ,Jabber { , , , ,var ,$server; , , , ,var ,$port; , , , ,var ,$username; , , , ,var ,$password; , , , ,var ,$resource; , , , ,var ,$jid; , , , ,var ,$connection; , , , ,var ,$delay_disconnect; , , , ,var ,$stream_id; , , , ,var ,$roster; , , , ,var ,$enable_logging; , , , ,var ,$log_array; , , , ,var ,$log_filename; , , , ,var ,$log_filehandler; , , , ,var ,$iq_sleep_timer; , , , ,var ,$last_ping_time; , , , ,var ,$packet_queue; , , , ,var ,$subscription_queue; , , , ,var ,$iq_version_name; , , , ,var ,$iq_version_os; , , , ,var ,$iq_version_version; , , , ,var ,$error_codes; , , , ,var ,$connected; , , , ,var ,$keep_alive_id; , , , ,var ,$returned_keep_alive; , , , ,var ,$txnid; , , , ,var ,$CONNECTOR; , , , ,function ,Jabber() , , , ,{ , , , , , , , ,$this->server , , , , , , , , , , , , , , , ,= ,"localhost"; , , , , , , , ,$this->port , , , , , , , , , , , , , , , , , , , ,= ,"5222"; , , , , , , , ,$this->username , , , , , , , , , , , , , , , ,= ,"larry"; , , , , , , , ,$this->password , , , , , , , , , , , , , , , ,= ,"curly"; , , , , , , , ,$this->resource , , , , , , , , , , , , , , , ,= ,NULL; , , , , , , , ,$this->enable_logging , , , , , , , ,= ,FALSE; , , , , , , , ,$this->log_array , , , , , , , , , , , ,= ,array(); , , , , , , , ,$this->log_filename , , , , , , , , , , , ,= ,''; , , , , , , , ,$this->log_filehandler , , , , , , , ,= ,FALSE; , , , , , , , ,$this->packet_queue , , , , , , , , , , , ,= ,array(); , , , , , , , ,$this->subscription_queue , , , ,= ,array(); , , , , , , , ,$this->iq_sleep_timer , , , , , , , ,= ,1; , , , , , , , ,$this->delay_disconnect , , , , , , , ,= ,1; , , , , , , , ,$this->returned_keep_alive , , , ,= ,TRUE; , , , , , , , ,$this->txnid , , , , , , , , , , , , , , , ,= ,0; , , , , , , , ,$this->iq_version_name , , , , , , , ,= ,"Class.Jabber.PHP ,-- ,http://phpjabber.g-blog.net ,-- ,by ,Carlo ,'Gossip' ,Zottmann, ,gossip@jabber.g-blog.net"; , , , , , , , ,$this->iq_version_version , , , ,= ,"0.4"; , , , , , , , ,$this->iq_version_os , , , , , , , ,= ,$_SERVER['SERVER_SOFTWARE']; , , , , , , , ,$this->connection_class , , , , , , , ,= ,"CJP_StandardConnector"; , , , , , , , ,$this->error_codes , , , , , , , , , , , ,= ,array(400 ,=> ,"Bad ,Request", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,401 ,=> ,"Unauthorized", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,402 ,=> ,"Payment ,Required", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,403 ,=> ,"Forbidden", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,404 ,=> ,"Not ,Found", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,405 ,=> ,"Not ,Allowed", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,406 ,=> ,"Not ,Acceptable", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,407 ,=> ,"Registration ,Required", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,408 ,=> ,"Request ,Timeout", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,409 ,=> ,"Conflict", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,500 ,=> ,"Internal ,Server ,Error", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,501 ,=> ,"Not ,Implemented", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,502 ,=> ,"Remove ,Server ,Error", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,503 ,=> ,"Service ,Unavailable", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,504 ,=> ,"Remove ,Server ,Timeout", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,510 ,=> ,"Disconnected"); , , , ,} , , , ,function ,Connect() , , , ,{ , , , , , , , ,$this->_create_logfile(); , , , , , , , ,$this->CONNECTOR ,= ,new ,$this->connection_class; , , , , , , , ,if ,($this->CONNECTOR->OpenSocket($this->server, ,$this->port)) , , , , , , , ,{ , , , , , , , , , , , ,$this->SendPacket("<?xml ,version='1.0' ,encoding='UTF-8' ,?" ,. ,">\n"); , , , , , , , , , , , ,$this->SendPacket("<stream:stream ,to='{$this->server}' ,xmlns='jabber:client' ,xmlns:stream='http://etherx.jabber.org/streams'>\n"); , , , , , , , , , , , ,sleep(2); , , , , , , , , , , , ,if ,($this->_check_connected()) , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,$this->connected ,= ,TRUE; , , , ,// ,Nathan ,Fritz , , , , , , , , , , , , , , , ,return ,TRUE; , , , , , , , , , , , ,} , , , , , , , , , , , ,else , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,$this->AddToLog("ERROR: ,Connect() ,#1"); , , , , , , , , , , , , , , , ,return ,FALSE; , , , , , , , , , , , ,} , , , , , , , ,} , , , , , , , ,else , , , , , , , ,{ , , , , , , , , , , , ,$this->AddToLog("ERROR: ,Connect() ,#2"); , , , , , , , , , , , ,return ,FALSE; , , , , , , , ,} , , , ,} , , , ,function ,Disconnect() , , , ,{ , , , , , , , ,if ,(is_int($this->delay_disconnect)) , , , , , , , ,{ , , , , , , , , , , , ,sleep($this->delay_disconnect); , , , , , , , ,} , , , , , , , ,$this->SendPacket("</stream:stream>"); , , , , , , , ,$this->CONNECTOR->CloseSocket(); , , , , , , , ,$this->_close_logfile(); , , , , , , , ,$this->PrintLog(); , , , ,} , , , ,function ,SendAuth() , , , ,{ , , , , , , , ,$this->auth_id , , , ,= ,"auth_" ,. ,md5(time() ,. ,$_SERVER['REMOTE_ADDR']); , , , , , , , ,$this->resource , , , ,= ,($this->resource ,!= ,NULL) ,? ,$this->resource ,: ,("Class.Jabber.PHP ," ,. ,md5($this->auth_id)); , , , , , , , ,$this->jid , , , , , , , ,= ,"{$this->username}@{$this->server}/{$this->resource}"; , , , , , , , ,// ,request ,available ,authentication ,methods , , , , , , , ,$payload , , , ,= ,"<username>{$this->username}</username>"; , , , , , , , ,$packet , , , , , , , ,= ,$this->SendIq(NULL, ,'get', ,$this->auth_id, ,"jabber:iq:auth", ,$payload); , , , , , , , ,// ,was ,a ,result ,returned? , , , , , , , ,if ,($this->GetInfoFromIqType($packet) ,== ,'result' ,&& ,$this->GetInfoFromIqId($packet) ,== ,$this->auth_id) , , , , , , , ,{ , , , , , , , , , , , ,// ,yes, ,now ,check ,for ,auth ,method ,availability ,in ,descending ,order ,(best ,to ,worst) , , , , , , , , , , , ,if ,(!function_exists(mhash)) , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,$this->AddToLog("ATTENTION: ,SendAuth() ,- ,mhash() ,is ,not ,available; ,screw ,0k ,and ,digest ,method, ,we ,need ,to ,go ,with ,plaintext ,auth"); , , , , , , , , , , , ,} , , , , , , , , , , , ,// ,auth_0k , , , , , , , , , , , ,if ,(function_exists(mhash) ,&& ,isset($packet['iq']['#']['query'][0]['#']['sequence'][0]["#"]) ,&& ,isset($packet['iq']['#']['query'][0]['#']['token'][0]["#"])) , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,return ,$this->_sendauth_0k($packet['iq']['#']['query'][0]['#']['token'][0]["#"], ,$packet['iq']['#']['query'][0]['#']['sequence'][0]["#"]); , , , , , , , , , , , ,} , , , , , , , , , , , ,// ,digest , , , , , , , , , , , ,elseif ,(function_exists(mhash) ,&& ,isset($packet['iq']['#']['query'][0]['#']['digest'])) , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,return ,$this->_sendauth_digest(); , , , , , , , , , , , ,} , , , , , , , , , , , ,// ,plain ,text , , , , , , , , , , , ,elseif ,($packet['iq']['#']['query'][0]['#']['password']) , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,return ,$this->_sendauth_plaintext(); , , , , , , , , , , , ,} , , , , , , , , , , , ,// ,dude, ,you're ,fucked , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,$this->AddToLog("ERROR: ,SendAuth() ,#2 ,- ,No ,auth ,method ,available!"); , , , , , , , , , , , , , , , ,return ,FALSE; , , , , , , , , , , , ,} , , , , , , , ,} , , , , , , , ,else , , , , , , , ,{ , , , , , , , , , , , ,// ,no ,result ,returned , , , , , , , , , , , ,$this->AddToLog("ERROR: ,SendAuth() ,#1"); , , , , , , , , , , , ,return ,FALSE; , , , , , , , ,} , , , ,} , , , ,function ,AccountRegistration($reg_email ,= ,NULL, ,$reg_name ,= ,NULL) , , , ,{ , , , , , , , ,$packet ,= ,$this->SendIq($this->server, ,'get', ,'reg_01', ,'jabber:iq:register'); , , , , , , , ,if ,($packet) , , , , , , , ,{ , , , , , , , , , , , ,$key ,= ,$this->GetInfoFromIqKey($packet); , , , ,// ,just ,in ,case ,a ,key ,was ,passed ,back ,from ,the ,server , , , , , , , , , , , ,unset($packet); , , , , , , , , , , , ,$payload ,= ,"<username>{$this->username}</username> , , , , , , , , , , , , , , , , , , , , , , , ,{$this->password}</password> , , , , , , , , , , , , , , , , , , , , , , , ,<email>$reg_email</email> , , , , , , , , , , , , , , , , , , , , , , , ,<name>$reg_name</name>\n"; , , , , , , , , , , , ,$payload ,.= ,($key) ,? ,"<key>$key</key>\n" ,: ,''; , , , , , , , , , , , ,$packet ,= ,$this->SendIq($this->server, ,'set', ,"reg_01", ,"jabber:iq:register", ,$payload); , , , , , , , , , , , ,if ,($this->GetInfoFromIqType($packet) ,== ,'result') , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,if ,(isset($packet['iq']['#']['query'][0]['#']['registered'][0]['#'])) , , , , , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , , , , , ,$return_code ,= ,1; , , , , , , , , , , , , , , , ,} , , , , , , , , , , , , , , , ,else , , , , , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , , , , , ,$return_code ,= ,2; , , , , , , , , , , , , , , , ,} , , , , , , , , , , , , , , , ,if ,($this->resource) , , , , , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , , , , , ,$this->jid ,= ,"{$this->username}@{$this->server}/{$this->resource}"; , , , , , , , , , , , , , , , ,} , , , , , , , , , , , , , , , ,else , , , , , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , , , , , ,$this->jid ,= ,"{$this->username}@{$this->server}"; , , , , , , , , , , , , , , , ,} , , , , , , , , , , , ,} , , , , , , , , , , , ,elseif ,($this->GetInfoFromIqType($packet) ,== ,'error' ,&& ,isset($packet['iq']['#']['error'][0]['#'])) , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , ,// ,"conflict" ,error, ,i.e. ,already ,registered , , , , , , , , , , , , , , , ,if ,($packet['iq']['#']['error'][0]['@']['code'] ,== ,'409') , , , , , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , , , , , ,$return_code ,= ,1; , , , , , , , , , , , , , , , ,} , , , , , , , , , , , , , , , ,else , , , , , , , , , , , , , , , ,{ , , , , , , , , , , , , , , , , , , , ,$return_code ,= ,