Avatar billede boselbach Nybegynder
22. januar 2005 - 01:59 Der er 44 kommentarer og
1 løsning

IRC bot

Hej
Jeg kommer en del på irc og har programmert lidt tid i php, er der en der kender en god tutorial til hvordan man laver en irc bot i php, jeg har søgt på google og fundet en masse, men jeg kan ikke få det til at virke. Jeg håber der er en der kan hjælp.
Mvh
Bo
Avatar billede boselbach Nybegynder
22. januar 2005 - 02:12 #1
glemte lige at sige at jeg har prøvet at lave det her for at se om den bare kommer på..
<?
$server="eu.undernet.org";
$port="6667";
$nick="hejmeddig";
$channel="#qwertyui";
$realname="fanden";
$connect = fsockopen($server, $port);
if ($connect){
    echo "Der er hul igennem";
    fputs($connect, "NICK $nick");
    fputs($connect,"USER bo bo bo :$realname");
} else {
    echo "Der blev ikke oprettet forbindelse";
}
Den skriver at der er hul igennem men jeg kan ikke se den på irc.
Mvh
Bo
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 02:22 #2
Kører du det fra en browser ?
sockets scripts bør køres fra PHP cli (www.php.net/cli) (kommandopromt)

Elles kig på www.php.net/sockets og www.php.net/irc (ja, php har faktisk en IRC klasse :D )

Checker lige dit script i mellemtiden.
Avatar billede boselbach Nybegynder
22. januar 2005 - 02:28 #3
Jeg køre det fra en browser, og vil helst gøre det, ellers kan jeg godt køre det fra en kommando promt

Jeg kigger lige på de links du har skrevet
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 02:35 #4
Du SKAL faktisk gøre det fra CLI , da din bot ellers vil være online indtil du lukker jobbet i "joblisten" (hvis det er windåse).
Derudover vil din bot crashe efter max execution time (30 sek. normalt, angivet i php.ini).
Endnu en grund til at bruge CommandLineInterface (CLI) :D

Mht. dit script ville jeg nok lave så det skriver server output ud, så du kan se om det reaelt forbinder til netværket.
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 02:37 #5
Forresten, for at arbejde med IRC skal man læse en del om emnet, da det er en protokol.

Det hele står i RFC 1459 (IRC), som kan findes lige her: http://www.alleged.com/irc/rfc/
Avatar billede boselbach Nybegynder
22. januar 2005 - 03:07 #6
Hvor kan jeg downloade cli til windows?
Jeg ved godt at jeg skal gøre så jeg kan se server output, men jeg ville bare se om jeg kunne få den på serveren først.
Mvh Bo
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 03:16 #7
ikke nødvendig, du kan bare gå ind i kør og åbne cmd
og så skrive:

cd c:\php\
php c:\apache\htdocs\irc.php

Og så kører det scriptet for dig :) (Sådan ser det ud på min pc, sti og filnavn er sikert forskelligt.
Avatar billede boselbach Nybegynder
22. januar 2005 - 03:30 #8
ja nu har jeg fundet det :)
Men jeg kan stadigvæk ikke få den til at connecte, hvis jeg nu giver dig de her piont og hæver med 60 mere, kan jeg så få dig til at lave et lille eksempel på hvordan den bare logger på serveren og får et nick, resten skal jeg nok lave?
Mvh
Bo
Avatar billede boselbach Nybegynder
22. januar 2005 - 04:40 #9
jeg har lige fundet en god tutorial, som jeg vil følge men jeg har et lille problem
når jeg bruger socket_create får jeg følgende fejl: call to undefined function: socket_create ? hvordan overvinder jeg det problem?
Mvh Bo
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 04:43 #10
Eksempel:

<?

$server = "localhost";
$port = 6667;
$nick = "PHPBOT";
$channel = "#hej";
$realname = "st0ned";

$fp = fsockopen($server, $port, $errno, $errstr, $port);

if (!$fp)
{
  echo "$errstr ($errno)<br />\n";
}
else
{
  fwrite($fp,"NICK ".$nick."\n");
  fwrite($fp,"USER bo bo bo :".$realname."\n");
  while (!feof($fp))
  {
    echo fgets($fp, 128);
  }
  fclose($fp);
}

?>

Det connecter fint til min server via. kommandopromt, og bliver får så "Ping Timeout" fordi jeg ikke har lavet PingPong funktionen endnu ;-)

