PHP: Skype Bots (php, Skype4COM)

Kā jau vēsta virsraksts, stāsts būs par to, kā no ārējās aplikācijas (kas šoreiz būs rakstīta iekš PHP) var veikt darbības ar Skype. Darbību klāsts ir visnotaļ iespaidīgs. No visa šī bagātīgā klāsts izmantosim tērzētavas procedūras – ziņojuma sūtīšanu un ziņojuma saņemšanu.

Lai arī Skype sākotnēji bija paredzēts balss, video un tekstuālai komunikācijai starp diviem vai vairākiem dalībniekiem, apķērīgiem cilvēkiem ar to bija par maz. Līdz pats skype laida klajā COM moduli, caur kuru tad arī var no citas aplikācijas šo to sadarīt Skype.

Kā jau vēsta virsraksts, stāsts būs par to, kā no ārējās aplikācijas (kas šoreiz būs rakstīta iekš PHP) var veikt darbības ar Skype. Darbību klāsts ir visnotaļ iespaidīgs un apskatāms šeit https://developer.skype.com/Docs/Skype4COMLib . No visa šī bagātīgā klāsts izmantosim tērzētavas procedūras – ziņojuma sūtīšanu un ziņojuma saņemšanu.

 


Attēls 1. Platforma.

Skype COM pielietojums

Tagad abstrahēsimies no tehniskām niansēm (un iespējām :) ) un padomāsim, kur un kā šādu veidojumu varētu izmantot.

  1. Visa sarakste automātiski saglabājas web lapā (blogā, twitterī, utt.)
  2. Tikai ar speciālu komandu tiek pievienots ziņojums web lapai. Piemēram, Pievienot: Pašreiz rakstu par skype4com.
  3. URL labošana. Piemēram: dokuments.doc tiek pārlabots uz //server/user/dokuments.doc, kā rezultātā šī saite kļūs reāla un izmantojama.
  4. Mini Google. Piemēram: google: skype4com un rezultātā tie atsūtīta pirmos 3 ierakstus. Vai pagerank, vai atslēgas vardu pozīcija meklētajā, vai Alexa rank, vai dajebkas cits.
  5. Verķītis pats no sevis ik pa laikam konkrētai konferencei (piem., darbs) tiek izsūtīta īsa informācija – samaksāts rēķins Nr 123 vai šodien vārda dienas svin Jānis Bērziņš un dzimšanas dienu svin Liena Bērziņa.
  6. Vārdnīca. Rakstām, piemēram: en:lullaby atbildē saņemam – lv:šūpļa dziesma
  7. Info serviss. Piemēram: ?cik diskā vietas uz servera. Atbilde 1Gb.
  8. Čatbots. Cik nu labs sanāks... Ja prāta pietiks uztaisīt sakarīgu uz MI balstītu, varētu izrādīties lādzīgs sarunu biedrs :)
  9. Nu un, protams, čupa ar dažādām cita veida komandām.


Ar ko sākt?

Vispirms vajadzīgs pats Skype ar Skype tīklā reģistrētu lietotāju. Ņemot vērā, ka Skype protokols ir slēgts (t.i. nav publiski apskatāms), visas tālā aprakstītās darbības būs iespējamas, ja būs palaists skype klients (dabūnams gan priekš Windows, gan Linux, gan Mac). Ņemam vērā, ka Skype klientam ir tikai GUI versija...

