Irc-bot

ToPPer

Mitglied
Hallo Zusammen!

Ein Freund sagte mir, dass es einen IRC BOT in PHP gäbe! Ich wollt gerne mal wissen wo es den gibt, und wie man den Konfiguriert! Ich hab mir schon mal einen Pbotty oder so hieß der angesehen, aber da bin ich absolut nicht durchgestiegen!

Gibt es jemanden der sowas am laufen hat ?

ToPPer
 
das problem ist aber, dass ich weder nach irc, noch nach bot geschweige denn nach php suchen kann! Isn bissel blöde!

ToPPer
 
Also ich hab jetzt gesucht, und nur ein einziges Script gefunden! Das ist ein 100 zeiliger Text, der noch nicht einmal irgendwelche Befehle für den Bot beinhaltet und ich auch net schlau werde wie man dort welche anfügt! ich poste hier einfahc noch mal den Code, dass jeder mal bitte seinen Senf zu diesem Script geben kann!

PHP:
<?
    // Set the PHP Timeout to 0, so we wont get killed by PHP
    set_time_limit(0);

    // define \r\n for easy use
    define ('CRLF', "\r\n");

    // Just some variables we need to connect
    $nick = 'Bot'; // The nick
    $username = '-Bot-'; // The Username (username@hostname)
    $localhost = 'localhost'; // The localhost, this dosen't really metter, the server will find the right one, or use your IP.
    $remotehost = 'irc.server.de'; // The server we are connecting to
    $realname = 'BOT'; // Your realname, (real my ass<img src="images/smilies/wink.gif" border="0" alt="">
    $channel = '#testchan'; // Channel we join to on connect



    // Open the socket
    $fp = fsockopen($remotehost,6667, &$err_num, &$err_msg, 30);

    if(!$fp) { // Error trying to connect
        print "Sorry, the server is not currently available!";
        exit;
    }

    // Send the connect data (This is a part of the IRC RCF, read it if you are going to code more irc stuff)
    $Header = 'NICK ' . $nick . CRLF;
    $Header .= 'USER ' . $username . ' ' . $localhost . ' ' . $remotehost . ' :' . $realname . CRLF;
    fputs($fp, $Header);

    // define response as a variable, so we wont get a error.
    $response = '';
    while (!feof($fp)) { // Make a while loop untill the socket is closed
        $response .= fgets($fp, 1024); // Append 1024 bytes to $response (if any), from the socket buffer
        while (substr_count($response,CRLF) != 0) { // Check if there is CRLF (linesplit) in $response, and do that untill none
            $offset = strpos($response, CRLF); // Just to know where the line ends
            $data = substr($response,0,$offset); // Split the line from the rest of the data
            $response = substr($response,$offset+2); // Split the rest from the line
            if ( substr($data,0,1) == ':' ) { // If the first char is : then go to this loop
                // Lines starting whit : are in this format
                // :sender command :text
                // So we need to split it like that

                $offsetA = strpos($data, ' '); // Find first space
                $dFrom = substr($data,1,$offsetA-1); // set $dFrom as the sender
                $offsetB = strpos($data, ' :'); // Find the first :
                $dCommand = substr($data,$offsetA+1,$offsetB-$offsetA-1); // Set $dCommand as the command
                $dText = substr($data,$offsetB+2); // set $dText as the text.

                if ( substr($dCommand,0,3) == '004' ) {
                    // This is just a part of the connect headers that the server send. (001,002,003,004,005)
                    // Some server dont send 005, so i use 004 to know if i´m connected
                    fputs($fp,'JOIN ' . $channel . CRLF); // Join $channel
                    fputs($fp,'PRIVMSG ' . $master . ' Es funzt!' . CRLF);
                }
                elseif ( substr($dCommand,0,7) == 'PRIVMSG' ) {
                    // If somebody msgs us, or if there is some tolk on a channal, this is send.

                    if ( Ord(substr($dText,0,1)) == 1 ) {
                        //  If first chars acsii code is 1 then its a CTCP question.
                        if ( substr($dText,1,4) == 'PING' ) {
                            // Sombody CTCP pinged us, lets respond
                            fputs($fp,':' . $nick . ' NOTICE ' . $dFrom . ' :' . chr(1) . 'PING ' . substr($dText,6) . chr(1) . CRLF);
                        }
                        elseif ( substr($dText,1,7) == 'VERSION' ) {
                            // Somebody versiond us, lets respond
                            fputs($fp,':' . $nick . ' NOTICE ' . $dFrom . ' :' . chr(1) . 'VERSION PHPirc' . chr(1) . CRLF);
                        }
                        if ( substr($dText,1,5) == 'CLOSE' ) {
                            // Reaktion auf "/ctcp [botname] close"
                            fclose ($fp); //close socket
                        }
                    }
                    else {
                        // Else, do this. This is just a relay of all privemsg sent to use, will go right to the server.
                        // so we can send RAW message for testing<img src="images/smilies/smile.gif" border="0" alt="">
                        fputs($fp,$dText . CRLF);
                    }
                }

            }
            elseif ( substr($data,0,4) == 'PING' ) { // Else if first 4 chars are PING do this
                // If the server pings us, respond. This must be done or we will get timeout
                fputs($fp,'PONG ' . substr($data,5) . CRLF);
            }
        }
    }
    // If we are here, then the server has disconnected use

    // Close the socket
    fclose ($fp);
?>
 
den code hab ich gepostet....hab ihn aber auch nur von wo anders und noch das /ctcp close eingefügt. das ist nur die rohversion, der connecten in den definierten channel und gut. mehr nicht. alles, was du willst, muss du einbauen...;-)
 
Jo das es geht weiss ich, jedoch das "wie" ist entscheident! Währe cool, wenn du dich ma über ICQ 103302362 bei mir melden könntest!

Es ist doch auch korrekt, dass der Bot das IRC nur über den /ctcp close befehl verlässt oder ? Nicht wenn man das Script zu macht oder ?

ToPPer
 
nein der bot verlässt den chat nur mit ctcp close. da timeout auf 0 ist und eine endlos schleife durchlaufen wird die erst durch close geschlossen wird läuft das script unendlich lange %)
 
aber wie baue ich jetzt da funktionen ein?? Ich bin nicht so der php profi! macht doch mal einer ein einfaches beispiel! ZB wenn einer re sagt, dass der bot dann Welcome Back $user sagt!

ToPPer
 
hmmm

also der bot funktioniert soweit relativ gut (er macht ja nicht viel :) ), aber dabei stieß ich auf folgendes problem:

ich würde gern eine suchfunktion für google.com integrieren, die den 1. hit einer suchanfrage ausspuckt, also den bot nach "!google suchstring" parsen lassen und dann die entsprechende google-seite öffnen und den 1. hit auslesen.

aber der hund liegt in der nötigen 2. fsockopen / fopen - routine begraben, denn der bot ist ja per fsockopen mit dem server verbunden, wenn nun eine 2. verbindung geöffnet wird, wird sofort die 1. beendet und der bot fliegt... :(

wie kann man so etwas lösen ???
 
Zuletzt bearbeitet:
Zurück