0

以下のスクリプトは、ユーザーが!metar(空港コード)と入力すると、metar情報を表示します。ただし、2つの問題があります。

1)ユーザーがコードなしで!metarと入力した場合の処理​​方法。「例:!metarksfo」を表示したいのですが。以下のifステートメントはこれを行いません。

2)ユーザーが間違ったコードを入力した場合の処理​​方法。urllibは.txtファイルを開きますが、htmlリンクからのエラーが表示されます。同様のifステートメントを試しましたが、それも機能しません。

    import socket
from urllib import urlopen

def metar(airport):
    airport = airport.upper()
    for metar in urlopen('http://weather.noaa.gov/pub/data/observations/metar/stations/%s.TXT' %airport):
        metar = metar.decode("utf-8")
        if "%s" %airport in metar:
            irc.send('PRIVMSG '+ channel +' :%s' %metar)
        #else: 
        #   irc.send('PRIVMSG '+ channel +' :Incorrect airport code.')

network = 'irc.freenode.net'
port = 6667
nick = 'savvis_bot'
channel = '#savvis_bot'

irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Connecting to server...", network
irc.connect((network, port))
print irc.recv(4096)
irc.send("USER "+ nick +" "+ nick +" "+ nick +" :Savvis\n")
irc.send("NICK " + nick + "\n")
irc.send("JOIN " + channel + "\n")

while True:
    data = irc.recv(4096)
    print data
    if data.find('PING') != -1:
        irc.send('PING ' + data.split() [1] + '\r\n')
    if data.find(':!metar') != -1:
        airport_command = data.split(':!metar')
        airport = airport_command[1].strip()
        if airport == '':
            irc.send('PRIVMSG '+ channel +' :Example: !metar KSFO')
        else:
            metar(airport)
4

1 に答える 1

1

1) if/else条件を次のように変更してみてください。

if "%s" %airport in metar:

if airport in metar:

2) /句にラップurlopenし、例外でエラーを送信します。おそらく、接続タイムアウトやそのようなものと間違った空港コードを区別します。tryexcept

それから、あなたが以前にこのボットについて質問していたかどうかはわかりませんが、今夜も同様の質問を見たと思います。

IRC は回線ベースのプロトコルです。実行irc.recv(4096)しても、必要なものが取得されるとは限りません。行の途中、行の終わり、ある行の終わりと別の行の始まりなどになる可能性がありますreadline()。バイトバッファではなく、ベースのアプローチを使用する必要があります。

于 2012-10-25T04:38:02.150 に答える