【问题标题】:Creating a DfpClient with a Service Account in Python在 Python 中使用服务帐户创建 DfpClient
【发布时间】:2014-11-25 02:20:07
【问题描述】:

我使用 google DFP api 来收集关于我们网站上点击的广告的一些统计信息。
代码是用 Python 编写的。目前,我正在尝试升级代码以使用 oAuth 2。
由于代码每天自动运行,无需任何用户参与,因此我创建了一个
我的 google 项目下的服务帐户,并将该帐户添加到 DoubleClick for
我们公司的出版商网络。根据网上的示例代码,我写了这个:

import httplib2  
from oauth2client.client import SignedJwtAssertionCredentials
from apiclient.discovery import build  
from googleads.dfp import DfpClient

GOOGLE_DFP_SCOPE="https://www.googleapis.com/auth/dfp"  
API_VERSION="v201411"  
KEY_FILE="*******.p12"  
ACCT_EMAIL="************************@developer.gserviceaccount.com"  
NETWORK_CODE="**********"
with open(KEY_FILE) as config_file:
    my_private_key = config_file.read()  
credentials = SignedJwtAssertionCredentials(service_account_name=ACCT_EMAIL, private_key=my_private_key,scope=GOOGLE_DFP_SCOPE)  
http = httplib2.Http()
http_auth = credentials.authorize(http)  
dfp_client = build(serviceName='dfp',version=API_VERSION,http=http_auth)

这段代码好像不正确,因为network_code还没有通过 代码中的任何位置。此外,它失败并显示以下消息:

apiclient.errors.UnknownApiNameOrVersion:名称:dfp 版本:v201411。

另外,下面一行:

dfp_client = DfpClient.LoadFromStorage()

不适用于我的情况,因为这似乎基于 googleads.yaml 仅针对具有客户端密码而非 P12 私钥的 Web 应用帐户进行格式化。

有什么建议吗?谢谢。

【问题讨论】:

    标签: python yaml jwt google-dfp service-accounts


    【解决方案1】:

    Apiclient.discovery 使用默认的route 来检查服务。 但我没有找到适用于发布商的 DoubleClick 服务。

    我使用此代码将 API 与 Oauth2 一起使用。使用Flask

    import json
    import requests
    import flask
    
    from googleads import dfp
    from googleads import oauth2
    
    app = flask.Flask(__name__)
    
    CLIENT_ID = ''
    CLIENT_SECRET = ''  # Read from a file or environmental variable in a real app
    SCOPE = 'https://www.googleapis.com/auth/dfp'
    REDIRECT_URI = ''
    APPLICATION_NAME = 'DFP API SERVICE'
    NETWORK_CODE = ''
    
    
    @app.route('/')
    def index():
    
        if 'credentials' not in flask.session:
            return flask.redirect(flask.url_for('oauth2callback'))
        credentials = json.loads(flask.session['credentials'])
        if credentials['expires_in'] <= 0:
           return flask.redirect(flask.url_for('oauth2callback'))
        else:
            try:
                refresh_token = credentials['refresh_token']
                oauth2_client = oauth2.GoogleRefreshTokenClient(CLIENT_ID, CLIENT_SECRET, refresh_token)
                dfp_client = dfp.DfpClient(oauth2_client, APPLICATION_NAME, NETWORK_CODE)
                user_service = dfp_client.GetService('UserService', version='v201508')
                user = user_service.getCurrentUser()
                return flask.render_template('index.html', name=user['name'])
            except:
                flask.session.pop('credentials', None)
                return flask.redirect(flask.url_for('oauth2callback'))
    
    @app.route('/oauth2callback')
    def oauth2callback():
        if 'code' not in flask.request.args:
            auth_uri = ('https://accounts.google.com/o/oauth2/auth?response_type=code'
                    '&access_type=offline&client_id={}&redirect_uri={}&scope={}&').format(CLIENT_ID, REDIRECT_URI, SCOPE)
            return flask.redirect(auth_uri)
        else:
            auth_code = flask.request.args.get('code')
            data = {'code': auth_code,
                'client_id': CLIENT_ID,
                'client_secret': CLIENT_SECRET,
                'redirect_uri': REDIRECT_URI,
                'grant_type': 'authorization_code'}
            r = requests.post('https://www.googleapis.com/oauth2/v3/token', data=data)
            flask.session['credentials'] = r.text
            return flask.redirect(flask.url_for('index'))
    
    if __name__ == '__main__':
        import uuid
        app.secret_key = str(uuid.uuid4())
        app.debug = False
        app.run()
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      你是对的。创建 dfp 客户端时必须传递网络代码。并且版本不是必需的。尝试以下代码在 python 中创建客户端。

      import os
      
      from googleads import oauth2
      from googleads import dfp
      
      def get_dfp_client():
          application_name = "Your application name" # from google developer console. eg: Web Client
          network_code = ********
          private_key_password = 'notasecret'
          key_file = os.path.join('path/to/p12file')
          service_account_email = '****@***.iam.gserviceaccount.com'
          # create oath2 client(google login)
          oauth2_client = oauth2.GoogleServiceAccountClient(
            oauth2.GetAPIScope('dfp'), service_account_email, key_file)
      
          dfp_client = dfp.DfpClient(oauth2_client, application_name, network_code)
          return dfp_client
      
      client = get_dfp_client()
      

      Reference

      如果您需要更多说明,请发表评论。

      更新

      googleads 将模块 dfp 重命名为 ad_manager,docs here – Gocht

      【讨论】:

      • 哪个 googleads 版本有 dfp?导入 dfp 时出现错误
      • 供将来参考:googleads 将模块 dfp 重命名为 ad_manager,文档 here
      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 2020-06-27
      • 1970-01-01
      • 2022-11-08
      • 2021-09-27
      • 1970-01-01
      • 2020-01-30
      • 2015-11-08
      相关资源
      最近更新 更多