由于公司做广告变现业务,投放直接去看谷歌平台数据会比较麻烦,所以有了直接拉取到谷歌全部广告平台的数据的需求,特意记录一下。
1.前期准备登录
先创建项目(这里我已经创建,如果没有自己创建一个新项目)
选择oauth同意屏幕(API和服务→OAuth同意屏幕→)
创建客户端(谷歌API大部分都是需要OAuth 2.0验证)
贴一张我创建成功后的截图,主要是需要客户端ID和
然后启用广告服务API
点击进去并且用该API
然后登录,左侧菜单找到管理员→API中心找到开发者令牌,如果已经有了可以直接使用,如果提示测试令牌则需要申请其他类型的令牌,请注意申请其他令牌需要等待的时间可能1-2个月,我申请的标准令牌就等了2个月,如果申请的话按照表单需要的数据填写,然后等待邮箱通知
至此所有编写代码前的步骤就准备完善
2.开发代码
依赖准备
com.google.api-ads
google-ads
com.google.guava
guava
com.google.auth
google-auth-library-oauth2-http
com.google.api-client
google-api-client
com.google.http-client
google-http-client-gson
com.google.code.gson
gson
com.google.oauth-client
google-oauth-client
org.springframework.security
spring-security-oauth2-client
com.squareup.okhttp3
okhttp
com.restfb
restfb
com.google.http-client
google-http-client-jackson2
com.google.oauth-client
google-oauth-client-jetty
com.google.guava
guava
com.google.apis
google-api-services-admob
com.google.apis
google-api-services-adsense
配置文件准备(第一步获取的所有数据)
client-id:客户端ID
client-secret:客户端密钥
refresh-token:刷新token(我是使用该token获取数据的)
developer-token:广告平台的开发者令牌
开始编写代码
@Service
@Slf4j
public class GoogleAdsServiceA {
@Value("${google.ads.developer-token}")
private String developerToken;
@Value("${google.ads.client-id}")
private String clientId;
@Value("${google.ads.client-secret}")
private String clientSecret;
@Value("${google.ads.refresh-token}")
private String refreshToken;
private GoogleAdsClient googleAdsClient;
@Autowired
private IAdExchangeRateService adExchangeRateService;
@PostConstruct
public void init() {
try {
Credentials credentials = UserCredentials.newBuilder()
.setClientId(clientId)
.setClientSecret(clientSecret)
.setRefreshToken(refreshToken)
.build();
googleAdsClient = GoogleAdsClient.newBuilder()
.setCredentials(credentials)
.setDeveloperToken(developerToken)
.build();
log.info("Google Ads Client 初始化成功");
} catch (Exception e) {
log.error("Google Ads Client 初始化失败", e);
throw new RuntimeException("Google Ads Client 初始化失败", e);
}
}
}
上面是初始化客户端的代码,下面贴几个查询的api的关键sql代码,也可以去api中心去看文档
查询广告计划,是广告子账户的ID,是广告平台的顶级账号ID(也就是你要获取的那个账号数据)
public List getCampaigns(Long customerId, Long managerCustomerId) {
GoogleAdsServiceClient googleAdsServiceClient = null;
try {
log.info("开始查询客户 ID {} 的广告系列", customerId);
// 1. 创建 GoogleAdsClient,设置 login-customer-id 为 managerCustomerId
Credentials credentials = UserCredentials.newBuilder()
.setClientId(clientId)
.setClientSecret(clientSecret)
.setRefreshToken(refreshToken)
.build();
googleAdsClient = GoogleAdsClient.newBuilder()
.setCredentials(credentials)
.setDeveloperToken(developerToken)
.setLoginCustomerId(managerCustomerId)// 设置管理员账户 ID
.build();
// 2. 创建 GoogleAdsServiceClient
googleAdsServiceClient = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient();
// 3. 构建最简单的查询
//String query = "SELECT campaign.id, campaign.name FROM campaign";
String query = "SELECT campaign.id, campaign.name, campaign.status, campaign.start_date, campaign.end_date, campaign.campaign_budget" +
" FROM campaign "+
"WHERE campaign.status IN ('ENABLED', 'PAUSED')";
// 4. 创建请求
SearchGoogleAdsRequest request = SearchGoogleAdsRequest.newBuilder()
.setCustomerId(String.valueOf(customerId)) // 设置目标客户 ID
.setQuery(query)
.build();
// 5. 执行查询并处理结果
List campaigns = new ArrayList();
for (GoogleAdsRow row : googleAdsServiceClient.search(request).iterateAll()) {
log.info("查询到的广告计划: {}", row.getCustomerClient());
Campaign campaign = row.getCampaign();
CampaignDto dto = new CampaignDto();
dto.setCampaignId(campaign.getId());
dto.setCampaignName(campaign.getName());
dto.setStatus(campaign.getStatus().toString());
dto.setBudget(campaign.getCampaignBudget());
dto.setStartDate(campaign.getStartDate());
dto.setEndDate(campaign.getEndDate());
campaigns.add(dto);
}
log.info("成功获取到 {} 个广告系列", campaigns.size());
return campaigns;
} catch (Exception e) {
log.error("查询广告系列失败: {}", e.getMessage(), e);
throw new RuntimeException("查询广告系列失败: " + e.getMessage());
} finally {
// 确保关闭服务客户端
if (googleAdsServiceClient != null) {
try {
googleAdsServiceClient.close();
} catch (Exception e) {
log.warn("关闭客户端时出错", e);
}
}
}
}
查询账户预算SQL
String query = "SELECT campaign_budget.id, campaign_budget.name, campaign_budget.amount_micros "
+ "FROM campaign_budget "
+ "WHERE campaign_budget.resource_name = '" + campaignBudgetResourceName + "'";
查询广告洞察计划SQL
String query = "SELECT " +
"campaign.id, " +
"campaign.name, " +
"campaign.start_date, " +
"campaign.end_date, " +
"segments.conversion_action, " +
"metrics.conversions, " +
"metrics.conversions_value " +
"FROM campaign " +
"WHERE segments.date BETWEEN '" + startDate + "' AND '" + endDate + "'";
云衔科技是一家专注于企业数字化广告营销解决方案的服务商。公司凭借深厚的行业经验和专业技术能力,致力于为企业客户提供全方位、更高效的数字化广告营销与运营服务。