[Python] IRC用のボットをプログラムする

今日はプログラムの仕方をお教えします ボット パラ IRC。 まず第一に、知らない人にとって、ボットはIRCチャネルに接続してそれと相互作用するプログラムであり、たとえば、 私たちがつながっていること したがって、スパムを回避するか、一連の注文を認識して対応するコードを実行します。
すでにボットの準備ができていますが、私は正直に言って、独自のプログラムを作成して学習し、それが機能することを確認した後、それが私たちに与える大きな満足感を好む人のXNUMX人です^^

それでは、チュートリアルに移りましょう。

ボットをプログラムするには、 プレーンテキストエディタ 誰でも (nano、gedit、meditなど) Y·エル pythonインタープリター (2.6または2.7が必要になりますが、 python3.xでは機能しません).

まず、インポートします 必要なモジュール、この場合、必要なのはXNUMXつだけです。

[コード]#!/ usr / bin / env python
#-*-コーディング:utf-8-*-

インポートソケット
インポート文字列
[/コード]

今、私たちはに進みます configurar ボット:

[コード] HOST=»irc.desdelinux。ネット"
PORT = 6667
NICK =»CalicoBot»
IDENT =»CalicoBot»
REALNAME =»CalicoBot»
CHAN =»#ホーム»
readbuffer =»»
[/コード]

各変数について説明します。

  • HOST: 接続するサーバーのURL
  • 港: サーバーポート。 デフォルトでは6667です。
  • NICK、IDENT、REALNAME: これらは、ボットのニックネーム、そのID、および本名に対応しています。
  • ちゃん: ボットが入るチャネル
  • 読み取りバッファ: この変数には、サーバーから送信されたデータが保存されます。

ボットを構成したら、次に進みます 接続

[コード] s = socket.socket()
s.connect((HOST、PORT))
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)
[/コード]

最初の行にはあまり謎がなく、XNUMX番目の行は サーバー接続 最後のXNUMXつは、ボットのデータをサーバーに送信してログインを続行します。

接続したら、を作成します 無限ループ そこに行きます サーバーとの間でデータを送受信します:

[コード] while 1:
readbuffer = readbuffer + s.recv(1024)
temp = string.split(readbuffer、 "\ n")
readbuffer = temp.pop()
一時的な行の場合:
line = string.rstrip(line)
line = line.split(CHAN + ':')

if line [0] .find( "PING")!= -1:
pingid = line [0] .split()[1] s.send( "PONG%s \ r \ n"%pingid)
[/コード]

上記のすべての行のうち、重要な行についてのみコメントします。
とともに line = line.split(CHAN + ':')私たちがしていることは、サーバーが私たちに送信するものを分割することです チャンネルから何かを取得しましょう。
たとえば、次の行は、誰かがチャネルに何かを書いたことを示しています。

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

XNUMXつ目は、ユーザーのニックネームと接続データ(!で区切られています)、コマンド(この場合は、ユーザーが書き込んだことを示します)、チャネル、最後にコロンの後に送信されたメッセージです。 このチュートリアルには含まれないため、これ以上多くのコマンドについては説明しません。

他の重要な行は 彼らはifの後です。 サーバーは頻繁にPINGコマンドを送信して、ユーザーがまだ接続されているかどうかを確認します。 その場合、ボットは、PINGがサーバーにまだ接続されていることを示すために送信したIDを使用してPONGコマンドを送信します。

これで、ボットのベースがすでにできました。 次に、IRC自体からのものかユーザーからのものかを問わず、特定のコマンドに対して必要なものに応じてボットを応答させる方法について説明します。

IRCコマンドへの応答:

PINGとPRIVMSGは、IRCコマンドの例です。 コマンドはたくさんありますが、前にも言ったように、これについては詳しく説明しません。
たとえば、接続するユーザーにボットにhelloと言わせることができます。

[コード] if行[0] .find( 'JOIN')!= -1:
name = line [0] .split( '!')[0] .split( ':')[1] if name!= NICK and name.find(HOST)== -1:
s.send( "PRIVMSG%s:ようこそ@%s ^^ \ n"%(CHAN、名前))
[/コード]

まず、サーバーがコマンドを送信するかどうかを確認します 登録 これは、誰かがサーバーに接続したことを示します。 次に、ニックネームを抽出し、ニックネームがIRCURLではないことを確認します (ボットを実行するとすぐに実行されない場合は、URLに挨拶します) そして最後に挨拶メッセージを送ります。

