当用户输入!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)
答案 0 :(得分:1)
1)尝试更改if
/ else
条件:
if "%s" %airport in metar:
到
if airport in metar:
2)将urlopen
包装到try
/ except
子句中并发送异常错误,可能会区分连接超时和类似错误的机场代码。
然后,我不确定你之前是否在询问有关这个机器人的问题,但我想我今晚也看到了类似的问题。
IRC是一种基于行的协议。不能保证irc.recv(4096)
能够获取您想要的内容。它可以是行的中间,可以是行尾,可以是一行的结尾和另一行的开头等。您需要使用基于readline()
的方法,而不是字节缓冲。