Created
March 6, 2016 05:31
-
-
Save m3nu/092cbf5a0009fb683ad7 to your computer and use it in GitHub Desktop.
Semi-manual python script to download your ride history including prices.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2 | |
""" | |
Semi-manual script to download trips and cost. | |
Currently needs manual steps in 2 places. And chrome-selenium. | |
(or any other Selenium browser) | |
You also want to adapt the currencies to your needs. | |
pip3 install uber_rides selenium pandas | |
""" | |
import re | |
import pandas as pd | |
from selenium import webdriver | |
from uber_rides.client import UberRidesClient | |
from uber_rides.auth import AuthorizationCodeGrant | |
RIDE_DETAILS_URL = 'https://riders.uber.com/trips/{}' | |
def get_uber_client(): | |
# register app on https://developer.uber.com | |
auth_flow = AuthorizationCodeGrant( | |
'XXX', | |
{'history', 'request_receipt'}, | |
'XXX', | |
'http://localhost' | |
) | |
auth_url = auth_flow.get_authorization_url() | |
# Confirm auth_url and paste below. | |
session = auth_flow.get_session('RESPONSE URL') | |
client = UberRidesClient(session) | |
return client | |
def get_rides_df(client): | |
rides = [] | |
i = 0 | |
while True: | |
resp = client.get_user_activity(limit=50, offset=i) | |
i += 50 | |
if len(resp.json['history']) > 0: | |
rides += resp.json['history'] | |
else: | |
break | |
rides_sel = [ {'request_id': e['request_id'], | |
'distance': e['distance'], | |
'city': e['start_city']['display_name'], | |
'time': e['start_time']} for e in rides] | |
df = pd.DataFrame(rides_sel) | |
df.time = pd.to_datetime(df.time*1e9) | |
return df | |
driver = webdriver.Chrome() | |
driver.get('https://riders.uber.com/trips/') | |
# Login to uber in selenium browser. | |
def get_price_km(request_id): | |
XP_KM = '//*[@id="slide-menu-content"]/div/div[2]/div/div/div[2]/div[3]/div/div[1]/div[2]/div[2]/div/div[2]/h5' | |
XP_PRICE = '//td[@class="text--right alpha weight--semibold"]' | |
driver.get(RIDE_DETAILS_URL.format(request_id)) | |
price = driver.find_element_by_xpath(XP_PRICE).text | |
km = driver.find_element_by_xpath(XP_KM).text | |
return (float(km), price) | |
def get_eur_price(price): | |
currencies = {u'RM': 4.5, | |
u'₫': 25000, | |
u'฿': 40} | |
price = re.sub(',', '', price) | |
price_float = float(re.findall('\d+\.\d+', price)[0]) | |
for currency in currencies.keys(): | |
if currency in price: | |
return price_float / currencies[currency] | |
df['km'], df['price'] = zip(*km) | |
df['eur'] = df.price.apply(get_eur_price) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment