2

IRC ボットのコーディングを試みていますが、成功しています。やりたいことを実装するのに問題があります。コードは正常に動作しますが、次の点に問題があります。

ボットはWhileループを使用してIRCからコマンドを読み取るため、time.sleep(秒)で2番目のWhileを追加すると、ボットは接続しません.2番目のループを読み取り、:PINGに応答するのに間に合わずに接続を一時停止するためです切断しますか。私は検索していましたが、何を試したらいいのかわからないので、もっと混乱します。

スタックレス、マルチスレッド、サブプロセス。あまりにも多くの結果があり、私はさらに混乱します。最善の方法は何でしょうか。RSS ボットを試しています。IRC チャネルで !rss コマンドを使用するとボットは正常に動作しますが、10 分ごとに新しいものをチェックする必要があり、スリープ コマンドを使用するとメイン ループが混乱します。上。

ここに私のコードがあります:

#!/usr/bin/python

import socket, sys, string, time, feedparser, hashlib
port = 6667
nick = "RSSbot"
host = 'irc.server.com'
name =  "RSSBOT"
channel = '#debug'
ident = 'rssbot'
irc = socket.socket()
irc.connect ( (host, port) )
irc.send ( 'NICK ' + nick + '\r\n' )
irc.send ( 'USER ' + ident + ' ' +  ident + ' ' + ident + ' :rssbot\r\n' )

def readRss():
    feedurl = feedparser.parse("http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=username")
    newest = feedurl['items'][0].title
    newest = newest.replace("username:","")
    msg = newest.split("http://")
    title = msg[0]
    url = msg[1]
    url = "http://" + url
    e = feedurl.entries[2]
    threadurl = e.link
    id = hashlib.md5(url + title).hexdigest()
    irc.send ("PRIVMSG #debug :Tittle:%s\r\n" % newest)
    irc.send ("PRIVMSG #debug :URL: %s\r\n" % url)
    irc.send ("PRIVMSG #debug :MD5: %s\r\n" % id)
while 1:
    data = irc.recv ( 1024 )
    print(data)

    if data.find ( '376' ) != -1:
        irc.send( 'JOIN ' + channel + '\r\n' )
    if data.find ( 'PING' ) != -1:
        irc.send( 'PONG ' + data.split() [1] + '\r\n')
    if data.find ( '!rss' ) != -1:
        feedurl = feedparser.parse("http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=username")
        newest = feedurl['items'][0].title
        newest = newest.replace("username:","")
        msg = newest.split("http://")
        title = msg[0]
        url = msg[1]
        url = "http://" + url
        #e = feedurl.entries[2]
        #threadurl = e.link
        id = hashlib.md5(url + title).hexdigest()
        irc.send ("PRIVMSG #debug :Tittle:%s\r\n" % newest)
        irc.send ("PRIVMSG #debug :URL: %s\r\n" % url)
        irc.send ("PRIVMSG #debug :MD5: %s\r\n" % id)
    while true:
        readRss()
        time.sleep(300)

while :true 内に time.sleep(300) を追加すると、sleep コマンドが while 1: ループと競合するため、x 分ごとに新しいフィードを確認できるようにする必要があります。私は何ができますか?

4

2 に答える 2

3

新しいループの代わりに、別のタイマーを使用します。

import time
last_update = time.time()

while 1:
   # the rest of your while loop as usual
   now = time.time()
   if now - last_update > 300:
       # you've waited 300 seconds
       # check feeds or whatever 
       last_update = now
于 2012-04-06T15:05:49.007 に答える
0

私は私のIRCボットのスレッド化モジュールでそれを処理しました。プロジェクトをチェックしてください。これはあなたを助けるかもしれませんhttps://github.com/mouuff/MouBot

于 2012-10-13T20:52:07.117 に答える