begin process at 2010 02 10 13:22:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > BOT POUR L'IRC

BOT POUR L'IRC


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 988

Auteur : shown

Ecrire un message privé
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

 Sources du même auteur

CHAT CLIENT/SERVEUR
SCANNER DE PORT EN C

 Sources de la même categorie

Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta
PROXY IRC SIMPLE (WINDOWS/WINSOCK) par _michel

Commentaires et avis

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

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 :)

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+)

++

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+ ;)

Commentaire de BlackGoddess le 09/09/2004 16:08:27

tu peux utiliser select au lieu d'utiliser des threads

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

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

Commentaire de shown le 10/09/2004 04:15:55

je te remercie je vais aller voir ca ;)

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...

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...

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

Commentaire de Funzy78 le 23/09/2005 13:33:00

Slt,

C'est l'adresse du serveur

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 :)

Commentaire de CriPpLe le 08/10/2005 13:53:13

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

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 ?

Commentaire de nicerap le 30/04/2006 15:02:56

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

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...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales