これはAdventure Advent Calendar 2018の8日目の記事です。
ユーザーとしてAPIを使って、Gmailのメールを方法はいくつか見つけましたが、管理者視点での操作をしている情報が少なかったので、備忘録として残します。
特定のユーザーがメールが一杯になってしまうと、送信側であるお客様や取引先に迷惑が掛かるので、Gsuiteの管理者の視点として
GsuiteユーザーのGmailの容量(標準だと30GB)の利用統計を取りたい。
というのがあると思います。
ですが、Thunderbirdなどのメーラーを使ってGmailを使っている人は、今の容量を知る術がありません。
そこで、日時でGsuiteの全ユーザーの情報を取得するスククリプトを書いて、日時で回して運用する事にしました。
作成したコードは以下になります。
※事前に、
・ Gsuite APIの有効化(https://support.google.com/a/answer/60757?hl=ja)
・ OAUTHを使うユーザーのGsuite内権限の割り当て(https://support.google.com/a/answer/142566)
・ OAUTH認証設定(https://console.cloud.google.com/apis/credentials/consent?)
を行なって下さい。
コード
#!/bin/env python3/7
import os
from datetime import datetime, date, timedelta
import httplib2
from apiclient import discovery
from oauth2client import client, tools
from oauth2client.file import Storage
from bigquery import get_client
import requests
in_date = datetime.today()
in_date = datetime.strftime(in_date - timedelta(hours=48), '%Y-%m-%d')
def main():
try:
import argparse
parser = argparse.ArgumentParser(parents=[tools.argparser])
flags = parser.parse_args()
except ImportError:
flags = None
# 認証情報を格納するディレクトリ「.credentials」の設定。ディレクトリが無い場合は作成
credential_dir = os.path.join(os.path.expanduser('~'), '.credentials')
if not os.path.exists(credential_dir):
os.makedirs(credential_dir)
# 認証ファイルのパスを設定と読み込み
credential_path = os.path.join(credential_dir, 'admin-directory_v1.json')
store = Storage(credential_path)
credentials = store.get()
# 認証ファイルが無い場合は作成
if not credentials or credentials.invalid:
# 使用する機能の範囲を設定
scopes = [
'https://www.googleapis.com/auth/admin.reports.usage.readonly',
'https://www.googleapis.com/auth/admin.reports.audit.readonly'
]
# 認証キーの設定(~/.ssh/gsuite-admin.json)
secret_key = os.path.join(os.path.expanduser('~'), '.ssh', 'gsuite-admin.json')
# 認証キーから認証処理を行うクラスのインスタンスを生成
flow = client.flow_from_clientsecrets(secret_key, scopes)
# アプリケーションの名前
flow.user_agent = 'Gmail Check'
if flags:
credentials = tools.run_flow(flow, store, flags)
else:
credentials = tools.run(flow, store)
print('証明書を保存しました: ' + credential_path)
# 認証を行う
http = credentials.authorize(httplib2.Http())
app_report_service = discovery.build('admin', 'reports_v1', http=http)
# GsuiteのAPIを実行
results = app_report_service.userUsageReport().get(userKey='all',date=in_date).execute()
for i in extraction(results) :
print(i)
#
# GSuiteのAPI結果から必要な情報を抜く
#
def extraction(results):
recodes = []
for i in results['usageReports']:
recode = {}
# レポート日
recode["day"] = in_date
# メールアドレス
recode["email"] = i['entity']['userEmail']
for l in i['parameters']:
# 最終アクセス日時
if 'gmail:last_access_time' in l["name"]:
last_access = datetime.strptime(l["datetimeValue"], '%Y-%m-%dT%H:%M:%S.000Z')
last_access = datetime.strftime(last_access - timedelta(hours=9), '%Y-%m-%d %H:%M:%S')
recode["last_access_time"] = last_access
# 氏名
elif "accounts:admin_set_name" in l["name"]:
recode["name"] = l['stringValue']
# アカウントに割り当てられた容量(Gmailだけの値は無さそう)
elif "accounts:total_quota_in_mb" in l["name"]:
recode["total_mb"] = l['intValue']
# gmailの使用量
elif "accounts:gmail_used_quota_in_mb" in l["name"]:
recode["usage_mb"] = l['intValue']
# アカウントの使用量(パーセンテージ)
elif "accounts:used_quota_in_percentage" in l["name"]:
recode["usage_percent"] = l['intValue']
recodes.append(recode)
return recodes
結果
{'day': '2018-12-05', 'email': 'メールアドレス1', 'name': '名前1', 'usage_mb': '13793', 'total_mb': '30720', 'usage_percent': '44', 'last_access_time': '2018-12-05 22:59:14'}
{'day': '2018-12-05', 'email': 'メールアドレス2', 'name': '名前2', 'usage_mb': '1550', 'total_mb': '30720', 'usage_percent': '5', 'last_access_time': '2018-12-05 22:59:12'}
{'day': '2018-12-05', 'email': 'メールアドレス3', 'name': '名前3', 'usage_mb': '7107', 'total_mb': '30720', 'usage_percent': '23', 'last_access_time': '2018-12-05 22:59:13'}
{'day': '2018-12-05', 'email': 'メールアドレス4', 'name': '名前4', 'usage_mb': '6211', 'total_mb': '30720', 'usage_percent': '20', 'last_access_time': '2018-12-05 22:59:14'}
{'day': '2018-12-05', 'email': 'メールアドレス5', 'name': '名前5', 'usage_mb': '30202', 'total_mb': '30720', 'usage_percent': '98', 'last_access_time': '2018-12-05 22:59:45'}
注意
in_date = datetime.today()
in_date = datetime.strftime(in_date - timedelta(hours=48), '%Y-%m-%d')
取得対象日時の指定です。
Gsuiteのレポートは、リアルタイム性はありません。
12/8に前日分の情報を取得しようとすると、スクリプトを回すと以下のように怒られます。
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/admin/reports/v1/usage/users/all/dates/2018-12-07?alt=json returned "Data for dates later than 2018-12-06 is not yet available. Please check back later">
メールだけの正確なチェックではなありませんが、usage_percentが高いユーザーに連絡を行い、事前にデータの整理を行なってもらうように促せます。