Mht. socket_create http://dk.php.net/socket_create
Avatar billede boselbach Nybegynder
22. januar 2005 - 04:56 #11
tak nu fik jeg den også til at connecte, du må lige skrive igen så jeg kan give dig point, hvordan giver jeg dig de andre point?
Mvh
Bo
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 08:13 #12
Nej tak, samler ikke på points.
Avatar billede boselbach Nybegynder
22. januar 2005 - 10:48 #13
Ok tak skal du have :)
Avatar billede boselbach Nybegynder
22. januar 2005 - 10:52 #14
hej igen jeg har lige et sidste spørgsmål hvis det er i orden, der står angående sockets at der ikke skal installeres nogle yderlige tind? hvorfor kan jeg så ikke få lov at oprette med socket_create?
Mvh Bo
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 11:12 #15
Din php udgave er sikkert for gammel, lav et denne her fil, og kald den info.php og giv mig et link

<?
phpinfo();
?>
Avatar billede boselbach Nybegynder
22. januar 2005 - 11:35 #16
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 12:43 #17
Har undersøgt lidt omkring den fejl.

Det skyldes at din php ikke har extensionen php_sockets.dll aktiveret.
Dette kan gøres ved at tilføje denne linje til php.ini

extension=php_sockets.dll
Avatar billede nyhuus Nybegynder
22. januar 2005 - 17:57 #18
Jeg har lige prøvet det, jeg kunne få den til og sige

look up your hostname, crashed

jeg tænkte på om der var en der ville smide et script så den kan komme på en irc channel, kan jeg ik lige få den til, jeg har prøvet lidt forskælligt
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 19:16 #19
det er da nemt nok, ifølge IRC RFC'en er kommandoen: JOIN #CHANNEL
så du laver bare sådan en her i php:

#channel = "The-Thunder-Team.Int";
fwrite($fp,"JOIN ".$channel."\n");
Avatar billede boselbach Nybegynder
22. januar 2005 - 19:20 #20
Jeg får følgende fejlnår jeg sætter den linje ind i php.ini
Unknown(): Unable to load dynamic library './php_sockets.dll - Det angivende modul blev ikke fundet.
Jeg har søgt efter php_socket.dll på min maskine men den eksistere ikke, ved du hvor jeg kan finde den?
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 19:26 #21
hvis du har installeret php i c:\php
så burde den ligge i C:\php\extensions

Og så skal der stå dette i php.ini

extension_dir = C:\PHP\extensions
Avatar billede boselbach Nybegynder
22. januar 2005 - 19:51 #22
der er ikke noget bibliotek der hedder extensions, kan det have noget at gøre med at jeg
installerede php med windows installer? det script di lavede virker fint, jeg kan bare ikke bruge socket_* hvilket jeg meget gerne ville :(
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 19:52 #23
lyder underligt, gider du skrive en liste over bibliotekerne ?

Og tvivler på det med windows installere, da jeg også selv har 2 test server på windows :) (installeret med installer)
Avatar billede boselbach Nybegynder
22. januar 2005 - 21:01 #24
uploadtemp, sessiondata, BACKUP
det er de biblioteker der er i c:\PHP

Det er de filer der er.
php4ts.dll, php.exe
Avatar billede alister_crowley Nybegynder
22. januar 2005 - 22:06 #25
okay, du har vist en meget ukomplet udgave af php.

De har åbenbart lavet en del om på deres pakker på det sidste, så den udgave du skal bruge er: http://www.php.net/get/php-4.3.10-Win32.zip/from/a/mirror
Avatar billede boselbach Nybegynder
22. januar 2005 - 23:16 #26
ok tak for det, jeg downloader den lige i morgen når jeg kommer hjem. Det er sku godt med en der ved nogle ting :)
Avatar billede nyhuus Nybegynder
23. januar 2005 - 02:31 #27
Hmm,, den siger ikke andet end

-----------------------------------------------
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
<br />
<b>Fantal error</b>: Maximun execution time of 30 seconds exceeded in <b>C:\irc.php</b> on line <b>23</b><br />
-----------------------------------------------

jeg har brugt denne kode i irc.php
-----------------------------------------------
<?

$server = "dk.quakenet.org";
$port = 6667;
$nick = "phpbottest";
$channel = "#phpbottest";
$realname = "phpbottest";
$hostname = "localhost";

$fp = fsockopen($server, $port, $errno, $errstr, $port);

