eyecatch thumbnail

Gmail API Python を使った認証方法

Profile picture
ルッチ / Lucci
2020.07.28

Contents


はじめに

Gmail の API を Python で叩き、認証する方法についての紹介です。

使っているパソコンは MacMini でして、作業環境は以下のとおりです。

環境
macOS Catalina 10.15.4
Python 3.6.5 :: Anaconda, Inc.

ターミナルから python ???.py を実行して、Gmail API を叩き、ブラウザ経由で認証させます。

認証した後は、スレッドやメッセージの取得メッセージの送信メッセージのラベル変更、などができるようになります。 (これらの記事は現在執筆中です。公開まで少々お待ちください。)

参考文献は Python QuickstartChoose Auth Scopes です。

それでは参りましょう。

まずは credential.json を取得する

Gmail API を認証させるためには、credentials.json が必要です。

credentials.json の入手方法の一例は次のとおりです。

  • Python Quickstart Step1: Turn on the Gmail APIEnable the Gmail API をクリックしてください figure enable the gmail api
  • Desktop app を選択して、Create をクリックしてください figure select Desktop app
  • Download client configuration をクリックすれば、credentials.json がダウンロードされます figure download client configuration

credentials.json を、今回実装する python ファイルがあるフォルダに移動しておいてください。もしくは、credentials.json$HOME/.ssh/ 配下などに保存して、python に探してきてもらう方法でも良いかと思います。

Gmail API に必要なライブラリをインストールする

次に、Gmail API に必要なライブラリをインストールしましょう。

以下の pip コマンドを実行してください。

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

エラーはでないはずです。もしもエラーがでたら、ググって解決してくださいませ。

ソースコード全文

以下に Gmail API 認証コードの全文を示します。

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

def gmail_authorize():
    """Shows how to authorize Gmail API.
    """
    creds = None
    # The file token.pickle stores the user's access and 
    # refresh tokens, and is created automatically when 
    # the authorization flow completes for the first time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    return creds

def main():
    """Shows the basic usage of Gmail API.
    1. Authorize Gmail API.
    """
    creds = gmail_authorize()
    service = build('gmail', 'v1', credentials=creds)
    print(creds)
    print(service)

if __name__ == '__main__':
    main()

quickstart.py を実行する

コードをコピペして quickstart.py というファイル名で credentials.json と同じフォルダに保存してください。

quickstart.py を保存したら、以下のコマンドを実行してください。

python quickstart.py

すると、デフォルトブラウザに Gmail API の認証ページが表示されます。

  • まずはアカウントを選択してください (画像ではアカウントリストを表示していませんが、実際には表示されているはずです) figure select your account
  • 権限を与えるかどうか問われますので、許可しましょう figure authorize gmail api readonly
  • 権限を許可したので、いまブラウザで表示されているページは閉じていただいて結構です。 figure authorized

ターミナルに戻り、以下のログが出力されていれば認証成功です! (メモリアドレス, e.g. 0x7f81e0047be0, は各環境によって異なります)

<google.oauth2.credentials.Credentials object at 0x7f81e0047be0>
<googleapiclient.discovery.Resource object at 0x7f81f0535710>

認証に成功したかどうかは、token.pickle というファイルが存在するかでも確認できます。

ターミナルで ls コマンドを実行して、token.pickle というファイルが見つかりますか?

見つかれば、認証に成功しています。


ソースコード詳細

ひとまず「Gmail API を認証する」という主目的が達成できました。

これ以降で、具体的にソースコードの中身を説明します。

必要なライブラリを import する

pip コマンドでインストールしたライブラリを import します。ここは特に説明することはないかなと思います。

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

Gmail API に与える権限 SCOPES を定義する

SCOPES で、Gmail API に与える権限を定義します。今回は、全てのリソースへの読み込みを許可します。

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

SCOPESreadonly (読み込み許可) 意外にも modify (更新) や send (送信) など、様々なオプションがあります。

SCOPES で定義できるオプションについては Gmail API Scopes 日本語訳 にまとめてありますので、興味のある方はお読みください。

Gmail API を認証するための鍵を発行する

Gmail API は以下の gmail_authorize() 関数で認証しています。

まず、token.pickle というファイルがあるかどうか調べます。

