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

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

شروع موضوع توسط MiTra ‏15/12/10 در انجمن PHP

  1. پیشکسوت انجمن کاربر ارزشمند❤

    تاریخ عضویت:
    ‏11/11/10
    ارسال ها:
    11,734
    تشکر شده:
    3,539
    امتیاز دستاورد:
    113
    موزش ارسال 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::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>

    , , , , , , , , , , , , , , , , , , , , , , , ,{$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 ,= ,