【メモ】「ImportError: cannot import name 'SignedJwtAssertionCredentials」の対処方法

今までAnalytics APIにアクセスするのにoauth2clientを使っていたのですが、oauth2clientのバージョンを1.5.2から2.0.0にアップグレードしたら例外が発生するようになってしまいました。

from oauth2client.client import SignedJwtAssertionCredentials
ImportError: cannot import name 'SignedJwtAssertionCredentials'

これを対処して解決したのでメモを残しておきます。使用したPythonのバージョンは3.5.1です。

原因と対応方法

from oauth2client.client import SignedJwtAssertionCredentials
ImportError: cannot import name 'SignedJwtAssertionCredentials'

エラーメッセージの通りですが、SignedJwtAssertionCredentialsがなくなったみたいですね。で、oauth2clientのコードを見たら、oauth2client.service_account.ServiceAccountCredentialsfrom_json_keyfile_nameというクラスメソッドがあり、これで対応できそうなことがわかりました。

修正内容

修正前のコード

oauth2clientの1.5.2で動いていたコードです。initialize_serviceは、多分どっかから拾ってきたコードです。

# coding: utf-8
import os
from datetime import date, timedelta
import httplib2
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials

# サービスアカウントのメールアドレス
SERVICE_ACCOUNT_EMAIL = '<<SERVICE_ACCOUNT_EMAIL>>'

# サービスアカウントの秘密鍵のファイル名
SERVICE_ACCOUNT_SERCRET = '<<SECRET>>'

# AnalyticsのビューID
PROFILE_ID = '<<VIEW_ID>>'


def initialize_service():
    http = httplib2.Http()
    filepath = os.path.join(os.path.dirname(__file__), SERVICE_ACCOUNT_SERCRET)
    f = open(filepath, 'rb')
    key = f.read()
    f.close()
    credentials = SignedJwtAssertionCredentials(
        SERVICE_ACCOUNT_EMAIL, key,
        scope='https://www.googleapis.com/auth/analytics.readonly')
    http = credentials.authorize(http)
    return build('analytics', 'v3', http=http)


def main():
    service = initialize_service()
    today = date.today()
    start_date = (today - timedelta(days=1)).strftime('%Y-%m-%d')
    end_date = today.strftime('%Y-%m-%d')

    result = service.data().ga().get(
        ids='ga:' + PROFILE_ID,
        start_date=start_date,
        end_date=end_date,
        dimensions='ga:pagePath',
        metrics='ga:pageviews',
        sort='-ga:pageviews',
    ).execute()
    print(result.get('rows'))


if __name__ == '__main__':
    main()

修正後のコード

oauth2clientの2.0.0に対応させるために、SignedJwtAssertionCredentialsではなくServiceAccountCredentialsを使うようにしました。

# coding: utf-8
import os
from datetime import date, timedelta
import httplib2
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

# サービスアカウントのメールアドレス
SERVICE_ACCOUNT_EMAIL = '<<SERVICE_ACCOUNT_EMAIL>>'

# サービスアカウントの秘密鍵のファイル名
SERVICE_ACCOUNT_SERCRET = '<<SECRET>>'

# AnalyticsのビューID
PROFILE_ID = '<<VIEW_ID>>'

# スコープ
SCOPES = [
    'https://www.googleapis.com/auth/analytics.readonly',
]


def initialize_service():
    secret_filepath = os.path.join(
        os.path.dirname(__file__), SERVICE_ACCOUNT_SERCRET)
    http = httplib2.Http()
    credentials = ServiceAccountCredentials. from_p12_keyfile(
        service_account_email=SERVICE_ACCOUNT_EMAIL,
        filename=secret_filepath, scopes=SCOPES)
    http = credentials.authorize(http)
    return build('analytics', 'v3', http=http)


def main():  # ここから下は一緒です。
    service = initialize_service()
    today = date.today()
    start_date = (today - timedelta(days=1)).strftime('%Y-%m-%d')
    end_date = today.strftime('%Y-%m-%d')

    result = service.data().ga().get(
        ids='ga:' + PROFILE_ID,
        start_date=start_date,
        end_date=end_date,
        dimensions='ga:pagePath',
        metrics='ga:pageviews',
        sort='-ga:pageviews',
    ).execute()
    print(result.get('rows'))


if __name__ == '__main__':
    main()

これで無事Analyticsのデータを取得できるようになりました。

この記事が役に立った場合、シェアしていただけると励みになります!!