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 ;-)
Airly + Python + Oczyszczacz Powietrza = lepsze oddychanie ;-)
Jak się dowiedziałem o tym, że w Polsce rusza Google Play Movies ;-)
Polowanie na Nexus 4 - wersja automagiczna ;-)
Żenienie Todoist z Obsidian przy pomocy Pythona ;-)
Brak komentarzy:
Prześlij komentarz