0

私はボットを作成しており、入力以外のほとんどすべてを準備しています。「!testword」のようなものを作成し、「word2」のようなものを出力させたいと思います。これが私がデータを出力するために使用しているコードです。ユーザー名(opername)も知りたいです。ページのインデントがオフになっている場合は申し訳ありません。私の側では問題ありません。

while True:

    data = irc.recv ( 4096 )
    if data.find ('PING' ) != -1:
      irc.send ('PONG ' + data.split() [ 1 ] + '\r\n' )

    if data.find ('!quit') != -1:
      irc.send ('QUIT\r\n')

    if data.find ('!enc %s\r\n' % werd) != -1:
      irc.send ("PRIVMSG %s :%s\r\n" % (channel,werd))
4

1 に答える 1

4

あなたのコードには根本的な欠陥があり、先に進む前に修正する必要があります。

IRC は行ベースのプロトコルですが、行ごとに読んでいるわけではありません。代わりに、一度に最大 4096 バイトを読み取っています。これは、行の前半、行の中央 3 分の 1、または行の最後の 3 分の 1 と、それに続く 2 つの完全な行と 4 番目の行の最初の 2 文字を返す可能性があります。

なぜこれが問題なのか理解できない場合: 1 つreadが で終わる何か'\r\nPI'を返し、次のものが で始まる何かを返すと想像してみてください'NG foo\r\n'。どちらもあなたの と一致しないfind('PING')ため、コマンドを見逃すことになります。

これを回避する最も簡単な方法は、ループを次のように変更することです。

for line in irc.makefile():

マイナーな注意として、'!quit' in dataおそらくdata.find ('!quit') != -1.

最後に、これはあなたが実際に望んでいるものではないと思います (私は間違っているかもしれませんが):

if data.find ('!enc %s\r\n' % werd) != -1:
    irc.send ("PRIVMSG %s :%s\r\n" % (channel,werd))

これはwerd、どこかから来た静的な文字列である場合に機能しますが、あなたの説明から、任意のコマンド!enc foo\r\nをキャッチして return 、PRIVMSG #chan: foo\r\nキャッチ!enc bar\r\nして returnPRIVMSG #chan: bar\r\nなど、誰かが他の可能性を秘めている可能性があるように思えますタイプ。そのためには、正規表現が必要な場合もあれば、もう少し複雑な文字列処理コードが必要な場合もあります (たとえば、data空白で分割し、いずれかの要素が に一致する場合'!enc'、次の要素が返す単語になります)。

以下は、あなたがやろうとしていることに似ているかもしれないし、似ていないかもしれない何かをする一つの方法の例です:

m = re.search(r'!enc (.*)\r\n', line)
if m:
    irc.send('PRIVMSG %s: %s\r\n' % (channel, m.group(1)))

「!test word」のようなものが必要で、「word2」のような出力が必要です

では、"word" が与えられたときに、"word2" が必要であることをどのように判断するのでしょうか? ルールが何であれ、明らかにそのルールをどこかにコード化する必要があります。または、コーディングの支援が必要な場合は、それについて説明する必要があります。

コメントから:

「!test x」が欲しいだけです。ユーザーが「!test x」と入力すると、「x」に変更を加えて変更を出力します

xここでは、リテラルではなくメタ変数として使用していると想定しています。つまり、ユーザーが に対して何か"!test x"を行う"x"場合、ユーザーが に対して何か"!test y"を行う"y"場合などです。間違っている場合はお知らせください。 .

上記のコードは、「test」ではなく「enc」を検索しているため、明らかにそれをキャッチしません。しかし、それは些細な変更です:

m = re.search(r'!test (.*)\r\n', line)

そして、出力する前に x に「何かをする」ことについてm.group(1)は、x上記のとおりです。

if m:
    irc.send('PRIVMSG %s: %s\r\n' % (channel, do_stuff_to(m.group(1))))

送信、受信、および解析しているものがわからない場合は、いつでも print ステートメントを追加してテストできます。

m = re.search(r'!test (.*)\r\n', line)
print m, m.groups() if m else ''
if m:
    print 'got %s, sending %s' % (m.group(1), do_stuff_to(m.group(1))))
    irc.send('PRIVMSG %s: %s\r\n' % (channel, do_stuff_to(m.group(1))))

ソケットを介して何が起こっているかを監視したい場合は、2 つの方法があります。wiresharkをインストールし、それを使用してネットワーク上のメッセージをスパイするか、 netcatを使用して偽のサーバーをセットアップします。前者については、説明しなければならないことが多すぎるため、説明しません。また、優れたチュートリアルが既に存在します。しかし、後者の場合は、次のように簡単です: ターミナルを開いて を実行しますnc -kl 8888。次に、ボットを接続しますlocalhost:8888リモートサーバーの代わりに。ボットが送信する内容を確認し、応答をターミナル ウィンドウに入力するか貼り付けます。(Windows 以外のほとんどすべてのプラットフォームでは、nc が組み込まれています。Windows では、どこかから netcat または ncat を取得する必要がありますが、ウィキペディアのページにリンクがあることは確かです。) 多くのデバッグを行う必要がある場合は、次のことができます。ボットと実サーバーの間でメッセージをやり取りし、通過するすべてのものを出力するだけのプロキシとして netcat を設定します。

于 2012-10-25T00:23:35.760 に答える