2012-03-04 4 views
1

私のircロボットが掛かっています:calvino.freenode.net "NOTICE *:*あなたのホスト名を検索しています..."私のコードにいくつかの関数を追加する前に働いていました。私はこれらの関数をコメントアウトして以来、しかしそれはまだ動作していない! それはそのメッセージにとどまり、進行しません。私はそれを強制終了しなければならない。なぜPythonのircbotが止まっているのですか?*:***あなたのホスト名を検索します...そしてチャンネルに参加しませんか?

私は非常に初心者のコーダーです、私は2週間ほど前にコードを始めました。だから私はどこかで非常にばかげたエラーがあることは全く可能です。 参考までに、私はこの投稿を使ってボットの枠組みを書いていました。 http://ubuntuforums.org/showpost.php?p=9363159&postcount=3 私は残りのコードを投稿しませんでしたが、必要に応じてこのペーストビンに入れました!それはあなたの誤差があるが、あなたがここにあなたの文字列に問題があるように見える場合http://pastebin.com/kVF04UFr

import socket 
    import urllib2 
    import httplib 
    import mechanize 

    channel = '#testbot' 
    botnick = 'tastybot' 
    network = 'irc.freenode.net' 
    port = 6667 
    irc = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
    irc.connect ((network, port)) 
    print irc.recv (4096) 
    irc.send ('NICK' + botnick + ':\r\n') 
    irc.send ('USER tastybot tastybot tastybot :Python IRC\r\n') 
    irc.send ('JOIN' + channel + ':\r\n') 
    irc.send ('PRIVMSG' + channel + ':What\'s up?\r\n') 
    running = True 

    [various functions] 

    while running: 
     [rest of code] 
+1

wiresharkをインストールし、何がうまくいかないかを確認するためにトラフィックをキャプチャしてみてください。私はこれが通常、それが知っているプロトコルのエラーをチェックする最善の方法であることを発見しました。私が見ているエラーは1です。あなたは 'NICK'、' JOIN'と 'PRIVMSG'の後のスペースを忘れてしまいます。2. NICK'と' JOIN'メッセージの後に 'recv'していないので、あまりにも早いので、サーバーによって無視されます。 –

+0

ところで、Rubyで書かれた非常にシンプルなボットは、[私のGithubのページ](https://github.com/niklasb/ircstuff/blob/master/ircbot.rb)にあります。 'PING'に自動的に応答するなど、もっと必要なものがいくつかあります。 –

+0

[ident](http://en.wikipedia.org/wiki/Ident)サービスを実行していますか?私はidentサービスを実行していなかったので、freenodeへの接続に問題がありました。 –

答えて

1

私の推測では、あなたが接続しているIRCサーバがIDENTが与えられていることを必要とすることである。

Identは、サーバが共有システム上のどのユーザに接続していたかを識別するために使用された古いプロトコルです。最近では、感染したマシン(identd [identデーモン]がインストールされていないマシン)からクローンやfloodbotを取り除くためによく使われています。

出典:これまでhttp://help.undernet.org/faq.php#19

最も簡単な修正プログラムは、他のIRCサーバに接続しようとすることで、あなたのサーバとして「holmes.freenode.net」を試みることができます。私はそのサーバー上で自分のIRCボットを使っても問題はありませんでした。

編集: あなたは私がサーバーに接続するため使用していたコードで見てみたい場合:connection.py

+0

identを実行すると修正されたようです。 – reallyrose

1

わからない:

irc.send ('PRIVMSG' + channel + ':What's up?\r\n') 

プログラムを作っている何のためにあなたのアポストロフィは、それが文字列

から出たと思います
+2

これは構文エラーを引き起こすはずです。 –

+0

それはそうではありません。私はそれがどこに行ったのかは分かりませんが、私はirc.send( 'PRIVMSG' + channel + ':What \' s up?\ r \ n ')を持っているので、Pythonは' What's ' – reallyrose

0

あなたは、送信時にスペースを忘れてしまいました。そのようにする必要があります:アカウントはパスワードを使用している場合は、単に最初のメッセージとしてPASS passwordを送る

import socket 
import urllib2 
import httplib 
import mechanize 

channel = '#testbot' 
botnick = 'tastybot' 
botuser = 'tastybot' 
network = 'irc.freenode.net' 
port = 6667 
irc = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
irc.connect ((network, port)) 
print irc.recv (4096) 
irc.send ('NICK ' + botnick + '\r\n') 
irc.send ('USER ' + botuser + ' 0 * :Python IRC\r\n') # Read RFC next time, please 
irc.send ('JOIN ' + channel + '\r\n') 
irc.send ('PRIVMSG ' + channel + ' :What\'s up?\r\n') 
running = True 

[various functions] 

while running: 
    [rest of code] 

- ユーザ名とニックネームを送信する前に - 右の接続を確立した後。

また、IRC(RFCで定義されている)では、最大メッセージlenは512バイトです。

ところで、受信した文字列の最後の2つの記号が\r\nの場合は、実際にフレームの読み込みを停止する必要があります。私のボットのサンプル(ハイパワー):

(defn read [self] 
    (setv b 512) 
    (setv on True) 
    (setv c "") 
    (while (and on (!= b 0)) 
     (setv x (self.sock.recv 1)) 
     (+= c (x.decode "UTF-8")) 
     (-= b 1) 
     (if (= "\r\n" (cut c -2)) 
     (do 
      (if (= "" (cut c -2)) 
      (continue)) 
      (setv on False) 
      (setv c (cut c 0 -2))))) 
    c) 
+0

Kek - 古い質問に返信 – Ancient

関連する問題