在Python中使用服务帐户创建DfpClient

时间:2014-11-25 02:20:07

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

我使用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:name:dfp version:v201411。

另外,下面一行:

dfp_client = DfpClient.LoadFromStorage()

对我的情况不起作用,因为这是基于googleads.yaml的 仅针对具有客户端密钥的Web应用程序帐户进行格式化,而不是P12私钥。

有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:2)

Apiclient.discovery使用默认route来检查服务。 但我没有为DFP广告管理系统找到服务。

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

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char c;
  FILE *from, *to;

  from = fopen("file.txt", "r");
  if (from == NULL)
  {
    perror("file.txt doesn't exist.");
    exit(1);
  }

  to = fopen("copy.txt", "w");
  if (to == NULL)
    {
      perror("copy.txt doesn't exist.");
      exit(1);
    }
  do
    {
      c = getc(from);
      putc(c, to);
    }
  while(c != EOF);
  fclose(to);
  fclose(from);
  exit(0);
}

我希望这可以帮到你

答案 1 :(得分:0)

你是对的。您必须在创建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,文档here - Gocht