[Python]為IRC編程

今天我要教你如何編程 BOTIRC。 首先,對於不認識的人來說,機器人是一個程序,它連接到IRC頻道並與之交互,從而使我們能夠(例如)主持頻道而無需 我們已經連接 從而避免垃圾郵件,或者避免垃圾郵件識別出一系列命令並執行相應的代碼。
儘管已經有機器人可以使用了,但老實說,我是一個喜歡編寫自己的程序來學習的人,在看到它可以運行之後,它給我們帶來了極大的滿足感^^

話雖如此,讓我們繼續本教程。

要對機器人進行編程,我們需要一個 純文本編輯器 cualquiera (nano,gedit,medit等) Y EL python解釋器 (將需要2.6或2.7, 不適用於python 3.x).

首先,我們導入 所需模塊,在這種情況下,我們只需要兩個:

[代碼]#!/ usr / bin / env python
#-*-編碼:utf-8-*-

進口插座
導入字符串
[/代碼]

現在我們繼續 設置 機器人:

[代號] HOST=»irc.desdelinux。網”
PORT = 6667
尼克=»CalicoBot»
IDENT =»CalicoBot»
REALNAME =»CalicoBot»
CHAN =»#家»
readbuffer =»»
[/代碼]

我將解釋每個變量:

  • 主持人: 我們將連接到的服務器的URL
  • 港口: 服務器端口。 默認情況下為6667。
  • NICK,IDENT和REALNAME: 它們對應於該機器人的暱稱,其標識和真實姓名。
  • 陳: 機器人將進入的頻道
  • 讀緩衝區: 在此變量中,服務器發送的數據將被保存。

配置好我們的漫遊器後,我們將繼續 連接

[代碼] s = socket.socket()
s.connect((主機,端口))
s.send(“ NICK%s \ r \ n”%NICK)
s.send(“ USER%s%s bla:%s \ r \ n”%(IDENT,HOST,REALNAME))
s.send(“ JOIN:%s \ r \ n”%CHAN)
[/代碼]

第一行沒有太多的奧秘,第二行創建了 服務器連接 最後三個將bot的數據發送到服務器以繼續登錄。

連接後,我們將創建一個 無限循環 我們將在其中 從服務器接收數據或向服務器發送數據:

[code]而1:
讀緩衝區=讀緩衝區+ s.recv(1024)
temp = string.split(readbuffer,“ \ n”)
readbuffer = temp.pop()
對於臨時行:
行= string.rstrip(行)
line = line.split(CHAN +':')

如果行[0] .find(“ PING”)!= -1:
pingid =行[0] .split()[1] s.send(“ PONG%s \ r \ n”%pingid)
[/代碼]

在上面寫的所有行中,我只會評論重要的行。
line = line.split(CHAN +':')我們要做的就是分割服務器在什麼時候向我們發送的內容 讓我們從渠道中獲取一些東西。
例如,以下行表示某人在頻道上寫了一些東西:

:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^

第一個是用戶的暱稱和連接數據(用!分隔),命令(在這種情況下,它表明他寫了),通道,最後是冒號之後的消息。 我不會解釋更多命令,因為該命令不屬於本教程。

其他重要的是 在if之後。 服務器經常發送PING命令以檢查用戶是否仍然連接。 在這種情況下,殭屍程序會將PING發送的ID發送給PONG命令,以向服務器表明它仍處於連接狀態。

有了這個,我們已經有了機器人的基礎。 現在,我將繼續說明如何使漫遊器根據我們希望對某些命令的響應,無論它們是來自IRC本身還是來自用戶。

響應IRC命令:

PING和PRIVMSG是IRC命令的示例。 有很多命令,但是正如我之前說過的,我將不再贅述。
例如,我們可以使機器人與連接的用戶打招呼:

[代碼]如果行[0] .find('JOIN')!= -1:
name =行[0] .split('!')[0] .split(':')[1]如果name!= NICK和name.find(HOST)== -1:
s.send(“ PRIVMSG%s:Welcome @%s ^^ \ n”%(CHAN,名稱))
[/代碼]

首先我們檢查服務器是否發送命令 註冊 表示有人連接到服務器。 然後我們提取缺口,檢查缺口是否不是IRC網址 (如果不是在我們運行漫遊器後,它將立即迎接該網址) 最後,我們發送問候消息。

Bot命令:

現在如何製作我的機器人 響應我自己的命令? 讓我們更好地看一個例子:

[代碼]如果第[1]行=='$版本':
發送(«PRIVMSG%s:CalicoBot 0.1.2(c)2012 Son Link \ n»%CHAN)
[/代碼]

在這個例子中,如果有人寫 $版本 機器人將顯示消息,指示其名稱,版本和作者。 該示例的完整代碼如下:

[代碼]導入套接字
導入字符串

主機=»本地主機»
PORT = 6667
尼克=»CalicoBot»
IDENT =»CalicoBot»
REALNAME =»CalicoBot»
CHAN =»#家»
readbuffer =»»
s = socket.socket()
s.connect((主機,端口))
s.send(“ NICK%s \ r \ n”%NICK)
s.send(“ USER%s%s bla:%s \ r \ n”%(IDENT,HOST,REALNAME))
s.send(“ JOIN:%s \ r \ n”%CHAN)

而1:

讀緩衝區=讀緩衝區+ s.recv(1024)
temp = string.split(readbuffer,“ \ n”)
readbuffer = temp.pop()
對於臨時行:
打印線
行= string.rstrip(行)
line = line.split(CHAN +':')

如果行[0] .find(“ PING”)!= -1:
pingid =行[0] .split()[1] s.send(“ PONG%s \ r \ n”%pingid)

如果行[0] .find('JOIN')!= -1:
name =行[0] .split('!')[0] .split(':')[1]如果name!= NICK和name.find(HOST)== -1:
s.send(“ PRIVMSG%s:Welcome @%s ^^ \ n”%(CHAN,名稱))

如果len(line)<1:
如果第[1]行=='$版本':
發送(«PRIVMSG%s:CalicoBot 0.1.2(c)2012 Son Link \ n»%CHAN)
[/代碼]

我希望您喜歡本教程,當然,我會留下指向我的機器人代碼的鏈接,以便您可以完整查看其代碼並更好地了解其工作方式。 (儘管我刪除了一些個人使用的命令)。

印花布


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   奧羅斯 他說:

    嘿,我不能錯過您在IRC上玩的廢話的Bo-非常有趣的文章。

  2.   停止 他說:

    非常簡單明了的解釋。
    如果python代碼缺少所有縮進,該怎麼辦。

  3.   特斯 他說:

    優秀的文章,以及連接到IRC編程機器人的難易程度:)…

    這讓我想起了那些時候,我們覺得程序員在MSN或MSNGroups聊天中為mIRC編寫腳本

  4.   特魯科22 他說:

    有趣的是我keep

  5.   創世紀·瓦爾加斯(@elprincipiodeto) 他說:

    優秀的!

  6.   艾琳克斯 他說:

    非常有用,謝謝Son_Link!

    的問候!

  7.   比利克斯 他說:

    乾杯…

    遵循您的路線並測試唯一可行的方法是
    進口插座
    導入字符串

    主機=»本地主機»
    PORT = 6667
    尼克=»CalicoBot»
    IDENT =»CalicoBot»
    REALNAME =»CalicoBot»
    CHAN =»#家»
    readbuffer =»»
    s = socket.socket()
    s.connect((主機,端口))
    s.send(“ NICK%srn”%NICK)
    s.send(“ USER%s%s bla:%srn”%(IDENT,HOST,REALNAME))
    s.send(“ JOIN:%srn”%CHAN)

    現在更改頻道和暱稱,以下內容將引發我錯誤語法

    我問其他熟人,他們告訴我那看起來不像python

    我不知道我在做什麼錯,或者為什麼我複制所有內容並將其粘貼到python中,然後輸入並連接到通道,但是250秒後通道將其刪除,因為pong沒有響應...

  8.   拼寫 他說:

    完整的代碼對我不起作用,最後一段是失敗的,並且我找不到錯誤。 如果刪除該部分,它將連接並正常工作。 在Windows 2.7.3上使用Python 7進行了測試。

    PS:就我而言,我使用密碼連接到服務器並添加以下行:
    通過=»Passdelbot»
    s.send(“ PASS%s \ r \ n”%PASS)

  9.   海豚 他說:

    嗨,兒子鏈接,非常感謝您的文章,這非常有趣,我只是無法響應發送的命令。 該程序不會進入最後一個if並且我不知道為什麼:“ if len(line)> 1:”
    我在等你的回答。
    謝謝