روش ارسال پیغام شخصی به یاهو مسنجر توسط php که خیلی ها سوال کرده بودن رو براتون می گذارم. البته شاید روشای مختلفی باشه ولی به نظرم این روش خیلی جامع و کامل و اختراع اهالی open source هستش. نکته مهم در مورد این روش اینه که علاوه بر یاهو به msn,icq,aol هم می تونید ارسال کنید (البته من تست نکردم ولی باید بشه). خوب یه توضیح مختصر درباره این روش اینه که اساسش اسفاده از Jabber هستش. حتما خیلی هاتون می دونید جابر چیه ؟ جابر یه سرور که بر روی platform های مختلف نصب می شه و به عنوان یک سرور پیغام رسان مثل سرور یاهو عمل می کنه. حالا transport هایی هم برای Jabber نوشته شده که سرور نصب شده رو به سرورهای پیغام رسان دیگه مثل yahoo یا msn متصل می کنه. خوب برای اینکه شما بتونید به یک سرور jabber متصل بشید باید اول یه account تو سرور مربوطه باز کنید که این کار رو به راحتی می تونید توسط یک client مخصوص که معمولا تو سایت مربوطه معرفی میکنه، انجام بدید.(من خودم Trillian رو معرفی می کنم که حتما می شناسیدش) بعد طبق فایل هایی که براتون ارسال کردم بقیه کارو انجام می دید. فقط دقت کنید که سروری که انتخاب می کنید transport های مربوط رو نصب کرده باشه (مثال: netlab.cz و jaim.at) یعنی اگه می خواهید به یاهو ارسال کنید سرور مربوطه transport یاهو رو نصب کرده باشه. اول این کلاس رو به نام فایل class.jabber.php ذخیره کنید : PHP Code: <code style="white-space: nowrap;"> <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> <password>{$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 = </span