-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtram.py
271 lines (225 loc) · 11.2 KB
/
tram.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
###########################################################################################################
# TramBot, no necesitas más, ya nunca volveras a llegar tarde, no volveras a perder ese tram.
#
#
# Desing By @verdej0 and @secu_X11
#
# **Escribir tu TOKEN, debes tener el archivo paradas.json en el mismo directorio que este bot para que funcione
#Ultima actualizacion por Verdejo 25/10
###########################################################################################################
#⌚️
#📌
import telegram.ext, requests, re, time, json
try:
leer=json.loads(open('./paradas.json').read())
except Exception:
print('Error al leer paradas.json')
exit()
#
# Funcion Inicial para el comando /start
#
# Saluda respondiendo por el username o name del usuario y diciendo que hago
#
def start(bot,update):
#username de quien manda el mensaje para saludar
name=update.message.from_user.name
update.message.reply_text('Hola '+ name +' soy TramBot escribe /help para obtener ayuda.')
#
# Funcion de Ayuda para el comando /help
#
# Mostrar ayuda detallada de cada comando
#
def help(bot,update):
update.message.reply_text('Ayuda:\n/start - Saludo del bot.\n/paradas - Paradas disponibles.\n/times Origen Destino - Horarios de hoy.\n/timesto Origen Destino HInicio HFin - Horarios en un intervalo de tiempo, formato de hora XX:XX.\n/help - Muestra la ayuda.')
#Scrapea del html si hay un transbordo
def unTransbordo(test_str):
regex = b"Para efectuar este trayecto debe efectuar\s+<strong>transbordo<\/strong>(.*?)<img alt='(\d+)' title='\d+' src='.*?' \/>(.*?)<img alt='(\d+)' title='\d+' src='.*?' \/>"
matches=re.finditer(regex,test_str.content)
total=''
for matchNum, match in enumerate(matches):
matchNum = matchNum + 1
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
total+=match.group(groupNum).decode('utf-8')+ ' '
return total
#Funcion auxiliar para determinar el segundo transbordo
def dosTransbordos(test_str):
total=""
regex = r"<li>Para efectuar este trayecto debe efectuar <strong>transbordo</strong> (.*?) <img alt='(\d+)' title='\d+' src='.*?' /> (.*?) <img alt='(\d+)' title='\d+' src='.*?' /> (.*?) <img alt='(\d+)' title='\d' src='.*?' /> (.*?) <img alt='(\d+)' title='\d+' src='.*?' /></li>"
matches = re.search(regex, test_str.text, re.UNICODE)
total=''
#5, 6, 7, 8, son los grupos donde esta la info que me interesa
total+=matches.group(5)+' '
total+=matches.group(6)+' '
total+=matches.group(7)+' '
total+=matches.group(8)
return total
#
# Funcion TimesToday: devuelve el horario completo de salidas de una parada de tram a
# otra parada destino con fecha actual.
#
# [*] USO: /times Bulevar-del-Pla Alicante-Luceros
#
def timestoday(bot,update,args):
#Validacion de argumentos, solo recibe origen y destino
if (len(args) == 2):
#Obtengo la fecha actual
today = time.strftime("%x")
#Valida si existe el argumento 1 (origen) y el argumento 2 (destino)
numid = leer.get(str.lower(args[0]), 'Nothing')
numid2 = leer.get(str.lower(args[1]), 'Nothing')
#Compruebo que el origen y el destino sean distintos
if(args[0]==args[1]):
update.message.reply_text('Error.\nEl origen y destino coinciden!')
else:
#Valida si ha encontrado la codificacion de la parada de origen y destino
if((numid in "Nothing") or (numid2 in "Nothing")):
update.message.reply_text("Error en las paradas.\nEs posible que haya errores en los nombres de las paradas")
else:
#Construyo y realizo la peticion con los datos correspondientes
payload = {
'origen': numid,
'aceptar': '0',
'key': '0',
'destino': numid2,
'fecha': today,
'hini': '00:00',
'hfin': '23:59',
'calcular': '1'
}
r = requests.post("http://www.tramalicante.es/horarios.php", data=payload)
#Scrapeo cada valor de la tabla de horarios
cadatd = re.findall("<td>(\d+:\d+)</td>", r.text)
total=''
numero1='-1'
numero0='-1'
trans=0
#Mando el horario de la forma: en una linea la hora y en la siguiente todas las
#veces que sale en esa hora, y asi con todas las horas.
for hora in cadatd:
#imprime horas por grupos de hora
if(hora[0]==numero0 and hora[1]==numero1):
total=(total+hora+' ')
#detecta cuando tiene que pasar a la siguiente hora
else:
#Detectar transbordo
if(numero0*10+numero1 > hora[0]*10+hora[1]):
trans+=1
if(trans==1):
trans1=unTransbordo(r)
total+='\n\n Transbordo'+trans1+'\n'
if(trans==2):
trans2=dosTransbordos(r)
total+='\n\n'+trans2 + '\n'
numero0=hora[0]
numero1=hora[1]
total=(total+'\n'+'⌚️'+numero0+numero1+'\n'+'📌'+hora+' ')
update.message.reply_text('Salidas desde '+str.lower(args[0])+' a '+str.lower(args[1])+ ' :'+total)
else:
update.message.reply_text("Error en los parametros.\nUso /times Origen Destino")
# Funcion TimesIntervalo: devuelve el horario de salidas de una estacion origen a una destino en un intervalo de horas
# establecido por el usuario (como argumento 2 y 3)
#
# [*] USO: /timesto Bulevar-del-Pla-Alicante-Luceros 7 9
#
#
def timesintervalo(bot,update,args):
if(len(args) == 4):
#Valida si existe el argumento 1 (origen) y el argumento 2 (destino)
numid = leer.get(str.lower(args[0]), 'Nothing')
numid2 = leer.get(str.lower(args[1]), 'Nothing')
#Compruebo que el origen y el destino sean distintos
if(args[0]==args[1]):
update.message.reply_text('Error.\nEl origen y destino coinciden!')
else:
#Comprobacion del formato de hora correcto
if(len(args[2])==5 and len(args[3])==5 and args[2][2]==':'and args[3][2]==':'and args[2][0].isdigit() and args[2][1].isdigit() and args[2][3].isdigit() and args[2][4].isdigit() and args[3][0].isdigit() and args[3][1].isdigit()and args[3][3].isdigit() and args[3][4].isdigit()):
#Valida si ha encontrado la codificacion de la parada de origen y destino
if((numid in "Nothing") or (numid2 in "Nothing")):
update.message.reply_text("Error en las paradas.\nEs posible que haya errores en los nombres de las paradas")
else:
h1=args[2][0]*1000+args[2][1]*100+args[2][3]*10+args[2][4]
h2=args[3][0]*1000+args[3][1]*100+args[3][3]*10+args[3][4]
if(h1<h2):
today = time.strftime("%x")
#Hora inicio y final
hinicio = args[2]
hfinal = args[3]
#Construyo y realizo la peticion con los datos correspondientes y los intervalos
payload = {
'origen': numid,
'aceptar': '0',
'key': '0',
'destino': numid2,
'fecha': today,
'hini': hinicio,
'hfin': hfinal,
'calcular': '1'
}
r = requests.post("http://www.tramalicante.es/horarios.php", data=payload)
#Scrapeo cada valor de la tabla de horarios
cadatd = re.findall("<td>(\d+:\d+)</td>", r.text)
total=''
numero1='-1'
numero0='-1'
trans=0
#Mando el horario de la forma: en una linea la hora y en la siguiente todas las
#veces que sale en esa hora, y asi con todas las horas.
for hora in cadatd:
#imprime horas por grupos de hora
if(hora[0]==numero0 and hora[1]==numero1):
total=(total+hora+' ')
#detecta cuando tiene que pasar a la siguiente hora
else:
#Detectar transbordo
if(numero0*10+numero1 > hora[0]*10+hora[1]):
trans+=1
if(trans==1):
trans1=unTransbordo(r)
total+='\n\n Transbordo'+trans1+'\n'
if(trans==2):
trans2=dosTransbordos(r)
total+='\n\n'+trans2 + '\n'
numero0=hora[0]
numero1=hora[1]
total=(total+'\n'+'⌚️'+numero0+numero1+'\n'+'📌'+hora+' ')
if(total==''):
update.message.reply_text('Lo siento, no sale ningun tram en el intervalo horario indicado.')
else:
update.message.reply_text('Salidas desde '+str.lower(args[0])+' a '+str.lower(args[1])+ ' de '+hinicio+ ' a '+hfinal+ ':'+total)
else:
update.message.reply_text('Error.\nLa hora de inicio debe ser menor que la hora de fin.')
else:
update.message.reply_text('El intervalo de horas es incorrecto, debe cumplir este formato: XX:XX')
else:
update.message.reply_text('Error en los argumentos.\nUso: /timesto Origen Destino Hora1 Hora2')
#
# Funcion paradas:lista el nombre de todas las paradas
# [*]USO: /paradas
#
#
def paradas(bot, update):
if not leer:
update.message.reply_text('Error.\nNo se ha podido leer las paradas.')
total='📌'
for parada in leer:
total=(total+parada+'\n'+'📌')
temp=len(total)
total=total[:temp -1]
update.message.reply_text('Paradas disponibles:\n'+total)
######################################
# Funcion principal #
######################################
def main():
#Cambiar token**********************************************************************
updater = telegram.ext.Updater('TOKEN')
dp = updater.dispatcher
dp.add_handler(telegram.ext.CommandHandler("start",start))
dp.add_handler(telegram.ext.CommandHandler("help",help))
dp.add_handler(telegram.ext.CommandHandler("times",timestoday,pass_args=True))
dp.add_handler(telegram.ext.CommandHandler("timesto",timesintervalo,pass_args=True))
dp.add_handler(telegram.ext.CommandHandler("paradas",paradas))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()