login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Handige scripts > Class: IRC Bot

Class: IRC Bot

Auteur: tomie94 - 05 maart 2009 - 17:59 - Gekeurd door: marten - Hits: 5336 - 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
  1. <?php
  2. class Ircbot
  3. {
  4. private $config = array();
  5. private $actions = array();
  6. private $online_owners = array();
  7. public function __construct($server, $port, $channel)
  8. {
  9. $this->config['server'] = $server; //Set $this->config['server'] to the server
  10. $this->config['port'] = $port; //Set $this->config['port'] to the port
  11. $this->config['channel'] = $channel;
  12. }
  13. public function setIdentity($nickname, $realname, $ident)
  14. {
  15. $this->config['identity'] = array('nickname'=>$nickname, 'realname'=>$realname, 'ident'=>$ident); // Set $this->config['identity'] to a array with the identity
  16. }
  17. public function setOwners($owners)
  18. {
  19.  
  20. foreach($owners as $name=>$password)
  21. {
  22. $this->config['owners'][$name] = $password;
  23. }
  24. }
  25. public function addAction($name, $function, $owner = false)
  26. {
  27. $this->actions[$name] = array('function'=>$function, 'owner'=>$owner); //$this->actions[$name] to $function
  28. }
  29. public function write($data)
  30. {
  31. socket_write($this->socket,$data."\r\n");
  32. }
  33. public function nickname($str)
  34. {
  35. return substr(array_shift(explode('!',$str)),1);
  36. }
  37. public function connect()
  38. {
  39. if(!$this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP))
  40. {
  41. echo 'De socket kan niet worden aangemaakt.';
  42. exit();
  43. }
  44. echo 'Socket is aangamaakt.'."\n";
  45. if(isset($this->config['hostname'])) { $hostname = $this->config['hostname']; } else { $hostname = 0; }
  46. if(!socket_bind($this->socket,$hostname))
  47. {
  48. echo 'Verbinding kon niet worden gekoppeld aan hostname '.$hostname;
  49. exit();
  50. }
  51. echo 'Verbinding gekoppeld aan hostname'."\n";
  52. if(!isset($this->config['server']) || !isset($this->config['port']))
  53. {
  54. echo 'De gegevens voor de sever of de poort missen.';
  55. exit();
  56. }
  57. if(!socket_connect($this->socket,$this->config['server'],$this->config['port']))
  58. {
  59. echo 'Verbinding met server kon niet tot stand worden gebracht.';
  60. exit();
  61. }
  62. echo 'Maken van verbinding...'."\n";
  63. if(!isset($this->config['identity']['ident']) || !isset($this->config['identity']['realname']) || !isset($this->config['identity']['nickname']))
  64. {
  65. echo 'Er missen vereiste gegevens. Weet u zeker dat u setIdentity(nickname, realname, ident) heeft gebruikt?';
  66. exit();
  67. }
  68. $this->write('USER '.$this->config['identity']['ident'].' 0 '.$this->config['server'].' :'.$this->config['identity']['realname']);
  69. $this->write('NICK '.$this->config['identity']['nickname']);
  70. $this->inChannel = false;
  71.  
  72. while($data = socket_read($this->socket,65000,PHP_NORMAL_READ))
  73. {
  74.  
  75. if($data == "\n") continue;
  76. $eData = explode(" ",$data);
  77. for($i = 0; isset($eData[$i]); $i++) {
  78. $eData[$i] = trim($eData[$i]);
  79. }
  80. echo $data."\n";
  81. if($this->inChannel == false && strstr($data,'MOTD'))
  82. {
  83. $this->write('JOIN '.$this->config['channel']);
  84. $this->inChannel = true;
  85. }
  86. if($eData[0] == 'PING') {
  87. $this->write('PONG '.$eData[1]);
  88. }
  89. if(isset($eData[3]) && preg_match('#:login#', $eData[3], $matches))
  90. {
  91. if($eData[1] == 'PRIVMSG')
  92. {
  93.  
  94. if(isset($this->config['owners'][$eData[4]]))
  95. {
  96. if($eData[5] == $this->config['owners'][$eData[4]])
  97. {
  98. $this->online_owners[$this->nickname($eData[0])] = $eData[4];
  99. $this->write('NOTICE '.$this->nickname($eData[0]).' : Je bent succesvol ingelogd!');
  100. print_r($this->online_owners);
  101. }
  102. else
  103. {
  104. $this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet');
  105. }
  106. }
  107. else
  108. {
  109. $this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet');
  110. }
  111. }
  112. }
  113. if($eData[1] == 'QUIT')
  114. {
  115. $nick = $this->nickname($eData[0]);
  116. if(isset($this->online_owners[$nick]))
  117. {
  118. unset($this->online_owners[$nick]);
  119. echo $nick.' is uitgelogd, zijn sessie is verwijderd!';
  120. }
  121. }
  122. if(isset($eData[3]) && preg_match('#:!(.*)#', $eData[3], $matches))
  123. {
  124. $name = $matches[1];
  125. if(isset($this->actions[$name]))
  126. {
  127.  
  128. $action = $this->actions[$name];
  129. $name = $action['function'];
  130. if($action['owner'])
  131. {
  132. $acces = false;
  133.  
  134. if( isset( $this->online_owners[$this->nickname($eData[0])] ) )
  135. {
  136. $acces = true;
  137. }
  138.  
  139. if($acces)
  140. {
  141. $name($this, $eData);
  142. }
  143. else
  144. {
  145. $this->write('NOTICE '.$this->nickname($eData[0]).' : Je hebt geen recht om deze actie uit te voeren!');
  146. }
  147. }
  148. else
  149. {
  150. $name($this, $eData);
  151. }
  152.  
  153. }
  154.  
  155. }
  156. }
  157. }
  158.  
  159. }


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:
  1. <?php
  2. require_once('ircbot.inc.php');
  3. $bot = new Ircbot('server', 6667, '#kanaal');
  4. $bot->setOwners(array('gebruiker1'=>'wachtwoord', 'gebruiker2'=>'anderwachtwoord'));
  5. $bot->setIdentity('Nickname', 'realname', 'ident');
  6. $bot->connect(); //Start de bot
  7. ?>


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:
  1. <?php
  2. $function = function($class, $data)
  3. {
  4. $string = trim(array_pop(explode('!google',$data[4])));
  5. $url = 'http://www.google.nl/search?hl=nl&q='.urlencode($string);
  6. $class->write('PRIVMSG #devhouse : Google Zoeken: '.$url);
  7. };
  8.  
  9. $bot->addAction('google', $function);
  10. ?>


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:
  1. $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:
  1. /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:
  1. <?php
  2. require_once('ircbot.inc.php');
  3. $bot = new Ircbot('irc.chatfactory.net', 6667, '#devhouse');
  4. $bot->setOwners(array('gbnaam'=>'wwoord'));
  5. $bot->setIdentity('Nickname', 'Realname', 'ident');
  6. $function = function($class, $data)
  7. {
  8. $string = trim(array_pop(explode('!google',$data[4])));
  9. $url = 'http://www.google.nl/search?hl=nl&q='.urlencode($string);
  10. $class->write('PRIVMSG #devhouse : Google Zoeken: '.$url);
  11. };
  12.  
  13. $bot->addAction('google', $function);
  14.  
  15. $function = function($class, $data)
  16. {
  17. $class->write('QUIT : Ik ga slapie doen!:P');
  18. exit();
  19. };
  20.  
  21. $bot->addAction('quit', $function, true);
  22. $bot->connect();
Download code! Download code (.txt)

 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (7)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.093s