Eetlijst.nl vanaf de cli nl

Door Ghost op zondag 11 januari 2009 18:56
Categorie: General tricks, Views: 3586

In ons studentenhuis gebruiken we de website eetlijst.nl om de administratie rondom het eten bij te houden. Op een dood moment besloot ik mijn python-vaardigheden wat op te vijzelen en heb een script gebouwd om vanaf de cli dit overzicht op te vragen.

Onderstaande code vergt twee parameters, namelijk de gebruikersnaam en het wachtwoord voor de eetlijst website.


code:
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
#!/usr/bin/python
import urllib, re, sys

def usage():
    print "Usage:\n\t%s username password" % sys.argv[0]
    print "\n\tusername, password - login credentials for www.eetlijst.nl"

def overview_page(username, password):
    eetlijsturl = "http://eetlijst.nl/%s?%s" % (username, password)
    return urllib.urlopen(eetlijsturl)

def process_page(page_pointer):
    start_row = re.compile("<td.*(ma|di|wo|do|vr|za|zo)"
        " ([0-9][0-9]?-[0-9][0-9]?)")
    end_row = re.compile("</tr>")
    selection_row = re.compile("(leeg|nop|eet|kook).gif")
    in_row = False
    summary = ""
    for x in page_pointer:
        if (in_row and end_row.search(x)):
            #End of a row
            if len(summary.strip("-| ")) > 4:
                print "%s total: %d" % (summary, total)
            in_row = False

        if (not in_row and start_row.search(x)):
            #Processing column
            in_row = True
            total = 0
            date, day = process_title(start_row, x)
            summary = "%-5s |" % date

        if (in_row and selection_row.search(x)):
            #Start of a row
            selection, count = process_setting(selection_row, x)
            if count > 1:
                summary += " %s%-d |" % (selection, count)
            else:
                summary += " %s  |" % selection
            total += count

def process_title(regex, title_row):
    response = regex.search(title_row)
    day = response.group(1)
    date = response.group(2)
    return (date, day)
    
def process_setting(regex, setting_row):
    groups = regex.search(setting_row).groups()
    selection = groups[0]
    count = len(regex.findall(setting_row))
    selection_letter = '-'
    if (selection == 'eet'):
        selection_letter = 'E'
    if (selection == 'kook'):
        selection_letter = 'K'
    if (selection == 'nop'):
        selection_letter = 'X'

    if selection_letter == '-' or selection_letter == 'X':
        count = 0

    return (selection_letter, count)

if len(sys.argv) != 3:
    usage()
    exit(1)

page_pointer = overview_page(sys.argv[1], sys.argv[2])
process_page(page_pointer)


De uitvoer is als volgt:
11-1  | E  | E  | -  | K  | -  | -  | total: 3
12-1  | -  | K  | -  | E  | -  | -  | total: 2
13-1  | E  | E  | K3 | -  | -  | -  | total: 5


Dit overzicht kan onder andere gebruikt worden voor automatische mailingen en, wat ik van plan ben, notificatie voor als ik boodschappen moet doen vanuit mijn werk of school. Have fun!

Volgende: Simple iPaq Familiar file transfers 27-01
Volgende: Oh lovely, a RRoD (update) 05-11

Reacties


Door T.net user Snake, zondag 11 januari 2009 20:37

Dat is een heel leuk script, het jammere hieraan is wel: als er iets wijzigt aan de HTML code hang je.

Jammer dat zulke websites geen RSS providen :|

Door T.net user darkrain, zondag 11 januari 2009 21:06

Krijg je K3 te eten woensdag?

Door T.net user darkrain, zondag 11 januari 2009 21:06

correctie dinsdag

Door T.net user Dhr_Soulslayer, zondag 11 januari 2009 22:01

Hmm het script klinkt leuk maar ik heb er weinig aan. De site daarin tegen is de oplossing voor het gezeik hier in huis. Ik ga me er zeker in verdiepen en kijken hoe en wat. Bedankt!!

Door Iooryz, zondag 11 januari 2009 23:01

Mooi script. Maar Eetlijst ondersteunt wel RSS uitvoer. Kijk maar eens op de instellingenpagina, en dan onderaan on het kopje gadgets.

Door T.net user siepeltjuh, maandag 12 januari 2009 01:07

zo heb ik op deze manier ook al vele html strippers gebouwd, die zorgen dat belangrijke dingen als appointments enz via exchange in mn agenda terecht komen.

rooster van werk, rooster van school

f1time spel dat ik heb gespeeld. data logging was daar het belangrijkste om snel een setup voor het racen te vinden. Via de site moet je betalen, en was het redelijk beperkt. Mijn tool sloeg alles op. Echter was ik na een jaartje er wel weer op uitgekeken.

Ben benieuwd of er nog meer mensen zijn met dit soort tools, en dan vooral de toepassing ervan.

Wel jammer dat erg veel van dergelijke handige sites, heel beperkt gebruik maken van xml/rss en al helemaal niet van een webservice (incl wsdl), terwijl dat juist lekker universeel is je dan erg vrij bent in het programmeren.

Door T.net user Thralas, maandag 12 januari 2009 02:16

BeautifulSoup is ook vaak erg handig voor het parsen van HTML, hoewel je bij dit script nog wel wegkomt met een paar simpele regexes.

Door Tim, vrijdag 30 januari 2009 09:51

Er is inderdaad wel degelijk een RSS feed beschikbaar op Eetlijst.nl. Is het mogelijk om die als input te gebruiken voor dit Python script? Die feed vreet namelijk een stuk minder resources van de Eetlijst-server (en daar is iedereen mee geholpen).

Als jullie nog suggesties hebben om de RSS feed mee uit te breiden of te verbeteren, dan laat dit gerust weten d.m.v. een mailtje aan de site.

Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)

Tiep de tekens in onderstaand anti-spam plaatje over: