Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BOT POUR L'IRC


Information sur la source

Catégorie :Réseaux & Internet Niveau : Débutant Date de création : 07/09/2004 Date de mise à jour : 07/09/2004 14:15:51 Vu : 5 711

Note :
7,78 / 10 - par 9 personnes
7,78 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

Description

Ce code est simplifié pour simplement se connecter sur un serveur et un channel donné puis répondre à un mot reçu.
Il sera ensuite facile de rajouter des fonctions ou des mots le faisant parler...
 

Source

  • #include <stdio.h> // printf
  • #include <conio.h> // getche()
  • #include <string.h> // strlen (compter caracteres)
  • #include <winsock2.h> // socket
  • #pragma comment(lib, "ws2_32.lib")
  • int main(int argc, char* argv[])
  • {
  • /* on initialise notre winsock */
  • WSADATA WSAData;
  • WSAStartup(MAKEWORD(2,0), &WSAData);
  • /* fin d'initialisation */
  • /* on construit notre socket */
  • SOCKET sock;
  • SOCKADDR_IN sin;
  • char buffer[BUFSIZ];
  • char *ptr;
  • char msg[256];
  • sock = socket(AF_INET, SOCK_STREAM, 0);
  • sin.sin_addr.s_addr = inet_addr("62.23.9.122");
  • sin.sin_family = AF_INET;
  • sin.sin_port = htons(6667);
  • /* fin de la construction du socket */
  • /* déclaration variables */
  • char nickbot[30]="shownbot"; //nick à modifier
  • char channel[20]="#hackplanet"; //channel à rejoindre
  • char serveur[30]="62.23.9.122"; //ip du serveur irc
  • char user[50]="lol lol lol :shownbot";
  • // nick autorisé a fermer le bot
  • char *autorize=":Shown!"; // ne pas toucher au ':' et au '!'
  • /* on connecte le socket sur le serveur et le chan */
  • connect(sock, (SOCKADDR *)&sin, sizeof(sin));
  • sprintf (buffer, "NICK %s\n", nickbot);
  • send (sock, buffer, strlen (buffer), 0);
  • sprintf (buffer, "USER %s\n", user);
  • send (sock, buffer, strlen (buffer), 0);
  • sprintf (buffer, "JOIN %s\n", channel);
  • send (sock, buffer, strlen (buffer), 0);
  • sprintf (buffer, "PRIVMSG %s :yop :-)\n", channel); //message envoyé lors de l'arrivée sur le channel
  • send (sock, buffer, strlen (buffer), 0);
  • /* fin de la connexion au socket */
  • /* on commence une boucle infinie */
  • while (1) {
  • memset(buffer, '\0', BUFSIZ); //on vide le buffer
  • recv(sock, buffer, BUFSIZ-1, 0);
  • printf("%s",buffer);
  • /* gestion des pings */
  • if (strstr(buffer, "PING :"))
  • {
  • ptr = strstr(buffer, "PING :") + strlen("PING :");
  • snprintf(msg, 256, "PONG :%s\n", ptr);
  • send(sock, msg, strlen(msg), 0);
  • }
  • /* fin de gestion des pings */
  • /* --------------------animation du channel-------------------- */
  • /* boucles pour les reponses auto */
  • if (strstr(buffer, "salut"))
  • {
  • ptr = strstr(buffer, "salut");
  • snprintf(msg, 256, "PRIVMSG %s :plop\n", channel);
  • send(sock, msg, strlen(msg), 0);
  • }
  • if (strstr(buffer, "merci"))
  • {
  • ptr = strstr(buffer, "merci");
  • snprintf(msg, 256, "PRIVMSG %s :de rien ;-)\n", channel);
  • send(sock, msg, strlen(msg), 0);
  • }
  • //on ferme le socket si on envoie "!close" et si c'est le
  • //propriétaire qui a lancé la commande.
  • if ((strstr(buffer, autorize)) && (strstr(buffer, "!close")))
  • {
  • ptr = strstr(buffer, "!close");
  • {
  • WSACleanup();
  • closesocket(sock);
  • }
  • }
  • /* ---------------------fin de l'animation--------------------- */
  • } //fin de la boucle infinie
  • } //fin du programme
#include <stdio.h>    // printf
#include <conio.h>    // getche()
#include <string.h>   // strlen (compter caracteres)
#include <winsock2.h> // socket
#pragma comment(lib, "ws2_32.lib")



