Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 18, 2008 18:11:57

armagidon
От:
Зарегистрирован: 2008-12-18
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

Привет люди ! Вот делаю бота для irc но не могу понять как мне выбрать информацию с def tpars(txt) , если знаете помогите =))

# -*- coding: cp1251 -*-
import socket
import time
import httplib

host='irc.lv'
channel='#Dragstyle^'

def tpars(txt):
q=txt.split('<span class="temp">') [1]
temp=q.split(' C') [0]
qq=txt.split('<span>') [1]
wind=qq.split('</span>') [0]
return temp
return wind

class parsing:
def __init__(self,DATA):
i=0
self.data = DATA

t=self.data.split('<TD>Players with 1 lvl</TD>') [0]
tt=t.split('<TD colSpan=3>Server</TD></TR>') [-1]

while i != 4:
num = str(i)
num=tt.split('</TD></TR>') [i]
info=num.split('<TD width=100>') [-1]

if i == 0:
acc = info
elif i == 1:
char = info
elif i == 2:
guild = info
elif i == 3:
online = info
i=i+1

self.debug = tt
self.acc = acc
self.online = online
self.char = char
self.guild = guild

def sendm(msg):
sock.send('PRIVMSG '+ channel + ' :' + str(msg) + '\r\n')

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, 6667))

sock.send('USER python host servname : Python Bot\r\n')
sock.send('NICK pyMan\r\n')

while 1:
text=sock.recv(2040)
if not text:
break

if text.find('Message of the Day') != -1:
sock.send('JOIN '+ channel +'\r\n')

if text.find('PING') != -1:
sock.send('PONG ' + text.split() [1] + '\r\n')

if text.find(':!quit') != -1:
sock.send('QUIT :python bot\r\n')

if text.find(':bot') != -1:
sendm('no , you are bot')

if text.find('JOIN :'+ channel) != -1:
sendm('Hello')

if text.find(':KICK') != 1:
sock.send('JOIN '+ channel +'\r\n')

if text.find(':!status') != -1:
conn = httplib.HTTPConnection("mubass.oo.lv")
conn.request("GET","/?pg=serv-stats")
r = conn.getresponse()
data = r.read()
inf = parsing(data)
sendm('Online: '+ inf.online +'')
sendm('Accounts: '+ inf.acc +'')
sendm('Characters: '+ inf.char +'')
sendm('Guilds: '+ inf.guild +'')
conn.close()

if text.find(':!date') != -1:
sendm(''+ time.strftime("%A, %B %d, %Y", time.localtime()))

if text.find(':!time') != -1:
sendm(''+ time.strftime("%H:%M:%S", time.localtime()))

if text.find(':!weather') != -1:
c = httplib.HTTPConnection("www.1188.lv")
c.request("GET", "/laika_zinas/?city=Daugavpils")
ra = c.getresponse()
datas = ra.read()
tpars(datas)
sendm('Temp: '+ temp)
sendm('Wind: '+ wind)
c.close()


print '[GET]', text



Офлайн

#2 Дек. 18, 2008 19:37:55

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

Конкретизируй немного вопрос, в чем именно трабла?

З.Ы. В текущем коде у тебя функция tpars возврашает только одно значение в строке
return temp
до
return wind
дело уже не доходит. %)



Офлайн

#3 Дек. 18, 2008 20:29:45

armagidon
От:
Зарегистрирован: 2008-12-18
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

мне надо как-то выбрать с tpars “temp” и “wind” как мне это можна зделать ?

if text.find(':!weather') != -1:
c = httplib.HTTPConnection("www.1188.lv")
c.request("GET", "/laika_zinas/?city=Daugavpils")
ra = c.getresponse()
datas = ra.read()
tpars(datas)
sendm('Temp: '+ temp)
sendm('Wind: '+ wind)
c.close()
ERROR ! он просто не находит temp и wind -))

Traceback (most recent call last):
File "ircbot.py", line 102, in <module>
sendm('Temp: '+ temp)
NameError: name 'temp' is not defined



Офлайн

#4 Дек. 18, 2008 20:57:47

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

а. ну да =)
Потому что они обе находтся в функции tpars.
в этой функции их сначала надо грамотно вернуть:

def tpars(txt):
....
....
return temp, wind
А в этом коде получить, для этого вместо:
    tpars(datas)
надо написать
    temp, wind = tpars(datas)



Офлайн

#5 Дек. 18, 2008 21:06:55

armagidon
От:
Зарегистрирован: 2008-12-18
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

shiza
Большое спасибо всё работает =)))
А вот кстати ты знаешь как зделать что-бы по команде !weather Daugavpils или !weather Riga менялось бы строчка /laika_zinas/?city=здесь ? Знаю как только просто написать через raw_input , а так ещё незнаю только не давно стал питон учить =)



Отредактировано (Дек. 18, 2008 21:07:50)

Офлайн

#6 Дек. 18, 2008 21:16:57

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

странные затруднения.. %)
так например:

...
if text.find(':!weather') != -1:
if text.find('Daugavpils') != -1: #если нашли Daugavpils - то такой-то запрос
reqest_str = "/laika_zinas/?city=Daugavpils
elif text.find('Daugavpils') != -1: #если нашли такой-то город - то такой-то запрос
reqest_str = "chto-to tam eshe"
else: #если никакого города не нашли... подходящего берем погоду ... ну например опять для Daugavpils %)
reqest_str = "/laika_zinas/?city=Daugavpils"
c = httplib.HTTPConnection("www.1188.lv")
c.request("GET", reqest_str)
....



Отредактировано (Дек. 18, 2008 21:21:26)

Офлайн

#7 Дек. 18, 2008 21:25:00

armagidon
От:
Зарегистрирован: 2008-12-18
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

Ты меня как-бы не понел я имел ввиду типо !weather <gorod> там более 100 городов я просто чокнусь стоко писать =)) надо что-бы где ?city=“yt” только бы yt менялся



Офлайн

#8 Дек. 18, 2008 21:58:11

armagidon
От:
Зарегистрирован: 2008-12-18
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

а вот этот скрипт можна-ли добавить в бота ?
import socket

def parsing(txt):
txt=txt.replace('\377', '')
if txt.find('m') == 0:
serv_name=txt.split('\0') [1]
serv_map=txt.split('\0') [2]
serv_engine=txt.split('\0') [3]
serv_game=txt.split('\0') [4]
print 'Server name:', serv_name
print 'Game:', serv_game, '('+serv_engine+')'
print 'Map:', serv_map

s = raw_input("Wrote ip: ")
ip=s

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.connect((ip, 27015))

sock.send('\377\377\377\377TSource Engine Query\0')

while 1:
text=sock.recv(1024)
text=parsing(text)
if not text:
break
print '[GET]', text

sock.close()



Офлайн

#9 Дек. 18, 2008 22:53:12

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

примерно как-то так…:

if text.find(':!weather') != -1:
tmp = text.split(':!weather')
if len(tmp) < 2: #город вытащить не удалось
pass
else:
city = tmp[1].strip() #коцаем пробелы и прочую ботву
reqest_str = '/laika_zinas/?city=' + city
c = httplib.HTTPConnection("www.1188.lv")
c.request("GET", reqest_str)
....
по хорошему надо еще отслеживать, если ввели несуществующий город.



Офлайн

#10 Дек. 18, 2008 22:55:18

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

IRC BOT

armagidon
а вот этот скрипт можна-ли добавить в бота ?
Можно все =)
Выражайся яснее.
В любом случае - добавлять тебе.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version