【问题标题】:python irc bot commandpython irc bot命令
【发布时间】:2012-10-15 05:18:43
【问题描述】:

当用户输入!metar(机场代码)时,下面的脚本将显示metar信息。但是,我有两个问题:

1) 用户输入 !metar 时没有代码如何处理。我想显示:“示例:!metar ksfo”。下面的 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)

【问题讨论】:

标签: python if-statement urllib irc


【解决方案1】:

1) 尝试更改 if/else 条件:

if "%s" %airport in metar:

if airport in metar:

2) 将 urlopen 包装到 try/except 子句中,并在异常时发送错误,可能区分连接超时和类似的东西与不正确的机场代码。

那么,我不确定你之前是否问过关于这个机器人的问题,但我想我今晚看到了一个类似的问题。

IRC 是基于行的协议。执行irc.recv(4096) 并不能保证获取您想要的内容。可以是行中间,也可以是行尾,可以是一行的结尾,也可以是另一行的开头等。你需要使用基于readline()的方法,而不是字节缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多