if (!$fp)
{
  echo "$errstr ($errno)<br />\n";
}
else
{
  fwrite($fp,"NICK ".$nick."\n");
  fwrite($fp,"USER bo bo bo :".$realname."\n");
  fwrite($fp,"JOIN ".$channel."\n");
  while (!feof($fp))
  {
    echo fgets($fp, 128);
  }
  fclose($fp);
}

?>
-----------------------------------------------
Avatar billede thefff Nybegynder
23. januar 2005 - 12:38 #28
nyhuusdk koden mangler en ping pong ting
Avatar billede boselbach Nybegynder
23. januar 2005 - 13:31 #29
for at lave den ping pong til skal man vel skrive noget lign.

$input = fgest($fp,128);
$strinput = explode(" ", $input);
if ($strinput == "PING") {
fwrite($fp,"PONG\n");
}

jeg har ikke prøvet om det virker, jeg skal lige ordnet så jeg kan bruge socket_*
Avatar billede nyhuus Nybegynder
23. januar 2005 - 13:49 #30
Kunne du tænke dig og prøve og sætte det ind hvor der skal være, jeg er ikke lige selv verden bedsre til php endnu, da det ikke er særlig lang tid siden jeg startet med php
Avatar billede boselbach Nybegynder
23. januar 2005 - 14:42 #31
nyhuusdk.. som du kan se oprettede jeg spørgsmålet, jeg er ved at prøve at lave en php bot, men behøver selv lidt hjælp :)
Avatar billede boselbach Nybegynder
23. januar 2005 - 14:54 #32
alister_crowley
Hvordan hvordan havde du installeret det? kan jeg ikke bare kopiere de biblioteker jeg ikke har ind i min eksisterende installation og så aktivere php_socket.dll ? eller skal jeg installere det manuelt, da der jo ikke er en installer med?
Avatar billede boselbach Nybegynder
23. januar 2005 - 17:30 #33
jeg kan med den her kode få den til at logge på et netværk og få motd, men når jeg laver en whois på min bot er den der ikke? en der kan se hvad der er gået galt jeg burde da kunne lave en whois og se botten når den har fået motd

<?
$server = "us.undernet.org";
$port = 6667;
$nick = "hejmeddig";
$channel = "#minkanal";
$realname = "st0ned";

set_time_limit(0);
$fp = fsockopen($server, $port, $errno, $errstr, $port);

if (!$fp)
{
  echo "$errstr ($errno)\n";
}
else
{
  fwrite($fp,"NICK $nick\r\n");
  fwrite($fp,"USER bo bo bo :$realname\r\n");
  while (!feof($fp))
  {
    echo fgets($fp,128);
    $input = fgets($fp,128);
    $strinput = explode(" ", $input);
    if ($strinput[0] == "PING") { fwrite($fp,'PONG '.str_replace(':','',$strinput[1])."n");
}
}

  fclose($fp);
}


?>

mvh
Bo
Avatar billede alister_crowley Nybegynder
24. januar 2005 - 10:10 #34
lidt IRC info omkring Ping Pong

Nætværket sender denne linje:

PING 23105735  (hvor 23105735 er et random tal)
Herefter skal der inden for 2-3 sek. sendes:
PONG 23105735 (hvor 23105735 er det samme tal som ping sendte med)

Mht. den socket extension, så mener jeg bare at du skal pakke zip filen ud.
Ellers kan du hente denne her extention pakkke: www.thedeathart.dk/upload/extensions.zip

Det er den jeg bruger, under PHP v. 4.3.10
og så er det bare at tilføje den i php.ini :) (som ligger i c:\windows\ )

Kigger lige på dit script.
Avatar billede alister_crowley Nybegynder
24. januar 2005 - 10:21 #35
Byttede ligt rundt på rækkefølgen i dit script, og det virker fint hos mig..

<?
$server = "us.undernet.org";
$port = 6667;
$nick = "hejmeddig";
$channel = "#minkanal";
$realname = "st0ned";

set_time_limit(0);
$fp = fsockopen($server, $port, $errno, $errstr, $port);

if (!$fp)
{
  echo "$errstr ($errno)\n";
}
else
{
  fwrite($fp,"NICK $nick\r\n");
  fwrite($fp,"USER bo bo bo :$realname\r\n");
  while (!feof($fp))
  {
    $input = fgets($fp,128);
    $strinput = explode(" ", $input);
    if ($strinput[0] == "PING")
    {
      fwrite($fp,'PONG '.str_replace(':','',$strinput[1])."\n");
    echo fgets($fp,128);
    }
  }

  fclose($fp);
}


