summaryrefslogtreecommitdiffstats
path: root/arafetch/arafetch.py
diff options
context:
space:
mode:
Diffstat (limited to 'arafetch/arafetch.py')
-rwxr-xr-xarafetch/arafetch.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/arafetch/arafetch.py b/arafetch/arafetch.py
new file mode 100755
index 0000000..4364762
--- /dev/null
+++ b/arafetch/arafetch.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+""" usage: fetchday [options]
+
+Options:
+ --db FILE path to db [Default: db.json]
+ --cantine NAME name of the cantine (matches mein.aramark.de/NAME/) [Default: thales-deutschland]
+"""
+import sys
+from docopt import docopt
+import requests
+from bs4 import BeautifulSoup
+import logging
+
+import json
+from datetime import datetime
+logging.basicConfig(level=logging.DEBUG)
+log = logging.getLogger()
+from itertools import tee
+cantinedb = {
+ 'thales-deutschland': 'aramark_menu2-2',
+ 'buerocampus-wangen': 'aramark_menu2-3',
+ 'ibm-boeblingen': 'aramark_menu2-3',
+ 'metabo-nuertingen': 'aramark_menu2-3',
+ 'vodafone-campus': 'aramark_menu2-2',
+ 'continental-villingen': 'aramark_menu2-3'
+ }
+def get_data(cantine):
+ headers = {
+ 'User-Agent': 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0',
+ 'Referer': f'http://mein.aramark.de/{cantine}/menuplan/',
+ 'X-Requested-With': 'XMLHttpRequest',
+ 'Cache-Control': 'max-age=0'
+ }
+ data = {
+ 'action': 'aramark_menu2_content',
+ 'id': cantinedb[cantine]
+ }
+ ret = requests.post(f'http://mein.aramark.de/{cantine}/wp-admin/admin-ajax.php',data=data)
+ if ret.status_code != 200:
+ log.error(ret)
+ raise ValueError('Return code is not 200')
+ return ret.content.decode()
+
+def get_data_test():
+ return open("./test.html").read()
+
+def get_things(row):
+ for item in row.select('.aramark_menu2-counter'):
+ try:
+ thing = {
+ "allergies": {},
+ "additives": {},
+ "type" : item.select_one('.aramark_menu2-countertitletop').find(text=True),
+ "description" : item.select_one('.aramark_menu2-menutext > p').find(text=True),
+
+ }
+ try:
+ price = float(item.select_one('.aramark_menu2-menuprice > .aramark_menu2-menuprice').find(text=True).replace(',','.').replace('EUR','').strip())
+ except:
+ price = float(thing['description'])
+ thing['price'] = price
+ try:
+ thing['title'] = item.select_one('.aramark_menu2-countermenu h4').find(text=True)
+ except:
+ thing['title'] = thing['type']
+
+ entries = item.select('.aramark_menu2-menuinfoallergenes li span')
+ for i in range(0,len(entries),2):
+ thing['allergies'] = { entries[i].find(text=True): entries[i+1].find(text=True) }
+
+ additives = { }
+ entries = item.select('.aramark_menu2-menuinfoadditives li span')
+ for i in range(0,len(entries),2):
+ thing['additives'] = { entries[i].find(text=True): entries[i+1].find(text=True) }
+ yield thing
+ except Exception as e:
+ log.error(f"problem with {e}")
+ log.debug(item.prettify())
+def main():
+ args = docopt(__doc__)
+ dbname = args['--db']
+ cantine = args['--cantine']
+ try:
+ with open(dbname,'r+') as f:
+ db = json.load(f)
+ except:
+ log.info('creating new db')
+ db = {}
+
+ updated = datetime.now().isoformat().split('T')[0]
+ soup = BeautifulSoup(get_data(cantine), 'html.parser')
+ # soup = BeautifulSoup(get_data_test(), 'html.parser')
+ for row in soup.select('.aramark_menu2-menus > div'):
+ day = row.get('data-aramark_menu2-day')
+ things = list(get_things(row))
+ db[day] = things
+
+ log.info(f'writing db {dbname}')
+ with sys.stdout if dbname == '-' else open(dbname,'w+') as f:
+ json.dump(db,f,indent=2,sort_keys=True)
+
+
+if __name__ == '__main__':
+ main()