1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

آموزش ارسال IM به Yahoo توسط PHP

شروع موضوع توسط minaaa ‏30/10/11 در انجمن PHP

  1. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,773
    تشکر شده:
    6,457
    امتیاز دستاورد:
    113
    روش ارسال پیغام شخصی به یاهو مسنجر توسط 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::Disconnect()

    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