?>

Et whois retunerer:

hejmeddig is ~bo@217.74.217.54 * st0ned
hejmeddig using *.undernet.org The Undernet Underworld
hejmeddig End of /WHOIS list.
Avatar billede alister_crowley Nybegynder
24. januar 2005 - 10:47 #36
Men hov, nu skal jeg jo passe på jeg ikke laver alt det sjove ;-)
Er selv gået i gang med et størrer irc-bot, da den i java er færdig.
Avatar billede boselbach Nybegynder
24. januar 2005 - 12:22 #37
jeg kan også få den på nettet og joine en kanal

<?
$server = "us.undernet.org";
$port = 6667;
$nick = "fanden";
$channel = "#helvede";
$realname = "st0ned";
$joinmsg = "Fanden is here...";

set_time_limit(0);
$fp = fsockopen($server, $port, $errno, $errstr, $port);

if (!$fp)
{
  echo "$errstr ($errno)\n";
}
else
{
  fwrite($fp,"USER bo bo $server :$realname\r\n");
  fwrite($fp,"NICK $nick\r\n");
  sleep(1);
  while (!feof($fp))
  {
    echo fgets($fp,128);
    $input = fgets($fp,128);
    $strinput = explode(" ", $input);
    if ($strinput[0] == "PING") { fwrite($fp, "PONG %s\r\n", $strinput[1]);
    fwrite($fp,"JOIN $channel\n");
    fwrite($fp,"PRIVMSG $channel $joinmsg\r\n");
}
}
  fclose($fp);
}


?>

Men jeg har et problem, nogle gange vil den ikke komme på internettet, så får jeg bare denne besked: serverens navn : register first

451 ERR_NOTREGISTERED
    ":You have not registered"
   
    - Returned by the server to indicate that the client
    must be registered before the server will allow it
    to be parsed in detail.

Men på undernettet er der ikke noget med nick registering, så det er lige det problem jeg prøver at løse lige pt. men hvis du ved hvordan ville det være rart, da jeg næsten har revet alt håret af mig selv :))
Avatar billede alister_crowley Nybegynder
24. januar 2005 - 12:35 #38
Det som kanldes registering er dette her:

  fwrite($fp,"USER bo bo $server :$realname\r\n");
  fwrite($fp,"NICK $nick\r\n");

Så det er lidt underligt, hvis det bliver udført rigtigt.
Avatar billede boselbach Nybegynder
24. januar 2005 - 12:40 #39
ja som du kan se har jeg prøvet at skifte lidt ud i USER, og byttet om på række følgen, nogle gange kommer den på og joiner en kanal andre gange får jeg den besked..
pænt irreterende
Avatar billede alister_crowley Nybegynder
24. januar 2005 - 12:44 #40
out.println("USER " + botnick  + " none none : " +  RealName );
out.println();
out.println("NICK " + botnick);
out.println();

Sådan ser det ud i min java kommando, og det kan oversættes til dette php:

fwrite($fp,"USER ".$botnick." none none : ".$readname."\n");
fwrite($ftp,"NICK ".$botnick."\n");
Avatar billede boselbach Nybegynder
24. januar 2005 - 13:05 #41
skummelt, jeg fik den på ved at det jeg havde skrevet ud med fwrite($fp,"USER ".$botnick." none none : ".$readname."\n");
fwrite($ftp,"NICK ".$botnick."\n");
som du havde skrevet, men det var jo stort det sammen bare en anden måde at skrive det på!!
Men lige nu er den på, så kan jeg gå igang med kommandoer!
endnu engang tak :)

med hensyn til socket så har jeg udpakket den zip fil og lagt det i c:\php men det virker stadigvæk ikke, jeg får den her fejl meddelse: kunne ikke finde modulet php_socket.dll
Avatar billede alister_crowley Nybegynder
24. januar 2005 - 18:38 #42
findes mappen c:\php\extensions ?
og er extention_dir sat til c:\php\extension i php.int ?
Avatar billede boselbach Nybegynder
24. januar 2005 - 18:56 #43
nu virker det, det var bare  extention_dir der skulle sættes til den rigtige sti..
Tak :)
Avatar billede alister_crowley Nybegynder
24. januar 2005 - 22:37 #44
Husk at lægge et svar og acceptere det for at lukke spørgsmålet.
Avatar billede boselbach Nybegynder
24. januar 2005 - 23:09 #45
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester