AttributeError: 'module' object has no attribute 'SignedJwtAssertionCredentials'

AttributeError: 'module' object has no attribute 'SignedJwtAssertionCredentials'

问题:我一直在使用Python Script Samples by Google to upload the apk to Play Store and to get list of apps published via my account (list_apks.pyupload_apk.py)。但是最近它开始崩溃了。我尝试通过 pip install --update packagename 更新 google-api-python-clientoath2client 等包,但没有帮助。

日志:

如果在列出 apk 时:

Determining latest version for my.package.name...
error   25-Feb-2016 06:30:52    Traceback (most recent call last):
error   25-Feb-2016 06:30:52      File "list_apks.py", line 80, in <module>
error   25-Feb-2016 06:30:52        main()
error   25-Feb-2016 06:30:52      File "list_apks.py", line 46, in main
error   25-Feb-2016 06:30:52        credentials = client.SignedJwtAssertionCredentials(
error   25-Feb-2016 06:30:52    AttributeError: 'module' object has no attribute 'SignedJwtAssertionCredentials'
build   25-Feb-2016 06:30:52    Found latest APK version: 
build   25-Feb-2016 06:30:52    Generated new APK version: 1

这是上传apk的时候:

25-Feb-2016 06:33:30    Uploading APK...
25-Feb-2016 06:33:30    Traceback (most recent call last):
25-Feb-2016 06:33:30      File "upload_apk.py", line 115, in <module>
25-Feb-2016 06:33:30        main(sys.argv)
25-Feb-2016 06:33:30      File "upload_apk.py", line 62, in main
25-Feb-2016 06:33:30        credentials = client.SignedJwtAssertionCredentials(
25-Feb-2016 06:33:30    AttributeError: 'module' object has no attribute 'SignedJwtAssertionCredentials'

代码片段:

import argparse

from apiclient.discovery import build
import httplib2
from oauth2client import client


SERVICE_ACCOUNT_EMAIL = (
    'myaccountemail.com')

# Declare command-line flags.
argparser = argparse.ArgumentParser(add_help=False)
argparser.add_argument('package_name',
                       help='The package name. Example: com.android.sample')


def main():
  # Load the key in PKCS 12 format that you downloaded from the Google APIs
  # Console when you created your Service account.
  f = file('mykeyname.p12', 'rb')
  key = f.read()
  f.close()

  # HERE IS THE EXCEPTION 
  credentials = client.SignedJwtAssertionCredentials(
      SERVICE_ACCOUNT_EMAIL,
      key,
      scope='https://www.googleapis.com/auth/androidpublisher')
  http = httplib2.Http()
  http = credentials.authorize(http)
  ...

我还能尝试什么?非常感谢您的帮助。

经过这么多天,我终于找到了答案。原来 class SignedJwtAssertionCredentials2.0.0 更新中从 oath2client python 包中删除了。它不再位于 oauth2client.client 之下。该行为已移至 oauth2client.service_account.ServiceAccountCredentials.

以下对我有用:

import argparse

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

import httplib2
from oauth2client import client

SERVICE_ACCOUNT_EMAIL = ('myaccountemail.com')

# Declare command-line flags.
argparser = argparse.ArgumentParser(add_help=False)
argparser.add_argument('package_name',
                   help='The package name. Example: com.android.sample')

def main():
  key='mykeyname.p12'
  scope = 'https://www.googleapis.com/auth/androidpublisher'

  credentials = ServiceAccountCredentials.from_p12_keyfile(
      SERVICE_ACCOUNT_EMAIL,
      key,
      scopes=[scope]
  )
  http = httplib2.Http()
  http = credentials.authorize(http)
  ....

来源:

我有同样的问题而且 我没有安装 pyOpenSSL 使用 from_p12_keyfile().

时需要

from_p12_keyfile()

Raises:
NotImplementedError if pyOpenSSL is not installed / not the active crypto library.

我将 JSON 文件读入字典并将其传递给 from_json_keyfile_dict(),如下所示:

import json
from oauth2client.service_account import ServiceAccountCredentials
# other imports and code from sample...

# modified authentication part
data = {}
with open('api.json') as json_file:
  data = json.load(json_file)
credentials = ServiceAccountCredentials.from_json_keyfile_dict(
    data,
    scopes=['https://www.googleapis.com/auth/androidpublisher']
)
http = httplib2.Http()
http = credentials.authorize(http)
# do what ever you want with the returned object

api.json 文件是指创建服务帐户时创建的文件。

当然还有一些其他函数可以获取凭据,但这个解决方案帮助我使这些东西正常工作。也许这对将来的人有帮助。

参考:Oauth2Client.service_account