在 Python 3 中建立 IRC 機器人

Manav Narula 2023年1月30日
  1. 在 Python 中建立 IRC 機器人
  2. 建立包含該類的 Python 指令碼
  3. 在 Python 中發起訊息並連線到伺服器
在 Python 3 中建立 IRC 機器人

IRC 機器人是使用 IRC 協議提供即時使用者響應的程式指令碼。這些機器人可以充當虛擬助手,快速響應活躍使用者。

本教程將演示如何在 Python 中建立一個簡單的 IRC 機器人。

在 Python 中建立 IRC 機器人

要建立 IRC 機器人,我們需要將程式連線到伺服器。為此,我們將使用套接字。

Python 的 socket 模組實現了 socket-API 來連線同一網路上的兩個節點,以方便通訊。

連線到網路後,我們必須傳遞一些命令和值來與 IRC 伺服器進行身份驗證。我們需要使用 PASS 命令指定密碼。

我們使用 NICK 命令和 USER 命令指定使用者名稱,以提供使用者名稱、主機名、伺服器和真實姓名。然後伺服器以 PING 響應,我們需要提供 PONG 命令。

建立包含該類的 Python 指令碼

要建立一個簡單的機器人,我們首先需要建立一個包含該類的 Python 指令碼,該類將具有生成連線和傳送訊息的方法。

請參閱下面的程式碼。

import socket
import sys


class bot_irc:

    irc_socket = socket.socket()

    def __init__(self):
        self.irc_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def send_irc(self, channel, msg):
        self.irc_socket.send(bytes("PRIVMSG " + channel + " " + msg + "\n", "UTF-8"))

    def connect_irc(self, server, port, channel, bot_nick, bot_pass, bot_nickpass):
        print("Server connection: " + server)
        self.irc_socket.connect((server, port))

        self.irc_socket.send(
            bytes(
                "USER " + bot_nick + " " + bot_nick + " " + bot_nick + " :python\n",
                "UTF-8",
            )
        )
        self.irc_socket.send(bytes("NICK " + bot_nick + "\n", "UTF-8"))
        self.irc_socket.send(
            bytes("NICKSERV IDENTIFY " + bot_nickpass + " " + bot_pass + "\n", "UTF-8")
        )
        self.irc_socket.send(bytes("JOIN " + channel + "\n", "UTF-8"))

    def response_irc(self):
        r = self.irc_socket.recv(2040).decode("UTF-8")
        if r.find("PING") != -1:
            self.irc_socket.send(
                bytes("PONG " + r.split().decode("UTF-8")[1] + "\r\n", "UTF-8")
            )
        return r

在示例中,我們建立了一個類來表示 Python 中 IRC 機器人的結構。

我們使用 socket.socket() 建構函式來建立 socket 物件。該物件用於類的每個方法中。

該類的 connect_irc() 方法連線到所需的伺服器。我們在此函式中為前面討論的命令提供值。

由於我們使用的是 Python 3,因此我們需要傳送作為值的位元組。

我們通過使用 socket.send() 函式並使用 bytes() 函式將資料編碼為 UTF-8 來實現這一點。

我們有傳送位元組的 send_irc() 函式。response_irc() 函式對收到的響應起作用。

在此函式中,響應被解碼為字串並返回。然後我們檢查伺服器返回的 PING 值。

我們使用 find() 函式搜尋它。如果有 PING 值,我們使用 socket.send() 函式將 PONG 命令以位元組形式傳送到伺服器。

在 Python 中發起訊息並連線到伺服器

我們可以在客戶端使用此類的例項來啟動訊息並連線到伺服器。

例子:

server_irc = "10.x.x.10"
port_irc = 6697
channel_irc = "#python"
botnick_irc = "delftstack"
botnickpass_irc = "nickkpass"
botpass_irc = "botpass//"
irc = bot_irc()
irc.connect_irc(
    server_irc, port_irc, channel_irc, botnick_irc, botpass_irc, botnickpass_irc
)

while True:
    text = irc.response_irc()
    print(text)

    if "PRIVMSG" in text and channel in text and "hello" in text:
        irc.send_irc(channel, "First message")

在示例中,我們建立了前面定義的 bot_irc 類的例項,並嘗試使用必要的值連線到 IRC 伺服器。

啟動連線後,我們檢查響應以檢視成功並在連線成功時傳送我們的第一條訊息。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn