yahooルートラボからStravaへの自動データ移行

# yahooルートラボからStravaへの自動データ移行
Yahooのルートラボは、2020年3月をもって終了してしまいます。
サービスが終了するまでにルートラボからgpxファイルをダウンロード、Stravaにアップロードし、今まで自分が走ったルートをstravaに保存しましょう！
ただ、手動でいちいちStravaにアップロードするのは面倒なので、以下の方法を用いて自動でアップロードしましょう

2020/04.01 追記
ルートラボは、終わってしまったので、ただ単純に.gpxファイルをStravaにアップロードしたい方は、[こちら](https://qiita.com/memento10/items/fe1a74ab0f4f284167fe)を参照ください。

## 1. 自分の使用しているGoogle Chromeのバージョンを調べる
![chrome](https://www.iijmio.jp/thissite/version/ver_chrome_1_mac.gif)
画像はhttps://www.iijmio.jp/thissite/version より

## 2. Google Chromeに合った、"chromedriver"というソフトウェアをダウンロードする

- [ここ](https://chromedriver.chromium.org/downloads)からダウンロードしてください。

  ![chromedriver](https://www.inet-solutions.jp/wp-content/uploads/2017/11/webdriver2.png)

- ダウンロードしたものは、.zip形式になっているので、展開したものの実行形式のものを自分のディレクトリに入れてください。

## 3. ターミナルを開いて、以下をターミナルで実行
```
pip install beautifulsoup4
pip install requests
pip install selenium
```
## 4. 以下のソースコードの"メールアドレス"と"パスワード"を自分のstravaアカウントに合わせて書き換える
```python:gpx.py
import os
import re
import sys
import time
from bs4 import BeautifulSoup
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options



options = Options()
options.binary_location = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
driver = webdriver.Chrome(os.path.join(os.getcwd(), "chromedriver"))



def read_urls():
    with open("./urls.txt", "r") as f:
        for row in f:
            yield row.replace("\n", "")

def download_gpx(urls):
    
    for url in urls:
        response = requests.get(url)
        
        html = response.text
        
        soup = BeautifulSoup(html, "html.parser")

        gpx_tag = soup.find_all("a", href=re.compile("gpx"))
        
        route_name = soup.find(id="subtitle").string

        download_url = gpx_tag[0].get('href')
        
        res = requests.get("https://latlonglab.yahoo.co.jp/route/" + download_url.lstrip("."))

        save_name = route_name + ".gpx"

        with open(save_name, "wb") as f:
            f.write(res.content)
    
        yield save_name
        
        


def upload_gpx_to_strava(gpx_names):
    
    for i, gpx_name in enumerate(gpx_names):
        driver.get('https://labs.strava.com/gpx-to-route/#12/-122.44503/37.73651')

        driver.find_element_by_id("gpxFile").send_keys(os.path.join(os.getcwd(), gpx_name))

        time.sleep(15)

        if i == 0:
            driver.find_element_by_id("oauthButton").click()

            driver.switch_to.window(driver.window_handles[-1])

            driver.find_element_by_id("email").send_keys("メールアドレス")

            driver.find_element_by_id("password").send_keys("パスワード")

            login_button = driver.find_element_by_id("login-button")
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            login_button.click()

            time.sleep(5)

            driver.switch_to.window(driver.window_handles[-1])

        driver.find_element_by_id("saveButton").click()
        time.sleep(5)

        driver.find_element_by_class_name("save-route").click()

        driver.find_element_by_id("name").send_keys("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"+os.path.splitext(os.path.basename(gpx_name))[0])

        driver.find_element_by_class_name("reverse").click()

        time.sleep(5)
        
if __name__ == "__main__":
    urls = list(read_urls())
    gpx_names = download_gpx(urls)
    upload_gpx_to_strava(gpx_names)
```

## 5. gpx.pyと同じディレクトリに以下のようなルートラボへのリンクがのったurls.txtを配置
```urls.txt
https://latlonglab.yahoo.co.jp/route/hoge1
https://latlonglab.yahoo.co.jp/route/hoge2
https://latlonglab.yahoo.co.jp/route/hoge3
...
```

## 6. 以下を実行
```python gpx.py```