Python + Docker + NotionAPI + Google DriveでAtCoderの問題を収集する環境を作る

**Github**
- https://github.com/tf63/atcoder_offline_python

**概要**
- AtCoderの問題・解説ページをGoogleドライブで見れる環境を作る
- iPadのGoogleドライブで， フォルダの中身をオフラインで使用可能にしておけば， 外でも勉強できる
![summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/ad1b818b-a5d6-2c58-d9c2-7042d3b866ab.png)

**何をするか**

- 指定したコンテストの問題・解説ページのスクリーンショットを撮影し， Googleドライブに保存する

- [AtCoder Problem](https://kenkoooo.com/atcoder/#/table/)の[Information API](https://kenkoooo.com/atcoder/resources/problem-models.json)から各問題のDifficultyを取得し，Difficultyごとに保存

![drive_summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/5864c3df-efdd-16a2-0e09-0549847c4d14.png)

- Notionのデータベースにノートを用意する
![notion_db_summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/99a667fa-ee3f-40b6-b3b9-65f30ccdda04.png)

## 実行方法
- 実行コマンド (例)

    - abc280からabc284までのA, B, C問題がダウンロードされる
```
python -m atcoder_offline --prefix abc --begin 280 --end 284 --problem a b c
```
- `--clear_done`オプションをつけることで，Notionのデータベースでstatus == `Done`とした問題をGoogleドライブから削除できる


## 各種設定

## .env
- **必ず`.env.example.json`を`.env`にリネームする**

- `.env`にはAPIトークンを保管するため， 絶対にgit管理しない

    - 代わりに`．env.example.json`をgit管理する

## docker
- docker-compose内の`selenium`コンテナのイメージを次のように変更する

    - intelチップの場合，`image:selenium/standalone-chromium`
    - M1/M2チップ搭載のmacの場合，`image:seleniarm/standalone-chromium`

## Goodleドライブ APIの有効化
- Google Drive APIを有効にし，PyDrive2からGoogleドライブを操作できるようにする

- 参考 https://qiita.com/ftnext/items/60ced8bc432bec6101f0 

## Goodleドライブの保存先
**フォルダ構成**
- フォルダ名は固定

- 保存先のディレクトリをオフラインで使用可能にしておく

![drive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/f38a23a0-4e00-97c2-b5b8-c9003cffdff7.png)


**フォルダIDの取得**
- `env.json`の`COLOR_TO_DIR`に，それぞれの色に対応するフォルダIDを設定する

- フォルダIDは，フォルダを開いてURLを確認することで得られる
```
https://drive.google.com/drive/folders/<フォルダID>
```

## Notion APIの有効化
- https://www.notion.so/my-integrations からインテグレーションを作成し，トークンを取得

- ******************の部分をコピーし，`env.json`の`TOKEN_NOTION`に割り当てる

![notion_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/c2436de9-0416-2d6c-b31d-abdce8301150.png)


参考 (公式) https://developers.notion.com/docs/create-a-notion-integration

## Notion データベースの用意
**データベースの作成**
- プロパティに`contest`, `color`, `status`を持つデータベースを作成する
![notion_db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/fb26a1e3-9f5d-a87b-78dd-34c6d1569b43.png)


**インテグレーションの接続**
- コネクトの追加から，作成したインテグレーションを追加する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/35767d30-f6b0-d2a6-f978-c668f8f3cfb5.png" width="50%">

---
## 結果
    
**実行結果**
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/13bda403-3584-5039-f74e-96aeae2c9a05.png)



**statusの更新**

before
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/3715a74b-d075-5706-ed8d-d87028d71cd4.png" width="50%">

after
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/624bd70a-e88a-c186-70a8-ed621ee4ab82.png" width="50%">

---

## 参考
macの場合，ベースイメージをseleniumではなくseleniarmを使う (docker-compose)

https://qiita.com/xy2e45/items/2895fe98e79fe9da3d9c

Seleniumを使ってスクリーンショット

https://tech-lab.sios.jp/archives/28840

Googleドライブの操作

https://note.nkmk.me/python-pydrive-folder/

beautifulsoup

https://senablog.com/python-bs4-search/

https://qiita.com/d_m/items/f477c6665ec69dfaf594

https://pystyle.info/scraping-beautiful-soup-how-to-refer-elements/