我需要幫助寫一個基本的IRC機器人只是連接到一個頻道..是否有人能夠解釋我呢?我設法讓它連接到IRC服務器,但我無法加入頻道並登錄。我到目前爲止的代碼是:如何在python中編寫簡單的IRC bot?
import sockethost = 'irc.freenode.org'
port = 6667
join_sock = socket.socket()
join_sock.connect((host, port))
<code here>
任何幫助將不勝感激。
我需要幫助寫一個基本的IRC機器人只是連接到一個頻道..是否有人能夠解釋我呢?我設法讓它連接到IRC服務器,但我無法加入頻道並登錄。我到目前爲止的代碼是:如何在python中編寫簡單的IRC bot?
import sockethost = 'irc.freenode.org'
port = 6667
join_sock = socket.socket()
join_sock.connect((host, port))
<code here>
任何幫助將不勝感激。
它可能是最容易的基礎上扭曲的實施IRC協議。看看:http://github.com/brosner/bosnobot獲取靈感。
http://www.habnabit.org/twistedex.html是一個教程基本的IRC機器人使用t.w.p – 2010-06-03 18:59:44
這將打開一個套接字,但你也需要告訴IRCd你是誰。我在perl時代曾經做過類似的事情,我發現IRC RFC很有幫助。
要連接到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
回覆完全相同的文字「PING」與PONG命令後:
PONG :12345678
PING後什麼是獨一無二的每一個服務器我相信,所以一定要確保你的服務器發送的值回覆您。
現在,您可以加入與JOIN命令道:
JOIN <#channel>
現在你可以發送郵件到渠道和用戶PRIVMSG命令:
PRIVMSG <#channel>|<nick> :<message>
退出與
QUIT :<optional_quit_msg>
用Telnet進行實驗!從
telnet irc.example.com 6667
有關更多命令和選項,請參閱IRC RFC。
希望這會有所幫助!
謝謝,這是偉大的!尤其是關於telnet的提示..沒有想到它:)謝謝..我可能還有幾個問題。讓我試試telnet的東西,然後我會回來! – Jake 2010-06-03 21:20:33
這是我的會議: 注意AUTH:***處理連接irc.mzima.net 注意AUTH:***看你的主機名... 注意AUTH:***檢查訂貨號 注意AUTH:* **找到你的主機名 注意AUTH:***沒有身份確認 NICK PYIRC \ r \ n USER PYIRC PYIRC PYIRC:Python的\ r \ n JOIN #pytest \ r \ n :irc.mzima.net 451 * :您還沒有註冊 它似乎是註冊..我如何註冊?或者你知道一個不需要的IRC服務器嗎? 我迷路了................ – Jake 2010-06-03 22:35:26
我不認爲你可以像這樣同時發送命令。嘗試單獨發送它們,因爲服務器可能會在命令之間向您發送一些內容,因此您會收到註冊通知,這實際上是指連接註冊。顯然,你必須在NICK/USER之前發送一個PASS
我用這個作爲主要的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
和文本應該以:
開頭!
這很好,但我只能得到while循環來觸發,如果irc.recv(2040)返回的東西。 – earthmeLon 2014-05-12 17:46:02
您可以在irc.connect()之後設置irc.setblocking(False),但一定要在while循環中添加time.sleep(),除非您想使用處理器來加熱家中。 – earthmeLon 2014-05-12 18:07:44
無論如何消息使用命令的暱稱? – 2015-05-24 03:03:56
這是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
爲什麼要重新發明輪子?已經有很多用Python編寫的IRC機器人。 – jamessan 2010-06-03 18:13:32
@jamessan當然要學習:) – 2010-06-03 19:53:33
@eric我喜歡這個迴應:D – 2013-12-11 13:26:21