やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubAPIのPagenationを仮実装した

リポジトリ取得など複数ページに渡る結果を複数回リクエストし、json結果を結合して返す。

成果物

GitHubGitHub.Pagenation

使い方はGitHubリポジトリ参照。

ソースコード

一部抜粋。

Main.py

from github import GitHub

username = "github_username"
db_path_account = "C:/GitHub.Accounts.sqlite3"
db_path_api = "C:/GitHub.Apis.sqlite3"

g = GitHub.GitHub(db_path_account, db_path_api, username)
res = g.repo.list(type='all', sort='created', direction='asc', per_page=100)

上記の場合、100件を超えるリポジトリがあると複数ページになる。

Pagenation.py

次のページがある限り、再帰で繰り返しリクエストする。このとき、1リクエストあたり2秒間待機する。サーバ負荷(リクエスト上限)対策である。

def pagenate(self, r, res):
    ...
    r2 = requests.get(r.links["next"]["url"], **params)
    ...
    time.sleep(2)
    self.pagenate(r2, res)
    ...

所感

基本的にPythonが分かっていない。良い書き方もわからない。認証、APIクライアント、データベースの階層付け、モジュール分け、クラス分けが難しい。GitHubAPIの機能をすべて把握できていないことも原因か。たとえばOTPを更新するところ(RequestParam.update_otp())が、いかにも取って付けたようで無様。