📚

AtCoderの提出コードをGitHubにアップするツールを作りました

2023/03/05に公開

AtCoderに提出したコードはAtCoderサイト内でいつでも確認可能なのですが、自分の全提出をまとめて見るといった場合には少し不便です。そこでAtCoderに提出しているコードを自分のGitHubのレポジトリに自動でアップロードするツールを作成してみました。

GitHubにアップすることで、GitHubのコントリビューションに草を生やすことができるのでモチベーションの維持にも繋がると思っています!

使い方はREADMEを参照してください。すべてPython3で実装されているのでPython3が動く環境さえあれば、簡単に実行できます。
https://github.com/kult0922/AtCommitter

仕様

以下のように実行することでabc290の自分の提出したACコードがGitHubにアップロードされます。
同じ問題に複数のACコードがある場合、新しいコードが優先されます。

python3 main.py abc290

以下のようなディレクトリ構造でGitHubレポジトリに格納されます。

└── abc290
    ├── abc290_a.cpp
    ├── abc290_b.cpp
    └── abc290_c.cpp

実装について

AtCoderには非公式の便利なAPIがありますが、これらのAPIは提出コードの取得はできないようでした。そこで今回はスクレイピング形式でAtcoderのページからデータを取得する方法を採用しました。

大まかな流れはこんな感じです。

  1. AtCoderのページから提出コード情報を取得
  2. ローカルにコードファイルを作成
  3. commit & push

提出コード取得方法

すべての提出コードには一意のsubmission_idがあります。
そこでまず、以下のページからコンテストの自分のACコードのsubmission_idの一覧を取得します。
自分のACコード一覧ページ

取得したsubmission_idから以下のページにアクセスしてコード情報を取得します。
提出詳細ページ

これらのページから欲しいデータを抽出するにはHTMLをパースする必要があります。
HTMLのパースにはPythonの公式HTMLパースライブラリを使用しました。
パース部分の詳細な実装を知りたい方は以下のコードチェックしてみてください。
https://github.com/kult0922/AtCommitter/tree/main/scraping

現状の問題点

HTMLからソースコードを探す際にidを目印にしています。そのため、今後AtCoder公式が提出コードページのHTMLを大きく変更した場合、このツールは動作しなくなる可能性があります。
これはスクレイピングあるある問題なので仕方ないですが。。。

おわりに

python3が動く環境なら簡単に実行できるので興味がある方は使ってみてください。
なにか問題があればissueをいただければ、できる限り対応します!

Discussion