środa, lipca 20, 2016

Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)

Jakiś czas temu opisałem tu skrypt, który "lata" na jednej z moich Malinek i sprawdza czy aby nie zbliża się termin końca ważności mojego biletu miesięcznego.

Niestety kilka dni temu dostałem maila od skryptu, w którym skarżył mi się, że nie może znaleźć informacji o dacie i że podejrzewa, że spowodowane to jest zmianą struktury strony....

Miał rację.

MPK zmieniło stronę i zmieniły się adresy...

Od teraz by sprawdzić datę ważności biletu trzeba pójść pod adres:
http://www.mpk.krakow.pl/pl/sprawdz-waznosc-biletu/index,1.html?cityCardType=0&identityNumber=<id>&cityCardNumber=<cityCardNumber>

Dodatkowo normalny request z Pythona skończy się 403 Forbidden...
Chwila zabawy wyjaśniła, że pluje się z powodu nagłówków (podejrzewam, że chodzi o User-Agent).
Wystarczy jednak dodać kilka nagłówków i wszystko działa tak jak należy :-)

Skrypt teraz wygląda tak:

#!/usr/bin/python
import urllib2
import sendmail
import datetime
import os

id = "<numer legitymacji KMK>"
cityCardNumber = "<nr seryjny karty>"
cityCardType = "0"
SEND_TO="<mail na ktory ma przyjsc informacja>"
limits = [31,21,14,7,1]

def getUrl(id, cityCardType, cityCardNumber):
url = "http://www.mpk.krakow.pl/pl/sprawdz-waznosc-biletu/index,1.html?cityCardType=0&identityNumber="+id+"&cityCardNumber="+cityCardNumber
return url

def getDateFor(id, cityCardType, cityCardNumber):
MARKER = "Data ko"
url = getUrl(id, cityCardType, cityCardNumber)
hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'}
req=urllib2.Request(url,headers=hdr)
lines=urllib2.urlopen(req).readlines()
    str="".join(lines)
date=None
if str.count(MARKER):
idx=str.index(MARKER)+27
substr = str[idx:idx+20]
date = substr[:substr.index("<")]
return date

date = getDateFor(id, cityCardType, cityCardNumber)

if not date:
url = getUrl(id, cityCardType, cityCardNumber)
sendmail.sendEMail(SEND_TO,u"[KMK watchdog] lack of date",u"""Cannot find end of period date on """+url+"""
Page was changed?
Or you don't have KKM?""")
else:
d = datetime.datetime.strptime(date,"%Y-%m-%d")
daysTillDate = (d-datetime.datetime.now()).days
for limit in limits:
if daysTillDate<limit:
fName=date+"_"+str(limit)
if not os.path.exists("kmk_watchodg"):
os.mkdir("kmk_watchodg")
if not os.path.exists("kmk_watchodg/"+fName):
sendmail.sendEMail(SEND_TO,"[KMK watchdog] only "+str(limit)+" days till end of KMK","""Hi,
It seems that you have only """+str(limit)+""" days to end of your KMK card.
Go to http://www.kkm.krakow.pl to buy new ticket, or disable this alarm on Raspberry Pi.""")
f=open("kmk_watchodg/"+fName,"w+")
f.write(str(datetime.datetime.now()))
f.close()

I znów działa :-)
Dzięki czemu codziennie o 8:00 skrypt sprawdza czy aby nie zbliża się data końca ważności mojego biletu miesięcznego ;-)



Podobne postybeta
Jak nie zapomnieć kupić biletu miesięcznego ;-)
Jak się dowiedziałem o tym, że w Polsce rusza Google Play Movies ;-)
Polowanie na Nexus 4 - wersja automagiczna ;-)
SleepAdvisor - komórka pomaga w wyspaniu się ;-)
SSD a programowanie