Otrais. Skype4COM komponente. Principā tas ir dll fails, kuru var piereģistrēt ar regsrv32 komandu. Nesanāca :(. Līdz ar ko otrs variants. Instalējot izvēlamies Options (pašā pirmajā logā) un atzīmējam „Install Skype Extras Manager”. Līdz ar šo, Skype4Com pieinstalēsies. Bet ar to vēl visa maģija nebeidzas.

 

Trešais. Izņemot gadījumu, kad PHP tiks darbināts komandrindā (t.i. php –f skype.php), jāsaprot viena lieta – inicializējot savienojumu caur COM objektu, tiks palaista vēl viena Skype instance (ja Skype vēl nav aktīvs) un pieprasīts ievadīt autentifikācijas datus.

Savos eksperimentos izdarīju tā:

  • - palaidu Skype un ielogojos;
  • - Pie Administrative Tools > Services > Apache > Properties > Log On un liekam ķeksi pie
  • - Palaižam PHP un atļaujam Skype savienojumu.

Ja PHP neparādīja kaut kādu mistisku COM kļūdu vai Skype4COM unable to attach (Wait Timeout), tad viss strādā un tālāk jau darbošanās pa PHP!


N.B. Rakstot PHP kodu jāpatur prātā divas lietas:
1. Jādod laiks izpildīties komandai. Piemēram, izmantojam com_message_pump(4000);
2. Ja gribam „gaidīt” uz kādu Skype notikumu, piemēram, ienākošo ziņojumu, tad kaut kur sākumā set_time_limit(0); un beigās – bezgalīgo gaidīšanas ciklu:

while(!$sink->terminated) {
   com_message_pump(1000);
}


Dažas labas idejas un reāls Skype bots:
http://www.voidstar.com/void.bot/source/skypebot.txt

Noderīgas saites:
Skype. Skype4COM reference - https://developer.skype.com/Docs/Skype4COM
Skype bots: http://www.voidstar.com/void.bot/
Linux skype wrappers - http://labs.gree.jp/Top/OpenSource/Skype-en.html

PHP Skype COM piemērs:

error_reporting(E_ALL);
ini_set('display_errors', '1');

set_time_limit(0);

define("ln", "");

class _ISkypeEvents {

      var $terminated = false;
      var $attached = false;
      var $msg;

    function CallStatus($call, $status) {

        echo 'CallStatus: '.$status. ln;
    }

    function MessageStatus( $msg, $status ) {

      global $skype;
 
      // ienākošie ziņojumi (status = 2)

      if($status == 2) {

            // ja ziņa ir "exit", tad terminējam php skriptu

            // Stop poga nederēs, jo apache serviss paliks karājoties...

            if($msg->Body == "exit") {

                  $this->terminated = true;

            }

            // no kā ziņa ir atnākusi

            $name = $msg->FromDisplayName;

            $to = $msg->FromHandle;

            error_log("$name ($to): $msg->Body");

            // sūtām atpakāļ

            $skype->SendMessage($to, "I am only chatbot... \nMy master is away, but I will leave your message to him!");                         

      }
    }


    function UserStatus($status) {

        echo 'UserStatus: '.$status. ln;
    }


    function AttachmentStatus($status) {

        echo 'AttachmentStatus: '.$status. ln;

        if($status==0)
        {

            $this->attached = true;

        }
    }
}



//Create skype object

$skype = new COM("Skype4COM.Skype");


$sink  =& new _ISkypeEvents();

$sink->convert = $skype->convert();


//Increase timeout to allow more time.

$skype->timeout = 60000;

com_event_sink($skype, $sink, "_ISkypeEvents");

$convert = $skype->convert;

$convert->language = "en";


//Run Skype client if it is not running.

if (!$skype->client()->isRunning())
{
    echo 'Skype is not running, trying to start up.'.ln;

    $skype->client()->start(true, true);
}

//Try to attach to Skype.
 
try
{

    $skype->Attach();

} catch(Exception $e) {

    echo 'Exception: Not attached.'.ln;
}

com_message_pump(4000);

//If attached, check status and make a call.
 
if($sink->attached) {

    echo 'Attached.'.ln;
 
    // Viss ok, sākam gaidīt ienākošos ziņojumus

      error_log("ready");
   
      while(!$sink->terminated) {

            com_message_pump(1000);
      }

} else {

    echo 'Not attached.'.ln;
}

echo "Finish!";

Dalies:
Novērtē: 4 (24)
Skatīts: 3662

komentāri

grostons

Tam com autorizācijas datus arī var kautkā nodot?

Ēriks

Nevar :( Skype-prāt autorizācijai jānotiek caur skype GUI.. Dīvainākais, ka skype4com vai nu radīs jaunu instanci, vai arī mēģinās pievienoties jebkurai esošai instancei un ir aizdomas, ka neatkarīgi no tā ar kādu lietotāju palaists.



Ko lasa citi?