int main(int argc, char* argv[])
{

/* on initialise notre winsock */
	WSADATA WSAData;
	WSAStartup(MAKEWORD(2,0), &WSAData);
/* fin d'initialisation */

	
/* on construit notre socket */
	SOCKET sock;
	SOCKADDR_IN sin;
	char buffer[BUFSIZ];
	char *ptr;
	char msg[256];

	sock = socket(AF_INET, SOCK_STREAM, 0);


	sin.sin_addr.s_addr = inet_addr("62.23.9.122");
	sin.sin_family	    = AF_INET;
	sin.sin_port	    = htons(6667);
/* fin de la construction du socket */


/* déclaration variables */

char nickbot[30]="shownbot"; //nick à modifier
char channel[20]="#hackplanet"; //channel à rejoindre
char serveur[30]="62.23.9.122"; //ip du serveur irc
char user[50]="lol lol lol :shownbot";

// nick autorisé a fermer le bot
char *autorize=":Shown!"; // ne pas toucher au ':' et au '!'

/* on connecte le socket sur le serveur et le chan */
	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
	
	sprintf (buffer, "NICK %s\n", nickbot);
	send (sock, buffer, strlen (buffer), 0);
	
	sprintf (buffer, "USER %s\n", user);
	send (sock, buffer, strlen (buffer), 0);
	
	sprintf (buffer, "JOIN %s\n", channel);
	send (sock, buffer, strlen (buffer), 0);
	
	sprintf (buffer, "PRIVMSG %s :yop :-)\n", channel); //message envoyé lors de l'arrivée sur le channel
	send (sock, buffer, strlen (buffer), 0);
	
   
     /* fin de la connexion au socket */
    
/* on commence une boucle infinie */
  while (1) {
   	memset(buffer, '\0', BUFSIZ); //on vide le buffer
	recv(sock, buffer, BUFSIZ-1, 0);
   	printf("%s",buffer);

    /* gestion des pings */
    if (strstr(buffer, "PING :"))
         {
         ptr = strstr(buffer, "PING :") + strlen("PING :");
         snprintf(msg, 256, "PONG :%s\n", ptr);
         send(sock, msg, strlen(msg), 0);
         }
    
    /* fin de gestion des pings */

    /* --------------------animation du channel-------------------- */

      /* boucles pour les reponses auto */
     if (strstr(buffer, "salut"))
          {
          ptr = strstr(buffer, "salut");
          snprintf(msg, 256, "PRIVMSG %s :plop\n", channel);
          send(sock, msg, strlen(msg), 0);
          }
      
     if (strstr(buffer, "merci"))
          {
          ptr = strstr(buffer, "merci");
          snprintf(msg, 256, "PRIVMSG %s :de rien ;-)\n", channel);
          send(sock, msg, strlen(msg), 0);
          }
     
     //on ferme le socket si on envoie "!close" et si c'est le
     //propriétaire qui a lancé la commande.
     if ((strstr(buffer, autorize)) && (strstr(buffer, "!close")))                    		          
          {
          ptr = strstr(buffer, "!close");
                  {
                  WSACleanup();
                  closesocket(sock);
                  }
          }


    /* ---------------------fin de l'animation--------------------- */



} //fin de la boucle infinie

} //fin du programme

Conclusion

Ce bot fonctionne parfaitement avec Dev-C++, il répond aux PING; vous n'avez qu'à modifier le nick, le channel, et le serveur pour la connexion.
Vous pouvez facilement l'améliorer par exemple pour le faire changer de nick il vous suffit d'ajouter :
if (strstr(buffer, "!nick ")){
         ptr = strstr(buffer, "!nick ") + strlen("!nick ");
         snprintf(msg, 256, "NICK :%s\n", ptr);
         send(sock, msg, strlen(msg), 0);
         }
Donc si vous tapez "!nick bob" sur le channel ou en privé le bot prendra le nom "bob".
Si vous avez d'autres propositions mais que vous ne parvenez pas à la coder, dites-le moi je ferai de mon mieux pour vous aider ;-)

 

Historique

07 septembre 2004 02:32:14 :
Changement de catégorie
07 septembre 2004 14:15:51 :
Correction proposée par cosmobob + fermeture du bot controlée par le propriétaire

Commentaires et avis

signaler à un administrateur
Commentaire de Psyc0s le 07/09/2004 03:09:37

Si je peux te donner une sugestion:

Utilise les thread pour remplacer ta boucle infini

signaler à un administrateur
Commentaire de shown le 07/09/2004 03:11:37

Oui je sais ca serait pas mal, mais va falloir que je les apprenne.
Mais dés que je saurais faire je mettrai la mise à jour :)

signaler à un administrateur
Commentaire de magic_Nono le 07/09/2004 11:56:51

l'idée de base est bonne

sa réalisation elle demande a etre vraiement amélioré

après, restera à y intégrer une IA....

comme pour les agents du 2e monde...
(Canal+)

++

signaler à un administrateur
Commentaire de cosmobob le 07/09/2004 12:30:55

tu devrais tester si le resultat de recv n'est pas SOCKET_ERROR, sinon ta boucle infinie va faire ramer ton pc !
de plus ya un probleme avec le printf("%s",buffer), car buffer n'est pas assuré de se terminer par un 0. pour que ca soit le cas, tu dois faire 'recv(sock, buffer, BUFSIZ-1, 0);' (ce qui revient a dire a recv de ne pas toucher le dernier octet de buffer, qui a été mis a 0 à la ligne juste avant).

