首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UnknownApiNameOrVersion来自谷歌的mybusiness(我的业务)

UnknownApiNameOrVersion来自谷歌的mybusiness(我的业务)
EN

Stack Overflow用户
提问于 2022-03-25 09:09:11
回答 1查看 399关注 0票数 0

我正在通过谷歌是我的商业API使用Google的API Python客户端库

下面是一个完整的代码示例:

代码语言:javascript
运行
复制
from dotenv import load_dotenv
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from os.path import exists
from pprint import pprint
import os
import pickle

load_dotenv()

API_DEVELOPER_KEY = os.getenv('API_DEVELOPER_KEY')
API_SCOPE = os.getenv('API_SCOPE')
STORED_CLIENT_CREDENTIALS = os.getenv('STORED_CLIENT_CREDENTIALS')
GOOGLE_APPLICATION_CREDENTIALS = os.getenv('GOOGLE_APPLICATION_CREDENTIALS')


def get_google_credentials(path=STORED_CLIENT_CREDENTIALS):
    '''Loads stored credentials. Gets and stores new credentials if necessary.'''
    if exists(path):
        pickle_in = open(path, 'rb')
        credentials = pickle.load(pickle_in)
    else:
        flow = InstalledAppFlow.from_GOOGLE_APPLICATION_CREDENTIALS_file(
            GOOGLE_APPLICATION_CREDENTIALS_file=GOOGLE_APPLICATION_CREDENTIALS, scopes=API_SCOPE)
        flow.run_local_server()
        credentials = flow.credentials
        store_google_credentials(credentials)
    return credentials


def store_google_credentials(credentials, path=STORED_CLIENT_CREDENTIALS):
    '''Store credentials for future reuse to avoid authenticating every time.'''
    pickle_out = open(path, 'wb')
    pickle.dump(credentials, pickle_out)
    pickle_out.close()


def get_google_api_interface(credentials, service_name, service_version, service_discovery_url=None):
    '''Get a resource object with methods for interacting with Google's API.'''
    return build(service_name,
                 service_version,
                 credentials=credentials,
                 developerKey=API_DEVELOPER_KEY,
                 discoveryServiceUrl=service_discovery_url)


def extract_dict_key(dict, key):
    '''Utility to extract particular values from a dictionary by their key.'''
    return [d[key] for d in dict]


def transform_list_to_string(list, separator=' '):
    return separator.join(map(str, list))


def get_google_account_names():
    '''Get a list of all account names (unique ids).'''
    google = get_google_api_interface(
        get_google_credentials(),
        service_name='mybusinessaccountmanagement',
        service_version='v1',
        service_discovery_url='https://mybusinessaccountmanagement.googleapis.com/$discovery/rest?version=v1')
    accounts = google.accounts().list().execute()
    return extract_dict_key(accounts['accounts'], 'name')


def get_google_store_reviews(account_name):
    '''Get all store reviews for a specific account from Google My Business.'''
    google = get_google_api_interface(
        get_google_credentials(),
        service_name='mybusiness',
        service_version='v4',
        service_discovery_url='https://mybusiness.googleapis.com/$discovery/rest?version=v4')
    return google.accounts().locations().batchGetReviews(account_name).execute()


account_names = get_google_account_names()

pprint(account_names)

first_account_name = account_names[0]

pprint(get_google_store_reviews(first_account_name))

这是.env的内容

代码语言:javascript
运行
复制
API_DEVELOPER_KEY = ********
API_SCOPE = https://www.googleapis.com/auth/business.manage
STORED_CLIENT_CREDENTIALS = secrets/credentials.pickle
GOOGLE_APPLICATION_CREDENTIALS = secrets/client_secrets.json

我的函数get_google_account_names()工作正常,并返回预期的数据:

代码语言:javascript
运行
复制
['accounts/******************020',
 'accounts/******************098',
 'accounts/******************872',
 'accounts/******************021',
 'accounts/******************112']

我已经对get_google_credentials()进行了测试和验证,以确保CLIENT_CREDENTIALSAPI_DEVELOPER_KEY确实正确加载并正常工作。

另外,在.env中,我将环境变量GOOGLE_APPLICATION_CREDENTIALS设置为client_secret.json路径,这是Google的Python中需要的一些方法。

然而,我的函数get_google_store_reviews()导致了以下错误:

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "/my-project-dir/my-script.py", line 88, in <module>
    pprint(get_google_store_reviews())
  File "/my-project-dir/my-script.py", line 76, in get_google_store_reviews
    google = get_google_api_interface(
  File "/my-project-dir/my-script.py", line 46, in get_google_api_interface
    return build(service_name,
  File "/my-project-dir/.venv/lib/python3.9/site-packages/googleapiclient/_helpers.py", line 131, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/my-project-dir/.venv/lib/python3.9/site-packages/googleapiclient/discovery.py", line 324, in build
    raise UnknownApiNameOrVersion("name: %s  version: %s" % (serviceName, version))
googleapiclient.errors.UnknownApiNameOrVersion: name: mybusiness  version: v4

我还尝试了探索文档的v1,结果也是一样的。

有人知道这是怎么回事吗?似乎API mybusiness是无法通过Google提供的发现文档发现的,但我不知道如何验证我的怀疑。

请注意,问题是相关的,但并不完全相同。这些问题的答案是旧的,似乎不再适用于谷歌最近的变化。

更新:

正如一位评论者所指出的,这个API似乎是不受欢迎的。然而,这可能解释了我遇到的问题,Google文档说:

“弃用表示API 的版本将继续运行…”

此外,请注意,即使顶级accounts.locations被标记为已弃用,但其他一些底层方法(包括batchGetReviews)却没有。

有关更多细节,请参见屏幕截图:

这个问题也是GitHub报道问题。

EN

回答 1

Stack Overflow用户

发布于 2022-03-25 12:16:23

batchGetReviews方法需要一个帐户作为路径参数。

因此,您应该遍历get_google_account_names(),调用.batchGetReviews(google_account)而不是.batchGetReviews(google_accounts)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71614460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档