基本的なIRCボットをチャネルに接続するだけのボットを書くのに助けが必要です..誰かがこれを説明できる人はいますか?IRCサーバーですが、チャンネルに参加してログオンすることができません。これまでのコードは次のとおりです。
import sockethost = 'irc.freenode.org'
port = 6667
join_sock = socket.socket()
join_sock.connect((Host, port))
<code here>
どんな助けでも大歓迎です。
IRCプロトコルのツイストの実装に基づくのがおそらく最も簡単でしょう。以下を見てください: http://github.com/brosner/bosnobot インスピレーション。
IRCチャネルに接続するには、特定のIRCプロトコル固有のコマンドをIRCサーバーに送信する前に、それ。
サーバーに接続するときは、サーバーがすべてのデータ(MOTDなど)を送信するまで待ってから、PASSコマンドを送信する必要があります。
PASS <some_secret_password>
次はNICKコマンドです。
NICK <username>
次に、USERコマンドを送信する必要があります。
USER <username> <hostname> <servername> :<realname>
どちらも必須です。
次に、サーバーからのPINGメッセージが表示される可能性があります。サーバーがPINGメッセージを送信するたびに、PONGコマンドでサーバーに応答する必要があります。サーバーはNICKコマンドとUSERコマンドの間でもPONGを要求する場合があります。
PING :12345678
PONGコマンドで「PING」の後に正確に同じテキストで返信します。
PONG :12345678
PING後は、サーバーごとに固有であるため、サーバーから送信された値を必ず返信してください。
これで、JOINコマンドを使用してチャネルに参加できます。
JOIN <#channel>
これで、PRIVMSGコマンドを使用してチャネルおよびユーザーにメッセージを送信できます。
PRIVMSG <#channel>|<nick> :<message>
で終了
QUIT :<optional_quit_msg>
Telnetを試してみてください!皮切りに
telnet irc.example.com 6667
その他のコマンドとオプションについては IRC RFC を参照してください。
お役に立てれば!
これをMAIN IRCコードとして使用しました:
import socket
import sys
server = "server" #settings
channel = "#channel"
botnick = "botname"
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
print "connecting to:"+server
irc.connect((server, 6667)) #connects to the server
irc.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :This is a fun bot!\n") #user authentication
irc.send("NICK "+ botnick +"\n") #sets nick
irc.send("PRIVMSG nickserv :iNOOPE\r\n") #auth
irc.send("JOIN "+ channel +"\n") #join the chan
while 1: #puts it in a loop
text=irc.recv(2040) #receive the text
print text #print text to console
if text.find('PING') != -1: #check if 'PING' is found
irc.send('PONG ' + text.split() [1] + '\r\n') #returnes 'PONG' back to the server (prevents pinging out!)
次に、次のようなコマンドの設定を開始できます:!hi <nick>
if text.find(':!hi') !=-1: #you can change !hi to whatever you want
t = text.split(':!hi') #you can change t and to :)
to = t[1].strip() #this code is for getting the first Word after !hi
irc.send('PRIVMSG '+channel+' :Hello '+str(to)+'! \r\n')
すべてのirc.send
テキストはPRIVMSG
またはNOTICE
+channel/user
で始まり、テキストは:
で始まる必要があることに注意してください。 !
これは MichaelvdNet's Post の拡張であり、いくつかの追加事項をサポートしています。
テキストファイルへの変更をチャネルに記録します
#!/usr/local/bin/python
import socket
import ssl
import time
## Settings
### IRC
server = "chat.freenode.net"
port = 6697
channel = "#meLon"
botnick = "meLon-Test"
password = "YOURPASSWORD"
### Tail
tail_files = [
'/tmp/file-to-tail.txt'
]
irc_C = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
irc = ssl.wrap_socket(irc_C)
print "Establishing connection to [%s]" % (server)
# Connect
irc.connect((server, port))
irc.setblocking(False)
irc.send("PASS %s\n" % (password))
irc.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :meLon-Test\n")
irc.send("NICK "+ botnick +"\n")
irc.send("PRIVMSG nickserv :identify %s %s\r\n" % (botnick, password))
irc.send("JOIN "+ channel +"\n")
tail_line = []
for i, tail in enumerate(tail_files):
tail_line.append('')
while True:
time.sleep(2)
# Tail Files
for i, tail in enumerate(tail_files):
try:
f = open(tail, 'r')
line = f.readlines()[-1]
f.close()
if tail_line[i] != line:
tail_line[i] = line
irc.send("PRIVMSG %s :%s" % (channel, line))
except Exception as e:
print "Error with file %s" % (tail)
print e
try:
text=irc.recv(2040)
print text
# Prevent Timeout
if text.find('PING') != -1:
irc.send('PONG ' + text.split() [1] + '\r\n')
except Exception:
continue
これでソケットが開きますが、自分が誰であるかをIRCdに知らせる必要もあります。私は昔、Perlで似たようなことをしてきましたが、IRC RFCsが非常に役立つことがわかりました。