广告主回传无效转化数据接口
广告主通过调用该接口,将认为是无效的转化数据发送给百度服务器。
请求方
广告主服务器
处理方
百度服务器
请求协议
Http POST
请求参数
参数名 | 类型 | 描述 | 限制 |
---|---|---|---|
token |
String | API接口token,每个推广账号对应一个唯一TOKEN | 必填 |
invalidConversionTypes |
InvalidConversionType[] | 回传无效转化数据数组,每次回传无效转化数据数组长度需小于100 | 必填 |
注意:一个转化一条数据,若一个logidUrl涉及两个转化类型,则需要回传两条
请求地址
https://ocpc.baidu.com/ocpcapi/api/uploadInvalidConvertData
示例
curl -H "Content-type: application/json" -X POST -d '{
"token": "your token",
"invalidConversionTypes": [
{
"logidUrl": "http://www.bb123.com/12345?XX=XXX&bd_vid=1111",
"convertType": 3,
"convertTime": 1568777933
},
{
"logidUrl": "http://www.bb123.com/12345?XX=XXX&bd_vid=2222",
"convertType": 3,
"convertTime": 1568777933
}
]
}' https://ocpc.baidu.com/ocpcapi/api/uploadInvalidConvertData
InvalidConversionType各参数说明
参数名 | 类型 | 描述 | 限制 |
---|---|---|---|
logidUrl |
String | logidUrl为带有&bd_vid=xxx的落地页url地址,只有在百度搜索广告里点击进入的落地页url,才会带有&bd_vid,如有相关疑问,可参考文档进行排查 | 必填,不可为空 长度不超过1024个字符 |
convertType |
Integer | 转化类型,每次选择一个类型回传,模型可用的转化类型请以推广后台新建转化追踪披露的转化类型为准 | 必填,不可为空。注:与原有效转化类型编码不一致,请使用文中最新的转化类型编码回传 |
convertTime |
Long | unix时间戳(精确到秒) | 必填,不可为空 |
ip |
String | 无效转化的IP地址 | 选填 |
confidence |
Integer | 置信度,0—100数字 | 选填 |
invalidReason |
String | 无效转化描述 | 选填 |
convertType类型枚举
点击这里查看转化类型编码
返回status状态码说明
status | 说明 |
---|---|
0 | 用户回传数据成功 |
1 | 用户回传数据部分成功 |
2 | 用户回传数据全部失败 |
3 | API接口TOKEN校验失败 |
4 | 服务内部错误 |
5 | 配额不足 |
返回errors错误码说明
错误码 | 说明 |
---|---|
1001 | 上传的invalidConversionTypes数组为空 |
1002 | invalidConversionTypes数组长度超过100 |
1003 | logidUrl无效 |
1004 | convertType无效 |
1005 | convertTime无效 |
返回结果示例
注意:服务端仅返回记录的具体错误原因。
客户可根据返回的错误提示对发送失败的记录进行修改,修改后可以再发送。
返回status字段(状态码)为0,表示用户上传数据成功
{
"header": {
"desc": "success",
"status": 0
}
}
返回status字段(状态码)为1,表示用户上传数据部分成功
- 上传的invalidConversionTypes数组中position位置的元素,没有logidUrl或者logidUrl值无效
{ "header": { "desc": "partly ok", "errors": [{ "code": 1003, "message": "logidUrl is not valid", "position": "1" }], "status": 1 } }
- 上传的invalidConversionTypes数组中position位置的元素,没有convertType或者convertType无效
{ "header": { "desc": "partly ok", "errors": [{ "code": 1004, "message": "convertType is not valid", "position": "1" }], "status": 1 } }
- 上传的invalidConversionTypes数组中position位置的元素,没有convertTime或者convertTime值无效
{ "header": { "desc": "partly ok", "errors": [{ "code": 1005, "message": "convertTime is not valid", "position": "1" }], "status": 1 } }
返回status字段(状态码)为2,表示用户上传数据全部失败
- 例如:上传数据数组元素个数>100
{ "header": { "desc": "failure", "errors": [{ "code": 1002, "message": "conversionTypes num exceed limit", "position": "0" }], "status": 2 } }
其他异常
- token验证失败
{ "header": { "desc": "The token in the request is incorrect", "status": 3 } }
- 服务端异常情况
{ "header": { "desc": "system error", "status": 4 } }
程序调用示例
Python代码调用示例(点击右上角切换语言)
版本:python2
# -*- coding: utf-8 -*-
import urllib2
import json
class InvalidConversionType:
"""
InvalidConversionType 类
"""
def __init__(self, logid_url, convert_type):
"""
初始化函数
:param logid_url: 落地页url地址
:param convert_type: 转化类型
"""
self.logid_url = logid_url
self.convert_type = convert_type
def to_dict(self):
"""
:return:
"""
return {"logidUrl": self.logid_url, "convertType": self.convert_type}
def send_data(token, conversion_type_list):
"""
回传转化数据接口
:param token: 用户回传数据api接口token
:param conversion_type_list: 回传转化数据列表
:return: 返回True代表成功 False代表失败
"""
requrl = "https://ocpc.baidu.com/ocpcapi/api/uploadInvalidConvertData"
cv_str_list = [c_cv.to_dict() for c_cv in conversion_type_list]
data = {
"token": token,
"invalidConversionTypes": cv_str_list
}
params = json.dumps(data)
# 发送的完整请求数据
# do some log
print params
header = {"Content-Type": "application/json; charset=UTF-8"}
request = urllib2.Request(requrl, data=params, headers=header)
# 发送数据,设置失败重试3次
retry_times = 3
for i in range(retry_times):
try:
response = urllib2.urlopen(request)
except Exception as e:
# do something
print "retry times: " + str(i) + "exception: " + str(e)
continue
if response.getcode() == 200:
result = response.read().decode("utf-8")
# 打印返回结果
# do some log
print "retry times: " + str(i) + " res: " + result
json_rep = json.loads(result)
status = json_rep['header']['status']
# status为4,代表服务端异常,可添加重试
if status != 4:
# status == 0 代表回传数据成功,其余情况回传数据失败
return status == 0
return False
if __name__ == '__main__':
token = "这里替换为您的token"
# 编辑一条转化数据,请替换实际的落地页url和转化类型
cv = InvalidConversionType(logid_url="您的落地页url", convert_type=1)
# 此处仅仅提供demo,支持添加更多的数据
cv_list = [cv]
send_data(token=token, conversion_type_list=cv_list)
版本:python3
# -*- coding: utf-8 -*-
import json
import requests
from typing import List
class InvalidConversionType:
"""
InvalidConversionType 类
"""
def __init__(self, logid_url: str, convert_type: int):
"""
初始化函数
:param logid_url: 落地页url地址
:param convert_type: 转化类型
"""
self.logid_url = logid_url
self.convert_type = convert_type
def to_dict(self) -> dict:
"""
:return:
"""
return {"logidUrl": self.logid_url, "convertType": self.convert_type}
def send_data(token: str, conversion_type_list: List[InvalidConversionType]):
"""
数据回传接口
:param token: 用户回传数据api接口token
:param conversion_type_list: 回传转化数据列表
:return: 返回True代表成功 False代表失败
"""
requrl = "https://ocpc.baidu.com/ocpcapi/api/uploadInvalidConvertData"
cv_str_list = [c_cv.to_dict() for c_cv in conversion_type_list]
data = {
"token": token,
"invalidConversionTypes": cv_str_list
}
req_data = json.dumps(data)
# 发送的完整请求数据
# do some log
print(req_data)
header = {"Content-Type": "application/json; charset=UTF-8"}
# 发送数据,设置失败重试3次
retry_times = 3
for i in range(retry_times):
try:
res = requests.post(requrl, req_data, headers=header)
except requests.RequestException as e:
# do something
print("retry times: {times} e: {e}".format(times=i, e=e))
continue
if res.ok:
# 打印返回结果
# do some log
print("retry times: {times} res: {res_content}".format(times=i, res_content=res.content.decode("UTF-8")))
status = res.json()['header']['status']
# status为4,代表服务端异常,可添加重试
if status != 4:
# status == 0 代表回传数据成功,其余情况回传数据失败
return status == 0
return False
if __name__ == '__main__':
token = "这里替换为您的token"
# 编辑一条转化数据,请替换实际的落地页url和转化类型
cv = InvalidConversionType(logid_url="http://www.b123.com/12345?XX=XXX&bd_vid=1111", convert_type=1)
# 此处仅仅提供demo,支持添加更多的数据
cv_list = [cv]
send_data(token=token, conversion_type_list=cv_list)
Java代码调用示例(点击右上角切换语言)
package com.demo;
import com.demo.model.ConversionType;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
/**
* API 回传数据Demo
*/
public class APIDemo {
private static final Integer RETRY_TIMES = 3;
private static final String BAIDU_OCPC_URL = "https://ocpc.baidu.com/ocpcapi/api/uploadInvalidConvertData";
/**
* 数据回传接口
* @param token 用户回传数据api接口token
* @param conversionTypeList 回传转化数据数组
* @return 返回true代表成功 false代表失败
*/
private static Boolean sendConvertData(String token, List<InvalidConversionType> conversionTypeList) {
JsonObject data = new JsonObject();
// 设置API接口回传Token
data.addProperty("token", token);
// 设置API接口回传conversionTypes
data.add("invalidConversionTypes",
new Gson().toJsonTree(conversionTypeList, new TypeToken<List<InvalidConversionType>>() {}.getType()).getAsJsonArray());
// 发送的完整请求数据
// do some log
System.out.println("req data: " + data.toString());
// 向百度发送数据
return sendWithRetry(data.toString());
}
private static boolean sendWithRetry(String msg) {
// 发送请求
CloseableHttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost(BAIDU_OCPC_URL);
post.setHeader("Content-type", "application/json; charset=UTF-8");
StringEntity entity = new StringEntity(msg, Charset.forName("UTF-8"));
entity.setContentEncoding("UTF-8");
post.setEntity(entity);
// 添加失败重试
int retry = RETRY_TIMES;
for (int i = 0; i < retry; i++) {
try {
HttpResponse response = client.execute(post);
// 检验状态码,如果成功接收数据
int code = response.getStatusLine().getStatusCode();
if (code == HttpStatus.SC_OK) {
String res = EntityUtils.toString(response.getEntity());
JsonObject returnData = new JsonParser().parse(res).getAsJsonObject();
// 打印返回结果
// do some log
System.out.println("retry times :" + i + ", res data: " + res);
int status = returnData.getAsJsonObject("header").get("status").getAsInt();
// status为4,代表服务端异常,可添加重试
if ( status != 4) {
return status == 0; // status == 0 代表回传数据成功,其余情况回传数据失败
}
}
} catch (IOException e) {
// do some log
}
}
return false;
}
public static void main(String[] args) {
String token = "这里替换为您的token";
List<InvalidConversionType> conversionTypes = new ArrayList<>();
// 编辑一条转化数据
InvalidConversionType cv = new InvalidConversionType();
cv.setLogidUrl("http://www.b123.com/12345?XX=XXX&bd_vid=1111"); // 设置落地页url
cv.setConvertType(1); // 设置转化类型
conversionTypes.add(cv);
System.out.println(APIDemo.sendConvertData(token, conversionTypes));
}
}
InvalidConversionType定义
package com.demo.model;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.io.Serializable;
public class InvalidConversionType implements Serializable {
/*
落地页Url
*/
private String logidUrl;
/*
转化类型
*/
private Integer convertType;
public String getLogidUrl() {
return logidUrl;
}
public void setLogidUrl(String logidUrl) {
this.logidUrl = logidUrl;
}
public Integer getConvertType() {
return convertType;
}
public void setConvertType(Integer convertType) {
this.convertType = convertType;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}
<?php
/**
* Class APIDemo API回传数据Demo
*/
class APIDemo {
const BAIDU_OCPC_URL = 'https://ocpc.baidu.com/ocpcapi/api/uploadInvalidConvertData';
const RETRY_TIMES = 3;
/**
* @param $token
* @param $invalidConversionTypes
* @return bool 发送成功返回true,失败返回false
*/
public function sendConvertData($token, $invalidConversionTypes) {
$reqData = array('token' => $token, 'invalidConversionTypes' => $invalidConversionTypes);
$reqData = json_encode($reqData);
// 发送完整的请求数据
// do some log
print_r('req data: ' . $reqData . "\n");
// 向百度发送数据
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, self::BAIDU_OCPC_URL);
curl_setopt($ch, CURLOPT_POSTFIELDS, $reqData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($reqData)
)
);
// 添加重试,重试次数为3
for ($i = 0; $i < self::RETRY_TIMES; $i++) {
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode === 200) {
// 打印返回结果
// do some log
print_r('retry times: ' . $i . ' res: ' . $response . "\n");
$res = json_decode($response, true);
// status为4,代表服务端异常,可添加重试
$status = $res['header']['status'];
if ($status !== 4) {
curl_close($ch);
return $status === 0;
}
}
}
curl_close($ch);
return false;
}
}
$token = '这里替换为您的token';
// 编辑一条转化数据
$cv = array(
'logidUrl' => 'http://www.b123.com/12345?XX=XXX&bd_vid=1111', // 您的落地页url
'convertType' => 1 // 转化类型请按实际情况填写
);
// 此处仅为demo, invalidConversionTypes支持添加更多数据
$invalidConversionTypes = array($cv);
$demo = new APIDemo();
$demo->sendConvertData($token, $invalidConversionTypes);
?>
Nodejs代码调用示例(点击右上角切换语言)
const https = require('https');
const url = require('url');
const endpoint = "https://ocpc.baidu.com/ocpcapi/api/uploadInvalidConvertData";
const parsedEndpoint = url.parse(endpoint);
const postData = JSON.stringify({
"token": "这里替换为您的token ",
"invalidConversionTypes": [
{
"logidUrl": "http://www.b123.com/12345?XX=XXX&bd_vid=1111",
"convertType": 1
}
]
});
const options = {
hostname: parsedEndpoint.hostname,
port: parsedEndpoint.port,
path: parsedEndpoint.path,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': postData.length
}
};
const req = https.request(options, (res) => {
//检验状态码,如果成功接收数据
if (res.statusCode === 200) {
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`"res data: ${chunk}`);
});
}
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
req.write(postData);
req.end();