もしも token.pickle ファイルがあれば、token.pickle ファイルをロードして、creds (credentials の略) に代入します。

token.pickle がなく、さらに、creds が有効ではない場合、creds を更新するようにリクエストをします。

token.pickle がなく、creds もなければ、credentials.json の情報に基づいて creds を発行し token.pickle を書き出します。

最後に、creds を返して終了です。

def gmail_authorize():
    """Shows how to authorize Gmail API.
    """
    creds = None
    # The file token.pickle stores the user's access and 
    # refresh tokens, and is created automatically when 
    # the authorization flow completes for the first time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    return creds

main() 関数で実行する

最後に、main() 関数で gmail_authorize() を実行して、Gmail API 認証鍵 creds を発行して、creds を使って Gmail API を実行できるように認証します。

def main():
    """Shows the basic usage of Gmail API.
    1. Authorize Gmail API.
    """
    creds = gmail_authorize()
    service = build('gmail', 'v1', credentials=creds)
    print(creds)
    print(service)

if __name__ == '__main__':
    main()

おわりに

Gmail API with python の認証方法についての紹介でした。

当ブログでは,この記事以外にも Gmail API with python の記事をいくつか書いています.

合わせてお読みいただけると嬉しいです.

最後までお読みいただき、ありがとうございました。

愛用品

  • Xiser Pro Trainer
    1日中踏み続けられる強靭なステッパーでおすすめです.
  • HHKB Professional 墨 x HHKB キートップセット 白
    ボディは墨色キートップは白色なのでめちゃめちゃ目に優しいのでおすすめです.
  • Apple Magic Mouse 2
    トラックパッドは指が攣りそうになりますけどマウスはその心配が無いのでおすすめです.
  • Apple MacMini
    ミニマルでパワフルなデスクトップ PC なので個人的に大好きなのでおすすめです.
  • iiyama Display 27inch FullHD
    鮮明すぎない画面で目も疲れにくいですし何より高さ調節できるのが最高なのでおすすめです.
  • KINTO UNITEA 550ml
    500ml の大容量でこの綺麗なデザインは他にみたことがないのでおすすめです.

関連記事


Python 初学者へのお知らせ

約2時間で Python の基礎を学び、簡単なゲームを作ってみませんか?

そんな方に、Python の基本を実践的に学びたい人向けの講座、【無料】ゼロから始めるPythonプログラミング入門講座(週4開催)をお勧めします。

tech-ad-techgym-python

この講座で、無料でゲーム開発を通してプログラミングの基礎を身につけてみませんか?

少しでも気になった方は、上記のテキストリンクもしくは画像リンクから申し込みお願いします!

Python との楽しい日々をお過ごしください:)

大学生へのお知らせ

ここまで記事を読んでくれて本当に嬉しいです、ありがとうございます。

プログラミングを始めたばかりの頃って「やるぞ!」という気持ちは強めですが、 実際に取り組み始めると「何からどうやってどこまでやればいんだ?」 という感じで羅針盤を失うことが多いような気がします。(実体験)

そんな勉強熱心で向上心高めなんだけど目指す姿が曖昧な大学生の方に感謝の意も込めて、就職活動までサポートするプログラミングスクール「レバテックカレッジ」を紹介します。↓

Levtech-college

「自走力」のあるエンジニアを最短3ヶ月で目指せるカリキュラムが月額30,000円で用意されていて、 現段階の「目指す姿が曖昧で何から手をつければいいかわからない状態」から脱却できます。

自分は実際にIT企業で働いていますが、「自走力」のあるエンジニアの方にはいつも助けられています。

なので、目指す姿が曖昧な人はとりあえずレバテックカレッジが導いてくれる 「自走力のあるエンジニア」を目指してみるのはスタートダッシュとしてはアリです。

レベルアップしてからジョブチェンするのはRPGでも常套手段ですし、 レバテックカレッジで一通りのスキルを習得してから自分の目指す姿を再定義するといいかもです。

「自走力のあるエンジニア」って実際どんなエンジニアなの? 何から手をつければいいかわからないから教えて欲しい、 という人は上のテキストリンク/画像リンクから「無料相談会」への申し込みをお願いします。

よきエンジニアライフを!