Dennis: Danke - und ich stelle meine Scripte zur Verfügung

Beitrag lesen

Hi liebes Forum,

nachdem ihr mir alle jetzt kräftig geholfen habt, wofür ich mich hiermit nochmmals herzlich Bedanke(!), möchte ich diesen Thread nun schließen. Für später im Archiv suchende stelle ich hiermit noch mein Script zur Verfügung, welches gerne verwendet werden kann. Man benötigt allerdigns für das Script in dieser Form PHP5.

============= Start jabber-bot1.php ============

#!/usr/local/bin/php5  
<?php  
  
// configuration  
define("BOT", "Bot1");  
define("PID_FILE", "run/jabber-bot1.pid");  
define("LOG_FILE", "logs/jabber-bot1.log");  
  
// be nice and say hello  
echo "This is Jabber " . BOT . ", I am starting...\n";  
  
// check if there is already a bot running  
if(file_exists(PID_FILE)) {  
  echo "PID File exists, perhabs there's already a bot running?\n";  
  echo "Aborting...\n";  
  exit;  
}  
  
// fork, so that process is running in the backround  
$pid = pcntl_fork();  
if($pid == -1) {  
  echo "Could not fork, exit.\n";  
  exit;  
}  
elseif($pid) {  
  echo "Jabber Bot forked, its PID is $pid.\n";  
  exit;  
}  
elseif(!posix_setsid()) {  
  echo "Could not detach from terminal, exit.\n";  
  exit;  
}  
else {  
  // write pid into pid file  
  file_put_contents(PID_FILE, posix_getpid());  
  // log startup  
  $log = "[" . date("Y-m-d H:i:s") . "] Started up\n";  
  file_put_contents(LOG_FILE, $log, FILE_APPEND);  
}  
  
// register shutdown and restart functions  
pcntl_signal(SIGTERM, "shutdown");  
pcntl_signal(SIGHUP,  "restart");  
pcntl_signal(SIGINT,  "shutdown");  
  
// load some stuff we need  
require("class.jabber.php");  
$config = parse_ini_file("accounts.conf", true);  
  
// the class for answering  
require("./responds.class.php");  
$responds = new Responds;  
  
// create jabber instance with parameters  
$jabber = new Jabber;  
$jabber->server   = $config['Jabber']['server'];  
$jabber->port     = $config['Jabber']['host'];  
$jabber->resource = "ClassJabberPHP";  
  
// set username and password for this bot  
$jabber->username = $config[BOT]['jabber_id'];  
$jabber->password = $config[BOT]['jabber_pw'];  
  
// connect and log in  
$jabber->Connect() or die("Error while connecting\n");  
$jabber->SendAuth() or die("Error while authenticating\n");  
  
// register transport for ICQ  
@$jabber->TransportRegistration(  
           $config['Jabber']['transport'],  
           array(  
             "username" => $config[BOT]['transport_id'],  
             "password" => $config[BOT]['transport_pw']  
           )  
         );  
  
// need to wait some seconds, till transport is established!  
sleep(10);  
  
// tell them we're online  
$jabber->SendPresence(NULL, NULL, $responds->GetPresence(), "away");  
  
// declare ticks  
declare(ticks=1);  
  
// start with main programm  
while(true) {  
  // get packets that came in  
  $jabber->Listen();  
  // and react to the first one  
  $packet = $jabber->GetFirstFromQueue();  
  if($packet !== false AND isset($packet['message'])) {  
    $from    = $jabber->GetInfoFromMessageFrom($packet);  
    $message = $jabber->GetInfoFromMessageBody($packet);  
    $answer  = $responds->GetRespond($message);  
    $answer  = $responds->escape($answer);  
    $jabber->SendMessage(  
              $from,  
              "chat",  
              NULL,  
              array(  
                "body" => $answer,  
                "thread" => "01"  
              )  
            );  
    $log = "[" . date("Y-m-d H:i:s") . "] Answered to message of " . $from . "\n";  
    file_put_contents(LOG_FILE, $log, FILE_APPEND);  
  }  
  sleep(5);  
}  
  
// what to by shutdown  
function shutdown($sig) {  
  global $jabber;  
  echo BOT . ": Received " . ($sig == SIGTERM ? "SIGTERM" : "SIGINT") . "... \n";  
  // disconnect from jabber  
  $jabber->SendPresence("unavailable", NULL, "offline");  
  $jabber->Disconnect();  
  // delete pid file  
  if(file_exists(PID_FILE)) {  
    unlink(PID_FILE);  
  }  
  // log shutdown  
  $log = "[" . date("Y-m-d H:i:s") . "] Shutted down\n";  
  file_put_contents(LOG_FILE, $log, FILE_APPEND);  
  exit;  
}  
  
// what to do by restarting  
function restart() {  
  // forget messages in queue  
  $jabber->packet_queue = array();  
  // disconnect from jabber  
  $jabber->SendPresence("unavailable", NULL, "offline");  
  $jabber->Disconnect();  
  // connect and log in  
  $jabber->Connect() or die("Error while connecting\n");  
  $jabber->SendAuth() or die("Error while authenticating\n");  
  $jabber->SendPresence(NULL, NULL, $responds->GetPresence(), "away");  
  // log restart  
  $log = "[" . date("Y-m-d H:i:s") . "] Restarted\n";  
  file_put_contents(LOG_FILE, $log, FILE_APPEND);  
}  
  
?>

============= Ende jabber-bot1.php =============

Der Name des Scriptes ist egal - es ist dafür ausgelegt, über Kommandozeile gestartet zu werden!
In den ersten drei Zeilen wird das Script konfiguriert - es muss erst mal festgelegt werden, wie der Bot sich identifiziert. Einfach auf Bot1 lassen, sofern man nicht mehrere Bots parallel verwendet. Anschließend kann noch der Pfad zum PID und zum Log-File festgelegt werden.

Man braucht allerdings noch folgende Datei namens accounts.conf:

============= Start accounts.conf ==============

; Login Information to Jabber Server  
  
[Jabber]  
server = "jabber.freenet.de"  
host = 5222  
transport = "icq.jabber.freenet.de"  
  
; Account Information for Bots  
  
[Bot1]  
jabber_id = "Jabber-ID"  
jabber_pw = "Passwort für Jabber ID"  
transport_id = "ICQ Nummer"  
transport_pw = "Passowrt für ICQ Nummer  
  
; es können weitere Blöcke für weitere Bots  
; folgen, der Name des Bots muss der PHP-Konstante  
; BOT entsprechen.  
  
; EOF

============= Ende jabber-bot.php ==============

Die Informationen im [Jabber] Block müsste man natürlich noch entsprechend anpassen, jenachdem welchen Jabber-Server man verwendet.

Starten lässt sich der Bot (sofern man im Verzeichnis des PHP-Scriptes ist) einfach mit
  ./jabber-bot1.php
Beenden lässt er sich mit
  kill cat run/jabber-bot1.pid
Und neustarten geht mit
  kill -HUP cat run/jabber-bot1.pid
Damit wird auch direkt klar, dass für solche Spielereien Kommandozeilen-Zugriff vorausgesetzt ist ;-)

In diesem Sinne wünsche ich also viel Spaß mit dem Script und self.close() ;-)

MfG, Dennis.