Class: IRC Bot
Auteur: tomie94 - 05 maart 2009 - 17:59 - Gekeurd door: marten - Hits: 5354 - Aantal punten: 2.50 (5 stemmen)
Sinds 09-03-2009 staat hier een nieuwe versie online in verband met veiligheidsproblemen!
Ik heb voor eigen gebruik een irc chat bot gemaakt, waarvan ik dacht dat jullie dit ook wel nodig kunnen hebben. Deze bot zal, wanneer mijn computer aanstaat draaien op irc.chatfactory.net/#devhouse.
Vereisten
Om deze chat bot te gebruiken heb je het volgende nodig:
-PHP5.3 of hoger(dit heb je nodig in verband met gebruik van closures
-Ondesteuning voor Sockets
Tip
Ik raad je aan om deze bot niet op een webserver te laten draaien, maar te laten draaien in CMD(Windows) of Terminal(Linux).
Veranderingen
In de nieuwe versie(geplaatst op 09-03-09) zijn een aantal belangrijke veranderingen die zorgen voor de veiligheid van de bot toegevoegd, zo dien je je nu in te loggen in plaats van te activeren. Ook zijn een aantal kleine foutjes opgelost.
Gebruik
Hoe deze bot gebruikt dient te worden is onder de code te vinden.
|
Code: |
De Class
<?php
class Ircbot
{
private $config = array();
private $actions = array();
private $online_owners = array();
public function __construct($server, $port, $channel)
{
$this->config['server'] = $server; //Set $this->config['server'] to the server
$this->config['port'] = $port; //Set $this->config['port'] to the port
$this->config['channel'] = $channel;
}
public function setIdentity($nickname, $realname, $ident)
{
$this->config['identity'] = array('nickname'=>$nickname, 'realname'=>$realname, 'ident'=>$ident); // Set $this->config['identity'] to a array with the identity
}
public function setOwners($owners)
{
foreach($owners as $name=>$password)
{
$this->config['owners'][$name] = $password;
}
}
public function addAction($name, $function, $owner = false)
{
$this->actions[$name] = array('function'=>$function, 'owner'=>$owner); //$this->actions[$name] to $function
}
public function write($data)
{
socket_write($this->socket,$data."\r\n");
}
public function nickname($str)
{
return substr(array_shift(explode('!',$str)),1);
}
public function connect()
{
if(!$this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP))
{
echo 'De socket kan niet worden aangemaakt.';
exit();
}
echo 'Socket is aangamaakt.'."\n";
if(isset($this->config['hostname'])) { $hostname = $this->config['hostname']; } else { $hostname = 0; }
if(!socket_bind($this->socket,$hostname))
{
echo 'Verbinding kon niet worden gekoppeld aan hostname '.$hostname;
exit();
}
echo 'Verbinding gekoppeld aan hostname'."\n";
if(!isset($this->config['server']) || !isset($this->config['port']))
{
echo 'De gegevens voor de sever of de poort missen.';
exit();
}
if(!socket_connect($this->socket,$this->config['server'],$this->config['port']))
{
echo 'Verbinding met server kon niet tot stand worden gebracht.';
exit();
}
echo 'Maken van verbinding...'."\n";
if(!isset($this->config['identity']['ident']) || !isset($this->config['identity']['realname']) || !isset($this->config['identity']['nickname']))
{
echo 'Er missen vereiste gegevens. Weet u zeker dat u setIdentity(nickname, realname, ident) heeft gebruikt?';
exit();
}
$this->write('USER '.$this->config['identity']['ident'].' 0 '.$this->config['server'].' :'.$this->config['identity']['realname']);
$this->write('NICK '.$this->config['identity']['nickname']);
$this->inChannel = false;
while($data = socket_read($this->socket,65000,PHP_NORMAL_READ))
{
if($data == "\n") continue;
$eData = explode(" ",$data);
for($i = 0; isset($eData[$i]); $i++) {
$eData[$i] = trim($eData[$i]);
}
echo $data."\n";
if($this->inChannel == false && strstr($data,'MOTD'))
{
$this->write('JOIN '.$this->config['channel']);
$this->inChannel = true;
}
if($eData[0] == 'PING') {
$this->write('PONG '.$eData[1]);
}
if(isset($eData[3]) && preg_match('#:login#', $eData[3], $matches))
{
if($eData[1] == 'PRIVMSG')
{
if(isset($this->config['owners'][$eData[4]]))
{
if($eData[5] == $this->config['owners'][$eData[4]])
{
$this->online_owners[$this->nickname($eData[0])] = $eData[4];
$this->write('NOTICE '.$this->nickname($eData[0]).' : Je bent succesvol ingelogd!');
print_r($this->online_owners);
}
else
{
$this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet');
}
}
else
{
$this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet');
}
}
}
if($eData[1] == 'QUIT')
{
$nick = $this->nickname($eData[0]);
if(isset($this->online_owners[$nick]))
{
unset($this->online_owners[$nick]);
echo $nick.' is uitgelogd, zijn sessie is verwijderd!';
}
}
if(isset($eData[3]) && preg_match('#:!(.*)#', $eData[3], $matches))
{
$name = $matches[1];
if(isset($this->actions[$name]))
{
$action = $this->actions[$name];
$name = $action['function'];
if($action['owner'])
{
$acces = false;
if( isset( $this->online_owners[$this->nickname($eData[0])] ) )
{
$acces = true;
}
if($acces)
{
$name($this, $eData);
}
else
{
$this->write('NOTICE '.$this->nickname($eData[0]).' : Je hebt geen recht om deze actie uit te voeren!');
}
}
else
{
$name($this, $eData);
}
}
}
}
}
}
<?php class Ircbot { private $config = array(); private $actions = array(); private $online_owners = array(); public function __construct($server, $port, $channel) { $this->config['server'] = $server; //Set $this->config['server'] to the server $this->config['port'] = $port; //Set $this->config['port'] to the port $this->config['channel'] = $channel; } public function setIdentity($nickname, $realname, $ident) { $this->config['identity'] = array('nickname'=>$nickname, 'realname'=>$realname, 'ident'=>$ident); // Set $this->config['identity'] to a array with the identity } public function setOwners($owners) { foreach($owners as $name=>$password) { $this->config['owners'][$name] = $password; } } public function addAction($name, $function, $owner = false) { $this->actions[$name] = array('function'=>$function, 'owner'=>$owner); //$this->actions[$name] to $function } public function write($data) { } public function nickname($str) { } public function connect() { { echo 'De socket kan niet worden aangemaakt.'; } echo 'Socket is aangamaakt.'."\n"; if(isset($this->config['hostname'])) { $hostname = $this->config['hostname']; } else { $hostname = 0; } { echo 'Verbinding kon niet worden gekoppeld aan hostname '.$hostname; } echo 'Verbinding gekoppeld aan hostname'."\n"; if(!isset($this->config['server']) || !isset($this->config['port'])) { echo 'De gegevens voor de sever of de poort missen.'; } if(!socket_connect($this->socket,$this->config['server'],$this->config['port'])) { echo 'Verbinding met server kon niet tot stand worden gebracht.'; } echo 'Maken van verbinding...'."\n"; if(!isset($this->config['identity']['ident']) || !isset($this->config['identity']['realname']) || !isset($this->config['identity']['nickname'])) { echo 'Er missen vereiste gegevens. Weet u zeker dat u setIdentity(nickname, realname, ident) heeft gebruikt?'; } $this->write('USER '.$this->config['identity']['ident'].' 0 '.$this->config['server'].' :'.$this->config['identity']['realname']); $this->write('NICK '.$this->config['identity']['nickname']); $this->inChannel = false; while($data = socket_read($this->socket,65000,PHP_NORMAL_READ )) { if($data == "\n") continue; for($i = 0; isset($eData[$i]); $i++) { $eData[$i] = trim($eData[$i]); } if($this->inChannel == false && strstr($data,'MOTD')) { $this->write('JOIN '.$this->config['channel']); $this->inChannel = true; } if($eData[0] == 'PING') { $this->write('PONG '.$eData[1]); } { if($eData[1] == 'PRIVMSG') { if(isset($this->config['owners'][$eData[4]])) { if($eData[5] == $this->config['owners'][$eData[4]]) { $this->online_owners[$this->nickname($eData[0])] = $eData[4]; $this->write('NOTICE '.$this->nickname($eData[0]).' : Je bent succesvol ingelogd!'); } else { $this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet'); } } else { $this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet'); } } } if($eData[1] == 'QUIT') { $nick = $this->nickname($eData[0]); if(isset($this->online_owners[$nick])) { unset($this->online_owners[$nick]); echo $nick.' is uitgelogd, zijn sessie is verwijderd!'; } } { $name = $matches[1]; if(isset($this->actions[$name])) { $action = $this->actions[$name]; $name = $action['function']; if($action['owner']) { $acces = false; if( isset( $this->online_owners[$this->nickname($eData[0])] ) ) { $acces = true; } if($acces) { $name($this, $eData); } else { $this->write('NOTICE '.$this->nickname($eData[0]).' : Je hebt geen recht om deze actie uit te voeren!'); } } else { $name($this, $eData); } } } } } }
Hoe moet ik de bot gebruiken??
Het gebruik van deze bot is niet al te moeilijk. Het belangrijkste is om de class file bovenaan te includen. Hierna dient te bot class te worden gestart. Hierna moeten nog een aantal dingen gedaan worden zoals het setten van de owners. Dit komt er uiteindelijk zo uit te zien:
<?php
require_once('ircbot.inc.php');
$bot = new Ircbot('server', 6667, '#kanaal');
$bot->setOwners(array('gebruiker1'=>'wachtwoord', 'gebruiker2'=>'anderwachtwoord'));
$bot->setIdentity('Nickname', 'realname', 'ident');
$bot->connect(); //Start de bot
?>
<?php require_once('ircbot.inc.php'); $bot = new Ircbot('server', 6667, '#kanaal'); $bot->setOwners(array('gebruiker1'=>'wachtwoord', 'gebruiker2'=>'anderwachtwoord')); $bot->setIdentity('Nickname', 'realname', 'ident'); $bot->connect(); //Start de bot ?>
Als je de bot nu zal starten in bijvoorbeeld CMD, zal hij na een aantal seconden verschijnen in het irc kanaal.
Misschien zoals je nu ziet heeft de bot nog geen functies, de functies kunnen we toevoegen door gebruik te maken van closures:
<?php
$function = function($class, $data)
{
$string = trim(array_pop(explode('!google',$data[4])));
$url = 'http://www.google.nl/search?hl=nl&q='.urlencode($string);
$class->write('PRIVMSG #devhouse : Google Zoeken: '.$url);
};
$bot->addAction('google', $function);
?>
<?php $function = function($class, $data) { $url = 'http://www.google.nl/search?hl=nl&q='.urlencode($string); $class->write('PRIVMSG #devhouse : Google Zoeken: '.$url); }; $bot->addAction('google', $function); ?>
Deze bovenstaande code zorgt ervoor dat als de gebruiker !google zoekwoord hij een google link terug krijgt.
Door de code hierboven de gebruiken, kun je vele handige of onnozele functies maken. Maar je wilt natuurlijk ook een paar functies die zo beveiligd zijn dat alleen de eigenaren(owners) ze kunnen gebruiken. Dit kun je doen door een derde parameter met als waarde true mee te geven aan addAction(). Dit zal er dan ongeveer zo uitzien:
$bot->addAction('google', $function, true);
$bot->addAction('google', $function, true);
Om owner te worden van de bot dien je eerst 2 dingen te doen, een account aanmaken door setOwners() en inloggen door login gebruikersnaam wachtwoord tegen de bot te zeggen. Dit dien je zo in een irc client te doen:
/msg NaamVanBot login gebruikersnaam wachtwoord
/msg NaamVanBot login gebruikersnaam wachtwoord
Ik hoop dat ik zo duidelijk genoeg ben geweest, vragen kunnen altijd gesteld worden.
Edit:
Even een voorbeeldje van hoe mijn bot er nu uitziet:
<?php
require_once('ircbot.inc.php');
$bot = new Ircbot('irc.chatfactory.net', 6667, '#devhouse');
$bot->setOwners(array('gbnaam'=>'wwoord'));
$bot->setIdentity('Nickname', 'Realname', 'ident');
$function = function($class, $data)
{
$string = trim(array_pop(explode('!google',$data[4])));
$url = 'http://www.google.nl/search?hl=nl&q='.urlencode($string);
$class->write('PRIVMSG #devhouse : Google Zoeken: '.$url);
};
$bot->addAction('google', $function);
$function = function($class, $data)
{
$class->write('QUIT : Ik ga slapie doen!:P');
exit();
};
$bot->addAction('quit', $function, true);
$bot->connect();
<?php require_once('ircbot.inc.php'); $bot = new Ircbot('irc.chatfactory.net', 6667, '#devhouse'); $bot->setOwners(array('gbnaam'=>'wwoord')); $bot->setIdentity('Nickname', 'Realname', 'ident'); $function = function($class, $data) { $url = 'http://www.google.nl/search?hl=nl&q='.urlencode($string); $class->write('PRIVMSG #devhouse : Google Zoeken: '.$url); }; $bot->addAction('google', $function); $function = function($class, $data) { $class->write('QUIT : Ik ga slapie doen!:P'); }; $bot->addAction('quit', $function, true); $bot->connect();
Download code (.txt)
|
|
Stemmen |
Niet ingelogd. |
|