a+ ;)

signaler à un administrateur
Commentaire de BlackGoddess le 09/09/2004 16:08:27

tu peux utiliser select au lieu d'utiliser des threads

signaler à un administrateur
Commentaire de shown le 09/09/2004 16:25:44

merci BlackGoddess mais si tu pouvais m'en dire un peu plus sur select... je connais pas du tout

signaler à un administrateur
Commentaire de BlackGoddess le 09/09/2004 17:27:55

select permet de voir s'il y a des "évènements" nécéssitant d'etre traité sur un ou plusieurs sockets : si des données sont recues, si des données ont été envoyées ou si une erreur est survenu.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/select_2.asp

signaler à un administrateur
Commentaire de shown le 10/09/2004 04:15:55

je te remercie je vais aller voir ca ;)

signaler à un administrateur
Commentaire de ttard le 13/09/2004 12:53:49

c que j aimerai parler chinois comme vous :)
non sans deconner vous connaissez des sites ou on peut apprendre votre "langue"? parcke des fois ca me serai bien utile de comprendre les subtilités liées a l irc...

signaler à un administrateur
Commentaire de magic_Nono le 13/09/2004 13:26:08

pose des questions précise, on répondra au mieux
ou on te redirigeras...

signaler à un administrateur
Commentaire de VolaiL le 08/02/2005 20:49:44

Hmmm, je dois avoir du mal, mais j'arrive pas a utiliser ce code. Je compile avec Dev C++ sous windows. J'ai remplacé le
#pragma comment(lib, "ws2_32.lib")  par la commande "-lws2_32" du compilateur car je n'avais pas le .lib
Ca a marché, le programme compile bien, mais il le bot ne rejoint pas le chan irc sur lequel je suis. Et il y a bien un problème puisque le programme s'éxécute instantannément alors que j'imagine que la connexion au serveur prend un peu de temps.

Je n'ai pas du tout touché au code source, excepté :

char nickbot[30]="VolaiLbot"; //nick à modifier
char channel[20]="#bot.Poulailler"; //channel à rejoindre
char serveur[30]="jubiigames.dk.quakenet.org"; //ip du serveur irc
char user[50]="lol lol lol :VolaiLbot";

et aussi le paramètre suivant de la socket :
sin.sin_addr.s_addr = inet_addr("80.11.134.235"); //Faut il mettre l'adresse de sa machine ou bien l'adresse du serveur irc ?

Je suis un peu paumé la :x

signaler à un administrateur
Commentaire de Funzy78 le 23/09/2005 13:33:00

Slt,

C'est l'adresse du serveur

signaler à un administrateur
Commentaire de CriPpLe le 06/10/2005 23:49:32

Salut, en changeant les deux ip par 193.27.78.5 pour me connecter au réseau quakenet, je n'arrive pas à me connecter au serveur.
Il semble y avoir des erreurs aux niveaux des identifications d'USER, enfin d'après les messages affichés, est ce que tu saurais comment résoudre ce problème ?

Sinon merci pour la source :)

signaler à un administrateur
Commentaire de CriPpLe le 08/10/2005 13:53:13

Re, visiblement c'est un problème de réponse au PING :s

signaler à un administrateur
Commentaire de logant83 le 10/03/2006 18:29:52

Bonsoir, voila alors ton code ma donné une idée enfaite mais quand j'essay a ma facon j'arrive a rien, je mexplique.

J'aimerais pouvoir établir un link (relié un server socket ou dessus on met des robot, genre comme fait anope tu vois ?)

alors j'ai fait ceci:

  connect(sock, (sockaddr *)&sin, sizeof(sin));
  sprintf(buffer, "PROTOCTL NICKv2 VHP UMODE2 NICKIP SJOIN SJOIN2 SJ3 NOQUIT TKLEXT SJB64");
    sprintf(buffer, "PASS :mypass");  
    sprintf(buffer, "SERVER irc.fock.fr 1 :fock");

mais j'ai simplement sa qui s'affiche:
:irc.chatsl.org NOTICE AUTH :*** Looking up your hostname...
:irc.chatsl.org NOTICE AUTH :*** Couldn't resolve your hostname; using your IP a
ddress instead

et la tous se stop... comme si il recevait pas les infos ou sois je mis prend male...

Peut tu m'aider ?

signaler à un administrateur
Commentaire de nicerap le 30/04/2006 15:02:56

Quand je compile ton code il me donne plusieurs erreur de type [linker error}...

signaler à un administrateur
Commentaire de open le 11/06/2007 21:05:44

Heu salut, j'ai compilé ta source et j'ai plein d'erreur [Link Error] style :  [Linker error] undefined reference to `WSAStartup@8'
  [Linker error] undefined reference to `socket@12'
  [Linker error] undefined reference to `inet_addr@4'   [Linker error] undefined reference to `htons@4' ...

Voilà , c'est du à quoi et que puis-je faire pour résoudre mon problèmes ?

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,889 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.