Skip to content

gadmin の user/group/member list で全件を取得する - #75

Open
ikedaosushi wants to merge 1 commit into
masterfrom
fix-gadmin-list-pagination
Open

ikedaosushi wants to merge 1 commit into
masterfrom
fix-gadmin-list-pagination

Conversation

@ikedaosushi

Copy link
Copy Markdown

概要

$gadmin user list が100件で切れて、アルファベット順で v より後のユーザーが出ない問題を直します。

原因

gadmin.py は Directory API の list() を1回しか呼んでおらず、nextPageToken をたどっていませんでした。users.list は既定で1ページ100件です。group list と member list も同じ書き方で、こちらは200件を超えると切れます(Directory API の limits)。

変更

対象は pyconjpbot/google_plugins/gadmin.py だけです。

  • _list_all: list_next で全ページをたどります。1ページの件数は users 500、groups/members 200 です。
  • _send_lines: 一覧を100行ずつに分けて送り、2通目以降は1秒あけます。
    • botsend は RTM(websocket)で送られます。Slack は16KBを超えるメッセージを送ったクライアントを切断し、書き込みは1秒に1回までと案内しています(rate limits)。全件を1通にすると、bot が切断されるおそれがあります。
  • member list: グループが見つからない 404 のときだけ「合致するグループはありません」と返します。それ以外の HttpError(429、5xx など)は内容を表示します。

見出しと各行の書式は変えていません。

確認したこと

  • isort、flake8(--isolated、tox.ini と同じ設定)、py_compile は通ります。
    • tox.ini の flake8 の設定は、行末のコメントのせいで今の flake8 では読めません。
  • black は差分の外にある既存の1行(_gadmin_group_insert の長い botsend)だけを指摘します。この行は master でも同じ指摘が出ます。
  • google-api-python-client 2.97.0 の discovery と HttpMockSequence を使い、3ページ1037件を取り切れることを確かめました。リクエストの pageToken は None、T1、T2 の順で、maxResults=500 が付いていました。
  • _send_lines は、250行を3通(2通目以降の前に1秒待つ)、0件を見出しだけ1通で送ります。1通の RTM フレームは最大で約5KBです(日本語の氏名を含めて計測)。
  • 本番の Slack と Google Workspace での実行はまだです。

デプロイについて

ISSHA-3528 のとおり、ansible では今 pyconjpbot を構築できません。マージしても本番には自動では反映されません。origin.pycon.jp 上の gadmin.py を、このファイルで置き換えて再起動する必要があります。

🤖 Generated with Claude Code

`$gadmin user list` は Directory API の既定の100件で切れていた。
user list / group list / member list を list_next で全ページたどる。

全件を1通にすると RTM の上限(16KB)を超えて bot が切断されるおそれが
あるので、一覧は100行ずつ、2通目以降は1秒あけて送る。

member list は 404 のときだけ「合致するグループはありません」と返し、
それ以外の HttpError は内容を表示する。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant