|
| 1 | +import fitbit |
| 2 | +from selenium import webdriver |
| 3 | +import os, time, random, re, yaml |
| 4 | +from optparse import OptionParser |
| 5 | + |
| 6 | +def load_config(): |
| 7 | + parser = OptionParser() |
| 8 | + parser.add_option("-c", "--config", dest="config", default='fitbite.yaml', |
| 9 | + help="yaml-formatted config file") |
| 10 | + (options, args) = parser.parse_args() |
| 11 | + |
| 12 | + return yaml.safe_load(open(options.config).read()) |
| 13 | + |
| 14 | +def authorize_with_fitbit(): |
| 15 | + |
| 16 | + consumer_key = os.getenv('FITBIT_CONSUMER_KEY') |
| 17 | + consumer_secret = os.getenv('FITBIT_CONSUMER_SECRET') |
| 18 | + user_key = os.getenv('FITBIT_USER_KEY') |
| 19 | + user_secret = os.getenv('FITBIT_USER_SECRET') |
| 20 | + |
| 21 | + return fitbit.Fitbit(consumer_key, consumer_secret, user_key=user_key, user_secret=user_secret) |
| 22 | + |
| 23 | +def determine_calorie_level(fb, config): |
| 24 | + |
| 25 | + steps = fb.activity_stats()['lifetime']['tracker']['steps'] |
| 26 | + steps = 6000 |
| 27 | + print "You've taken %d steps today" % steps |
| 28 | + # find possible levels |
| 29 | + levels = config['levels'] |
| 30 | + the_calorie_level = levels[0].keys()[0] |
| 31 | + for l in levels: |
| 32 | + calorie_level, step_level = l.keys()[0], l.values()[0] |
| 33 | + if step_level < steps: |
| 34 | + the_calorie_level = calorie_level |
| 35 | + |
| 36 | + return the_calorie_level |
| 37 | + |
| 38 | +def order_seamless(calorie_level): |
| 39 | + # seamless info |
| 40 | + SEAMLESS_URL = "http://www.seamless.com/" |
| 41 | + SEAMLESS_EMAIL = os.getenv("SEAMLESS_EMAIL") |
| 42 | + SEAMLESS_PASSWORD = os.getenv("SEAMLESS_PASSWORD") |
| 43 | + |
| 44 | + # setup browser |
| 45 | + browser = webdriver.Chrome() |
| 46 | + |
| 47 | + # open seamless and login |
| 48 | + browser.get(SEAMLESS_URL) |
| 49 | + browser.find_element_by_id('memberLogin').click() |
| 50 | + time.sleep(5) |
| 51 | + browser.find_element_by_id('username').send_keys(SEAMLESS_EMAIL) |
| 52 | + browser.find_element_by_id('password').send_keys(SEAMLESS_PASSWORD) |
| 53 | + browser.find_element_by_id('corporate_member_submit').click() |
| 54 | + time.sleep(5) |
| 55 | + # navigate to favorite meals |
| 56 | + browser.find_element_by_link_text('Favorite Meals').click() |
| 57 | + time.sleep(5) |
| 58 | + orders = browser.find_elements_by_class_name('action') |
| 59 | + |
| 60 | + #filter by order: |
| 61 | + orders = [o for o in orders if o.text == 'Order now'] |
| 62 | + |
| 63 | + # filter by caloric content |
| 64 | + possible_orders = [o for o in orders if re.search(".*"+calorie_level+".*", o.find_element_by_tag_name('a').get_attribute('title'))] |
| 65 | + |
| 66 | + n = len(possible_orders) |
| 67 | + if n==0: |
| 68 | + print "No suitable orders available at this time. It's probably too late to eat anyways!" |
| 69 | + return "" |
| 70 | + elif n==1: |
| 71 | + the_order = possible_orders[0] |
| 72 | + elif n>1: |
| 73 | + the_order = possible_orders[random.sample(range(0,(len(possible_orders)-1)))] |
| 74 | + |
| 75 | + # select the order |
| 76 | + the_order.click() |
| 77 | + time.sleep(5) |
| 78 | + |
| 79 | + # proceed to checkout |
| 80 | + browser.find_element_by_id('FormAction').click() |
| 81 | + time.sleep(5) |
| 82 | + # browser.find_element_by_id('FormAction').click() |
| 83 | + |
| 84 | + return "Check %s to see what you ordered!" % SEAMLESS_PASSWORD |
| 85 | + |
| 86 | +if __name__ == '__main__': |
| 87 | + |
| 88 | + config = load_config() |
| 89 | + fb = authorize_with_fitbit() |
| 90 | + calorie_level = determine_calorie_level(fb, config) |
| 91 | + print order_seamless(re.sub("_", " ", calorie_level)) |
0 commit comments