<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.hackbbs.org/index.php?action=history&amp;feed=atom&amp;title=BotPub</id>
	<title>BotPub - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hackbbs.org/index.php?action=history&amp;feed=atom&amp;title=BotPub"/>
	<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=BotPub&amp;action=history"/>
	<updated>2026-06-02T00:29:01Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.42.0-alpha</generator>
	<entry>
		<id>https://wiki.hackbbs.org/index.php?title=BotPub&amp;diff=94390&amp;oldid=prev</id>
		<title>Neomoloch : Bot pour la pub</title>
		<link rel="alternate" type="text/html" href="https://wiki.hackbbs.org/index.php?title=BotPub&amp;diff=94390&amp;oldid=prev"/>
		<updated>2024-09-17T21:35:06Z</updated>

		<summary type="html">&lt;p&gt;Bot pour la pub&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Code a enregistrer dans un fichier .js:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const irc = require('irc');&lt;br /&gt;
&lt;br /&gt;
const fs  = require('fs');      // pour écrire dans système de fichier&lt;br /&gt;
&lt;br /&gt;
const axios = require('axios');&lt;br /&gt;
&lt;br /&gt;
const sleep = require('system-sleep');&lt;br /&gt;
&lt;br /&gt;
// Tableau de strings qui contiendra l'historique des 10 derniers messages reçus&lt;br /&gt;
&lt;br /&gt;
let messages = [];&lt;br /&gt;
&lt;br /&gt;
// String variable used to contain GPT's answer&lt;br /&gt;
&lt;br /&gt;
let results = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
// Variable de comptage pour le fichier 'GPT.log'&lt;br /&gt;
&lt;br /&gt;
let count = 0;&lt;br /&gt;
&lt;br /&gt;
// Variable qui contiendra le client iRC&lt;br /&gt;
&lt;br /&gt;
let client = null;&lt;br /&gt;
&lt;br /&gt;
async function validateArguments(nickname, message) {&lt;br /&gt;
&lt;br /&gt;
   const nicknameBoundary = /^[A-Za-z0-9-]{3,20}$/;&lt;br /&gt;
&lt;br /&gt;
   if (!nickname || nickname.length &amp;lt; 3 || nickname.length &amp;gt; 20) {&lt;br /&gt;
&lt;br /&gt;
       console.error('[!] Nickname is too large, it must be between 3 and 20 characters long');&lt;br /&gt;
&lt;br /&gt;
       process.exit(1);&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   if (!nicknameBoundary.test(nickname)) {&lt;br /&gt;
&lt;br /&gt;
       console.error('[!] The nickname contains invalid characters!');&lt;br /&gt;
&lt;br /&gt;
       process.exit(1);&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   if (!message || message.length === 0 || message.length &amp;gt; 500) {&lt;br /&gt;
&lt;br /&gt;
       console.error(`[!] The message to send is too long or empty!`);&lt;br /&gt;
&lt;br /&gt;
       process.exit(1);&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const nickname = process.argv[2];&lt;br /&gt;
&lt;br /&gt;
const message  = process.argv[3];&lt;br /&gt;
&lt;br /&gt;
const password = process.env.IRC_PASSWORD;&lt;br /&gt;
&lt;br /&gt;
const GPT_API  = process.env.GPT_API_KEY;&lt;br /&gt;
&lt;br /&gt;
validateArguments(nickname, message);&lt;br /&gt;
&lt;br /&gt;
// Configuration du client iRC&lt;br /&gt;
&lt;br /&gt;
const servers = [&lt;br /&gt;
&lt;br /&gt;
   {&lt;br /&gt;
&lt;br /&gt;
       server: 'irc.quakenet.org',&lt;br /&gt;
&lt;br /&gt;
       channels: ['#psychonautfr', '#01', '#02', '#03', '#04', '#05', '#06', '#07', '#08'],&lt;br /&gt;
&lt;br /&gt;
       botName: nickname&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /*{&lt;br /&gt;
&lt;br /&gt;
       server: 'openirc.snt.utwente.nl',&lt;br /&gt;
&lt;br /&gt;
       channels: ['#070', '#071', '#072', '#073', '#074', '#075', '#076', '#077'],&lt;br /&gt;
&lt;br /&gt;
       botName: nickname&lt;br /&gt;
&lt;br /&gt;
   }*/&lt;br /&gt;
&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
async function connectToServer(serversConfig) {&lt;br /&gt;
&lt;br /&gt;
   return new Promise((resolve, reject) =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
       // Création du client iRC&lt;br /&gt;
&lt;br /&gt;
       const client = new irc.Client(&lt;br /&gt;
&lt;br /&gt;
           serversConfig.server,&lt;br /&gt;
&lt;br /&gt;
           serversConfig.botName,&lt;br /&gt;
&lt;br /&gt;
           { channels: serversConfig.channels }&lt;br /&gt;
&lt;br /&gt;
       );&lt;br /&gt;
&lt;br /&gt;
       // Evenement lors de la connexion&lt;br /&gt;
&lt;br /&gt;
       client.addListener('registered', () =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
           console.log(`[+] Connected to ${serversConfig.server} with ${serversConfig.botName} and ready to send messages.`);&lt;br /&gt;
&lt;br /&gt;
           client.addListener('join', (channel, nick) =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
               if (nick === serversConfig.botName) {&lt;br /&gt;
&lt;br /&gt;
                   console.log(`[i] The bot has joined ${channel} on ${serversConfig.server}`);&lt;br /&gt;
&lt;br /&gt;
                   client.say(channel, message);&lt;br /&gt;
&lt;br /&gt;
                   console.log(`[+] Message sent to ${channel} on ${serversConfig.server}\n`);&lt;br /&gt;
&lt;br /&gt;
               }&lt;br /&gt;
&lt;br /&gt;
           });&lt;br /&gt;
&lt;br /&gt;
           resolve(client);&lt;br /&gt;
&lt;br /&gt;
       });&lt;br /&gt;
&lt;br /&gt;
       // Evenements pour les messages reçus&lt;br /&gt;
&lt;br /&gt;
       client.addListener('message', (from, to, msg) =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
           if (typeof msg == 'string' &amp;amp;&amp;amp; msg.length &amp;lt; 500) {&lt;br /&gt;
&lt;br /&gt;
               console.log(`[i] ${serversConfig.server}: ${from} =&amp;gt; ${to}: ${msg}`);&lt;br /&gt;
&lt;br /&gt;
               appendMessagesToLog(from, to, msg);&lt;br /&gt;
&lt;br /&gt;
               if (messages.length &amp;gt;= 10)&lt;br /&gt;
&lt;br /&gt;
                   messages.shift();&lt;br /&gt;
&lt;br /&gt;
               messages.push(`${from}: ${msg}`);&lt;br /&gt;
&lt;br /&gt;
           } else {&lt;br /&gt;
&lt;br /&gt;
               console.warn('[!] Received message is too large!');&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
       });&lt;br /&gt;
&lt;br /&gt;
       // Evenements lors de la déconnexion&lt;br /&gt;
&lt;br /&gt;
       client.addListener('error', (msg) =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
           console.error('[!] ', msg);&lt;br /&gt;
&lt;br /&gt;
           reject(msg);&lt;br /&gt;
&lt;br /&gt;
       });&lt;br /&gt;
&lt;br /&gt;
       resolve(client);&lt;br /&gt;
&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour envoyer la requête a GPT afin d'analyser les messages reçus&lt;br /&gt;
&lt;br /&gt;
async function sendRequestToGPT(messages) {&lt;br /&gt;
&lt;br /&gt;
   const { ChatGPTAPI } = await import('chatgpt');&lt;br /&gt;
&lt;br /&gt;
   const api = new ChatGPTAPI({&lt;br /&gt;
&lt;br /&gt;
       apiKey: GPT_API,&lt;br /&gt;
&lt;br /&gt;
       completionParams: {&lt;br /&gt;
&lt;br /&gt;
           model: 'gpt-3.5-turbo',&lt;br /&gt;
&lt;br /&gt;
           temperature: 1.3&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   const prompt = messages.join('\n');&lt;br /&gt;
&lt;br /&gt;
   const request_p1 = `Generate a custom message to promote HackBBS hacking community. The message should invite people to join HackBBS community of hacker to learn about hacking and participate to activities. The message must promote HackBBS's iRC channel on hackint server #hackbbs and contain the link &amp;quot;&amp;lt;nowiki&amp;gt;https://hackbbs.org&amp;lt;/nowiki&amp;gt;&amp;quot;. Generate the message based on the history of the messages between double-quotes. The output of your response must ONLY contain the generated message =&amp;gt; &amp;quot;`;&lt;br /&gt;
&lt;br /&gt;
   try {&lt;br /&gt;
&lt;br /&gt;
       response = await api.sendMessage(request_p1 + prompt + '&amp;quot;');&lt;br /&gt;
&lt;br /&gt;
       return response.text;&lt;br /&gt;
&lt;br /&gt;
   } catch(error) {&lt;br /&gt;
&lt;br /&gt;
       console.error('[!] Error during GPT analysis:', error);&lt;br /&gt;
&lt;br /&gt;
       return null;&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour créer un fichier de log texte contenant tout les messages reçus&lt;br /&gt;
&lt;br /&gt;
function appendMessagesToLog(from, to, results) {&lt;br /&gt;
&lt;br /&gt;
   fs.appendFileSync('./messages.log', `${from} =&amp;gt; ${to}: ${results}` + '\n', 'utf-8');&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour créer un fichier de log texte contenant les analyses de GPT&lt;br /&gt;
&lt;br /&gt;
function appendAnalysisToLog(results) {&lt;br /&gt;
&lt;br /&gt;
   fs.appendFileSync('./GPT.log', `[${count}]: ${results} ` + '\n', 'utf-8');&lt;br /&gt;
&lt;br /&gt;
   count++;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Pas utilisable pour le moment car fait kick le bot à cause du flood&lt;br /&gt;
&lt;br /&gt;
async function sendPromotionMessage(result) {&lt;br /&gt;
&lt;br /&gt;
   if (results) {&lt;br /&gt;
&lt;br /&gt;
       for (const serversConfig of servers) {&lt;br /&gt;
&lt;br /&gt;
           for (const channel of serversConfig.channels) {&lt;br /&gt;
&lt;br /&gt;
               client.say(channel, results);&lt;br /&gt;
&lt;br /&gt;
               //console.log(`[+] Promotion message has been sent to ${channel} on ${serversConfig.server}`);&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       results = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction princpale pour se connecter à tous les serveurs&lt;br /&gt;
&lt;br /&gt;
async function main() {&lt;br /&gt;
&lt;br /&gt;
   console.log(`[i] Nickname: ${nickname}`);&lt;br /&gt;
&lt;br /&gt;
   console.log(`[i] Message:  ${message}\n`);&lt;br /&gt;
&lt;br /&gt;
   for (const serversConfig of servers) {&lt;br /&gt;
&lt;br /&gt;
       try {&lt;br /&gt;
&lt;br /&gt;
           client = await connectToServer(serversConfig);&lt;br /&gt;
&lt;br /&gt;
           console.log(`[+] Connected to ${serversConfig.server}`);&lt;br /&gt;
&lt;br /&gt;
           await new Promise(resolve =&amp;gt; setTimeout(resolve, 5000));&lt;br /&gt;
&lt;br /&gt;
       } catch (error) {&lt;br /&gt;
&lt;br /&gt;
           console.error(`[!] Error connecting to ${serversConfig.server}:`, error);&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // Générer au maximum 3 analyses pour créer un message sur mesure&lt;br /&gt;
&lt;br /&gt;
   // à envoyer sur chaque canal iRC (ex: si la langue parlée sur le canal&lt;br /&gt;
&lt;br /&gt;
   // est l'allemand -&amp;gt; générer un message en Allemand).&lt;br /&gt;
&lt;br /&gt;
   // Puis envoyer le message sur le canal correspondant.&lt;br /&gt;
&lt;br /&gt;
   setInterval(async() =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
       if (messages.length &amp;gt;= 100) {&lt;br /&gt;
&lt;br /&gt;
           results = await sendRequestToGPT(messages);&lt;br /&gt;
&lt;br /&gt;
           if (results) {&lt;br /&gt;
&lt;br /&gt;
               appendAnalysisToLog(results);&lt;br /&gt;
&lt;br /&gt;
               console.log('[+] Results saved to &amp;quot;GPT.log&amp;quot;');&lt;br /&gt;
&lt;br /&gt;
           } else {&lt;br /&gt;
&lt;br /&gt;
               console.error('[!] Unexpected error while fetching response from GPT');&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
&lt;br /&gt;
       } else {&lt;br /&gt;
&lt;br /&gt;
           console.log('[i] No messages to analyze.');&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
   }, 30000);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;/div&gt;</summary>
		<author><name>Neomoloch</name></author>
	</entry>
</feed>