Я пытаюсь создать бот IRC, который будет входить в существующую учетную запись (на QuakeNet), чтобы бот Q мог предоставить ему ранг оператора. Я могу успешно войти на сервер с правильным ником, но я не знаю, как заставить моего бота действительно войти в учетную запись. Вот код, который я использую:
send(cSock, "PASS SuperPasswordOfAnAdmin\r\n", strlen("PASS SuperPasswordOfAnAdmin\r\n"), NULL);
send(cSock, "USER custom 0 0 SuperUsernameOfAnAdmin\r\n", strlen("USER custom 0 0 SuperUsernameOfAnAdmin\r\n"), NULL);
send(cSock, "NICK SuperNickOfAnAdmin\r\n", strlen("NICK SuperNickOfAnAdmin\r\n"), NULL);
И это, кажется, не работает должным образом. Кто-нибудь знает, что мне делать?
Заранее спасибо за любые ответы.
Я бы предложил использовать такой клиент, как XChat и вручную выполняя шаги, которые вы пытаетесь автоматизировать, и просматривая необработанное окно журнала. Это покажет вам команды, которые выполняются вашим клиентом, и все, что отправляет сервер, на что вам нужно подождать или ответить.
Обратите внимание, что когда вы смотрите на команды в документации QuakeNet, это клиент команды, а не фактические команды IRC, которые отправляются на сервер. Например, /msg user message here
на самом деле отправляется по проводам как PRIVMSG user :message here
,
Я подозреваю, что вам придется сделать нечто большее, чем то, что предлагает ваш исходный код, чтобы должным образом удовлетворить IRC-сервер, например, обработать PING / PONG и ждать цифры 001. В псевдокоде:
// connect
conn := Connect("tcp", "your.irc.server:6667")
// login
Fprintf(conn, "PASS %s\r\n", server_password)
Fprintf(conn, "USER %s . . :%s\r\n", username, realname)
Fprintf(conn, "NICK %s\r\n", nick)
forever {
line := ReadLine(conn)
command, args := ParseIRCLine(line)
// welcome message, we're in!
if command == "001" {
break
}
// PING, send PONG
if command == "PING" {
Fprintf(conn, "PONG :%s\r\n", Join(args, " "))
}
}
Fprintf("PRIVMSG [email protected] :AUTH %s %s\r\n", username, password)
// wait for response from Q
// join channels, etc
// handle more pings, channel messages, etc
Обычно IRC-серверы имеют службу под названием NICKSERV
который позволяет идентифицировать ваш аккаунт:
Вы указываете следующую команду:
/nickserv identify [nickname] password
Так в вашем C++
программу, которую вы должны будете отправить:
send(cSock, "NICKSERV IDENTIFY SuperNickofAnAdmin SuperPasswordOfAnAdmin");
За QBOT
ты можешь сделать:
/msg [email protected] AUTH username password
Так в вашем C++
Программа, которую вы отправляете:
send(cSock, "MSG [email protected] AUTH SuperNickofAnAdmin SuperPasswordOfAnAdmin");
Чтобы предоставить пользователю статус оператора на IRC, вам нужно будет отправить команду:
MODE #Channel +o username
+o является статусом оператора и будет отображать «@» перед псевдонимом пользователя.
Вы можете использовать клиент telnet для прямой связи с сервером. Это потребует от вас использования всех скрытых команд, которые могут помочь вам познакомиться с требуемым вводом-выводом, необходимым для работающего бота.
Источник является самым рейтинговым ответом на этот вопрос: Как мне запрограммировать простого бота IRC на python?