ボットコマンド:

ボットを作成するにはどうすればよいですか 自分のコマンドに応答する? 例をよく見てみましょう:

[コード] if行[1] == '$バージョン':
s.send(«PRIVMSG%s:CalicoBot 0.1.2(c)2012 Son Link \ n»%CHAN)
[/コード]

この例では、誰かが書いた場合 $バージョン ボットには、名前、バージョン、作成者を示すメッセージが表示されます。 例の完全なコードは次のとおりです。

[コード]インポートソケット
インポート文字列

ホスト=»localhost»
PORT = 6667
NICK =»CalicoBot»
IDENT =»CalicoBot»
REALNAME =»CalicoBot»
CHAN =»#ホーム»
readbuffer =»»
s = socket.socket()
s.connect((HOST、PORT))
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:

readbuffer = readbuffer + s.recv(1024)
temp = string.split(readbuffer、 "\ n")
readbuffer = temp.pop()
一時的な行の場合:
印刷行
line = string.rstrip(line)
line = line.split(CHAN + ':')

if line [0] .find( "PING")!= -1:
pingid = line [0] .split()[1] s.send( "PONG%s \ r \ n"%pingid)

if line [0] .find( 'JOIN')!= -1:
name = line [0] .split( '!')[0] .split( ':')[1] if name!= NICK and name.find(HOST)== -1:
s.send( "PRIVMSG%s:ようこそ@%s ^^ \ n"%(CHAN、名前))

len(行)<1の場合:
if line [1] == '$ version':
s.send(«PRIVMSG%s:CalicoBot 0.1.2(c)2012 Son Link \ n»%CHAN)
[/コード]

このチュートリアルが気に入っていただければ幸いです。もちろん、ボットのコードへのリンクを残して、コード全体を確認し、どのように機能するかを確認できるようにします。 (私は個人的な使用のためにいくつかのコマンドを削除しましたが)。

キャリコボット


コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:MiguelÁngelGatón
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。

  1.   アウロスZx

    ええ、私はあなたがIRCに乗るでたらめのボットを見逃すことができませんでした😛非常に興味深い記事。

  2.   セザール

    非常にシンプルで明確な説明。
    もし、pythonコードにすべてのインデントがない場合はどうでしょうか。

  3.   ラファ

    優れた記事と、IRCに接続してボットをプログラムするのがいかに簡単か:)…

    プログラマーがMSNまたはMSNGroupsのチャットでmIRCのスクリプトを書いているように感じたときのことを思い出します。

  4.   トルコ22

    面白い私はそれを保ちます😀

  5.   Genesis Vargas J。(@ elprincipiodeto)

    優れた!

  6.   エリンクス

    とても便利です、Son_Linkに感謝します!

    ご挨拶!

  7.   ビリックス

    乾杯…

    あなたのラインに従い、機能する唯一のものをテストすることは
    インポートソケット
    インポート文字列

    ホスト=»localhost»
    PORT = 6667
    NICK =»CalicoBot»
    IDENT =»CalicoBot»
    REALNAME =»CalicoBot»
    CHAN =»#ホーム»
    readbuffer =»»
    s = socket.socket()
    s.connect((HOST、PORT))
    s.send( "NICK%srn"%NICK)
    s.send( "USER%s%s bla:%srn"%(IDENT、HOST、REALNAME))
    s.send( "JOIN:%srn"%CHAN)

    チャネルとニックネームを変更すると、以下のエラー構文がスローされます

    私は他の知人に尋ねました、そして彼らはそれがパイソンのように見えないと私に言います

    何が間違っているのか、なぜすべてをコピーしてpythonに貼り付けて入力するとチャネルに接続するのかわかりませんが、250秒後に、ポンからの応答がなかったため、チャネルはそれを削除します...

  8.   ピンフライ

    完全なコードは私には機能しません。最後の段落は失敗するものであり、エラーを見つけることができません。 その部分を削除すると、接続して完全に機能します。 Windows2.7.3でPython7でテスト済み。

    PS:私の場合、パスワードを使用してサーバーに接続し、次の行を追加します。
    PASS =»Passdelbot»
    s.send( "PASS%s \ r \ n"%PASS)

  9.   イルカ

    こんにちはソンリンク、記事をありがとうございました、それは非常に興味深いです、私は送信されたコマンドに応答することができません。 「iflen(line)> 1:」の場合、プログラムは最後に進みません。理由がわかりません。
    あなたの答えを待っています。
    感謝