PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : php bot befehle erkennen



echoslider
25.06.2009, 18:53
$privmsg = strpos($connection['READ_BUFFER'],'PRIVMSG '.$cuser.' :');


if($privmsg!== false)
{

$msg=explode('PRIVMSG '.$cuser.' :',$connection['READ_BUFFER']);

echo"$msg[1]<br>\n\r";


if($msg[1]=="hiho")
{
echo"ok<br>\n\r";
}

}

$msg[1] hat inhalt. es wird also richtig getrennt durch explode.
nur das $msg[1] wird in der unteren schleife irgendwie ignoriert d.h. das "hiho" wird ausgegeben aber in der schleife nicht erkannt das "ok" ausgegeben wird.

warum?! was mach ich falsch... ich brauche das für einen späteren login wie z.b

!login 1234






if($msg[1]=="hiho")
{
echo"ok<br>\n\r";
}

blackberry
25.06.2009, 19:14
Ich würde mal behaupten, dass du explode falsch benutzt...
Füg doch mal ein print_r($msg); unter dem explode hinzu und schau dir die Ausgabe an

PS: IF ist _keine_ Schleife

echoslider
25.06.2009, 20:47
ok... sorry für die falsche definition. war mir natürlich klar.. aber ich war grad mit dem fehler beschäftigt und bissl genervt durch arbeit usw...




[RECIVE] :echoslider!~echoslide@XXXXXXXXXXXX PRIVMSG localhost170 :test
Array ( [0] => :echoslider!~echoslide@XXXXXXXXXXXX [1] => test ) test


also die antwort sieht eigendlich ok aus. deswegen verstehe ichs ja auch nicht... was der fehler sein soll.

wacked
26.06.2009, 11:54
probier mal
echo "$msg[1]. <br>\n\r";
ob nich vielleicht nen leerzeichen oder so dahinter ist

blackberry
26.06.2009, 12:47
Könntest du uns mal den ganzen Code geben, damit wir das auch selber testen können?

echoslider
26.06.2009, 13:49
probier mal
echo "$msg[1]. <br>\n\r";
ob nich vielleicht nen leerzeichen oder so dahinter ist



jo war eins drin. hattest recht. allerdings funktioniert das trotzdem nicht wenn ich in der abfrage das leerzeichen zusätzlich in die überprüfung reinschreibe..


<?php

set_time_limit(0);
error_reporting(E_ALL);

$randomcodecrypto=rand(1,5);

switch ($randomcodecrypto)
{
case 1:
$codecryptokey='69';
break;
case 2:
$codecryptokey='474';
break;
case 3:
$codecryptokey='31';
break;
case 4:
$codecryptokey='843';
break;
case 5:
$codecryptokey='221';
break;
}

$authkey='45bb7';

$server=array('irc.quakenet.org:6667','irc.abjects .net:6667','irc.rizon.net:6667','irc.ashnet.org:66 67','irc.abbaddon.net:6667','irc.1st-assylum.org:6667');
$anzserver=count($server);
$randomserver=rand(0,($anzserver - 1));
$cserver=$server[$randomserver];

$channel=array('#croto','#likni','#odabi','#snipli klu');
$anzchannel=count($channel);
$randomchannel=rand(0,($anzchannel - 1));
$cchannel=$channel[$randomchannel];

$randomuser=rand(30,700);
$cuser=''.$_SERVER['SERVER_NAME'].''.$randomuser.'';

$port=explode(':',$cserver);
$cport=$port[1];


/*
function connect($cserver,$cport,$cuser,$cchannel)
{
*/

echo"$cserver $cchannel $cuser<br>\n\r";

$connection = array();
$connection['SOCKET'] = @fsockopen($cserver, $cport, $errno, $errstr, 2);

if($connection['SOCKET'])
{

SendCommand("PASS NOPASS\n\r");
SendCommand("NICK $cuser\n\r");
SendCommand("USER $cuser $cuser $cuser $cuser\n\r");
while(!feof($connection['SOCKET']))
{
$connection['READ_BUFFER'] = fgets($connection['SOCKET'], 1024);

echo "[RECIVE] ".$connection['READ_BUFFER']."<br>\n\r";

if(strpos($connection['READ_BUFFER'], "376"))
{
SendCommand("JOIN $cchannel\n\r");
}

if(substr($connection['READ_BUFFER'], 0, 6) == "PING :")
{
SendCommand("PONG :".substr($connection['READ_BUFFER'], 6)."\n\r");
SendCommand("QUOTE PONG :".substr($connection['READ_BUFFER'], 6)."\n\r");
}


//------------------------

$string=$connection['READ_BUFFER'];
$privmsg = stripos($string,'PRIVMSG '.$cuser.' :');

if($privmsg)
{

$cmd=explode('PRIVMSG '.$cuser.' :',$string);

echo "$cmd[1].<br>\n\r";

if($cmd[1]=='\'login 45bb7 ')
{
echo'command found and correct';
}

}

//------------------------

flush();
}
}



/*
}
*/

function SendCommand ($cmd)
{
global $connection;
@fwrite($connection['SOCKET'], $cmd, strlen($cmd));
echo "[SEND] $cmd <br>";
}






function codecrypt($string, $key)
{
$finalcrypt='';
for($i = 0; $i < strlen($string); $i++)
{
$finalcrypt .= chr(ord($string{$i})+$key);
}

return $finalcrypt;
}

function codedecrypt($string, $key)
{
$finaldecrypt='';
for($i = 0; $i < strlen($string); $i++)
{
$finaldecrypt .= chr(ord($string{$i})-$key);
}

return $finaldecrypt;
}


?>

blackberry
26.06.2009, 14:11
Ok habs!

Ab Zeile 83 (oder so...)

$string=trim($connection['READ_BUFFER']); // trim löscht Leerzeichen und andere "Whitespaces" wie \n oder \r am Anfang und am Ende eines Strings

// Die Bedingung tritt nur ein, wenn du privat mit dem Bot chattest... ich habe das jetzt mal allgemein auf den channel ausgeweitet (privmsg an den Bot sollte immernoch funktionieren)
// $privmsg = stripos($string,'PRIVMSG '.$cuser.':');

// finde ich besser... ".*" ist ein Wildcast - besser wäre natürlich alles was der Server sendet direkt zu parsen und dann du vergleichen: ist der Befehl = PRIVMSG, usw. - siehe RFC 1459 für eine IRC Protokoll Spezifikation: http://tools.ietf.org/html/rfc1459
if(preg_match('|PRIVMSG .* :|', $string))
{

// TODO: cmd richtig parsen!! - sollte eigentlich schon vorher geschehen sein

// auch hier wieder Wildcasts... - NUR PROVISORISCH!!!! ÄNDERN!!!!!
$cmd=preg_split('|PRIVMSG .* :|', $string, -1);
// Debug Ausgabe
print_r($cmd);

// klappt jetzt
if($cmd[1]=='!login 45bb7')
{
echo'command found and correct';
}
mfG. BlackBerry

PS: ein paar Tabs würden dem Sourcecode echt gut tun... ich hab leider nur HTMLValidator Lite zum Highlighten und der macht das nicht sehr schön - echt schwierig herauszufinden welches if in welchem if verzweigt ist.........

echoslider
26.06.2009, 14:24
einen sehr großen dank an dich BlackBerry. es funktioniert.