Servicio Experience Cloud ID (ECID)
Creado para:
- Desarrollador
Integración de Experience Cloud ID (ECID)
Aunque el uso de los SDK de Target para recuperar contenido de Target puede ser eficaz, el valor agregado del uso de Experience Cloud ID (ECID) para el seguimiento de usuarios se extiende más allá de Adobe Target. AAM El ECID le permite aprovechar Adobe Experience Cloud productos y características, como los informes de A4T y los segmentos de Adobe Audience Manager ().
visitor.js
genera y mantiene el ECID, que mantiene su propio estado. El archivo visitor.js
crea una cookie denominada AMCV_{organizationId}
, que utilizan los SDK de Target para la integración de ECID. Cuando se devuelve la respuesta Target, debe actualizar la instancia de visitante en el lado del cliente con thevisitorState
devuelto por los SDK de Target.
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ECID (Visitor API) Integration Sample</title>
<script src="VisitorAPI.js"></script>
<script>
Visitor.getInstance("${organizationId}", {serverState: ${visitorState}});
</script>
</head>
<body>
<pre>Sample content</pre>
</body>
</html>
const express = require("express");
const cookieParser = require("cookie-parser");
const TargetClient = require("@adobe/target-nodejs-sdk");
const CONFIG = {
client: "acmeclient",
organizationId: "1234567890@AdobeOrg"
};
const TEMPLATE = `
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ECID (Visitor API) Integration Sample</title>
<script src="VisitorAPI.js"></script>
<script>
Visitor.getInstance("${organizationId}", {serverState: ${visitorState}});
</script>
</head>
<body>
<pre>${content}</pre>
</body>
</html>
`;
const app = express();
const targetClient = TargetClient.create(CONFIG);
app.use(cookieParser());
// We assume that VisitorAPI.js is stored in "public" folder
app.use(express.static(__dirname + "/public"));
function saveCookie(res, cookie) {
if (!cookie) {
return;
}
res.cookie(cookie.name, cookie.value, {maxAge: cookie.maxAge * 1000});
}
const getResponseHeaders = () => ({
"Content-Type": "text/html",
"Expires": new Date().toUTCString()
});
function sendSuccessResponse(res, response) {
res.set(getResponseHeaders());
const result = TEMPLATE
.replace("${organizationId}", CONFIG.organizationId)
.replace("${visitorState}", JSON.stringify(response.visitorState))
.replace("${content}", response);
saveCookie(res, response.targetCookie);
res.status(200).send(result);
}
function sendErrorResponse(res, error) {
res.set(getResponseHeaders());
res.status(500).send(error);
}
app.get("/abtest", async (req, res) => {
const visitorCookie = req.cookies[TargetClient.getVisitorCookieName(CONFIG.organizationId)];
const targetCookie = req.cookies[TargetClient.TargetCookieName];
const request = {
execute: {
mboxes: [{
address: { url: req.headers.host + req.originalUrl },
name: "a1-serverside-ab"
}]
}};
console.log("Request", request);
try {
const response = await targetClient.getOffers({ request, visitorCookie, targetCookie });
sendSuccessResponse(res, response);
} catch (error) {
sendErrorResponse(res, error);
}
});
app.listen(3000, function () {
console.log("Listening on port 3000 and watching!");
});
@Controller
public class TargetControllerSample {
@Autowired
private TargetClient targetClient;
@GetMapping("/")
public String targetMcid(Model model, HttpServletRequest request, HttpServletResponse response) {
Context context = getContext(request);
TargetDeliveryRequest targetDeliveryRequest = TargetDeliveryRequest.builder()
.context(context)
.prefetch(getPrefetchRequest())
.cookies(getTargetCookies(request.getCookies()))
.build();
TargetDeliveryResponse targetResponse = targetClient.getOffers(targetDeliveryRequest);
model.addAttribute("visitorState", targetResponse.getVisitorState());
model.addAttribute("organizationId", "0DD934B85278256B0A490D44@AdobeOrg");
setCookies(targetResponse.getCookies(), response);
return "targetMcid";
}
}
ECID con integración de ID de cliente
Para poder realizar un seguimiento de las cuentas de usuario de los visitantes y los detalles del estado de inicio de sesión, customerIds
se puede pasar a través de los SDK Target.
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ECID (Visitor API) Integration Sample</title>
<script src="VisitorAPI.js"></script>
<script>
Visitor.getInstance("${organizationId}", {serverState: ${visitorState}});
</script>
</head>
<body>
<pre>Sample content</pre>
</body>
</html>
const express = require("express");
const cookieParser = require("cookie-parser");
const TargetClient = require("@adobe/target-nodejs-sdk");
const CONFIG = {
client: "acmeclient",
organizationId: "1234567890@AdobeOrg"
};
const TEMPLATE = `
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ECID (Visitor API) with Customer IDs Integration Sample</title>
<script src="VisitorAPI.js"></script>
<script>
Visitor.getInstance("${organizationId}", {serverState: ${visitorState}});
</script>
</head>
<body>
<pre>${content}</pre>
</body>
</html>
`;
const app = express();
const targetClient = TargetClient.create(CONFIG);
app.use(cookieParser());
// We assume that VisitorAPI.js is stored in "public" folder
app.use(express.static(__dirname + "/public"));
function saveCookie(res, cookie) {
if (!cookie) {
return;
}
res.cookie(cookie.name, cookie.value, {maxAge: cookie.maxAge * 1000});
}
const getResponseHeaders = () => ({
"Content-Type": "text/html",
"Expires": new Date().toUTCString()
});
function sendSuccessResponse(res, response) {
res.set(getResponseHeaders());
const result = TEMPLATE
.replace("${organizationId}", CONFIG.organizationId)
.replace("${visitorState}", JSON.stringify(response.visitorState))
.replace("${content}", response);
saveCookie(res, response.targetCookie);
res.status(200).send(result);
}
function sendErrorResponse(res, error) {
res.set(getResponseHeaders());
res.status(500).send(error);
}
app.get("/abtest", async (req, res) => {
const visitorCookie = req.cookies[TargetClient.getVisitorCookieName(CONFIG.organizationId)];
const targetCookie = req.cookies[TargetClient.TargetCookieName];
const customerIds = {
"userid": {
"id": "67312378756723456",
"authState": TargetClient.AuthState.AUTHENTICATED
}
};
const request = {
execute: {
mboxes: [{
address: { url: req.headers.host + req.originalUrl },
name: "a1-serverside-ab"
}]
}};
try {
const response = await targetClient.getOffers({ request, visitorCookie, targetCookie, customerIds });
sendSuccessResponse(res, response);
} catch (error) {
sendErrorResponse(res, error);
}
});
app.listen(3000, function () {
console.log("Listening on port 3000 and watching!");
});
@Controller
public class TargetControllerSample {
@Autowired
private TargetClient targetJavaClient;
@GetMapping("/targetMcid")
public String targetMcid(Model model, HttpServletRequest request, HttpServletResponse response) {
Context context = getContext(request);
Map<String, CustomerState> customerIds = new HashMap<>();
customerIds.put("userid", CustomerState.authenticated("67312378756723456"));
customerIds.put("puuid", CustomerState.unknown("550e8400-e29b-41d4-a716-446655440000"));
TargetDeliveryRequest targetDeliveryRequest = TargetDeliveryRequest.builder()
.context(context)
.prefetch(getPrefetchRequest())
.cookies(getTargetCookies(request.getCookies()))
.customerIds(customerIds)
.build();
TargetDeliveryResponse targetResponse = targetJavaClient.getOffers(targetDeliveryRequest);
model.addAttribute("visitorState", targetResponse.getVisitorState());
model.addAttribute("organizationId", "0DD934B85278256B0A490D44@AdobeOrg");
setCookies(targetResponse.getCookies(), response);
return "targetMcid";
}
}
Integración de ECID y Analytics
Para aprovechar al máximo los SDK de Target y las eficaces capacidades de análisis proporcionadas por Adobe Analytics, puede usar integraciones en ECID, Analytics y Target.
El uso de integraciones en ECID, Analytics y Target le permite:
- Uso de segmentos de Adobe Audience Manager AAM ()
- Personalizar la experiencia del usuario en función del contenido recuperado de Target
- Asegúrese de que todos los eventos y las métricas de éxito se recopilen en Analytics
- Utilice las poderosas consultas de Analytics y benefíciese de sus impresionantes visualizaciones de informes
Las integraciones entre ECID, Analytics y Target no requieren ningún control especial para Analytics en el servidor. En su lugar, una vez que tenga el ECID integrado, agregue AppMeasurement.js
(Analytics biblioteca) en el lado del cliente. Analytics utiliza la instancia de visitante para sincronizarse con Target.
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ECID and Analytics integration Sample</title>
<script src="VisitorAPI.js"></script>
<script>
Visitor.getInstance("${organizationId}", {serverState: ${visitorState}});
</script>
</head>
<body>
<p>Sample content</p>
<script src="AppMeasurement.js"></script>
<script>var s_code=s.t();if(s_code)document.write(s_code);</script>
</body>
</html>
const express = require("express");
const cookieParser = require("cookie-parser");
const TargetClient = require("@adobe/target-nodejs-sdk");
const CONFIG = {
client: "acmeclient",
organizationId: "1234567890@AdobeOrg"
};
const TEMPLATE = `
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ECID and Analytics integration Sample</title>
<script src="VisitorAPI.js"></script>
<script>
Visitor.getInstance("${organizationId}", {serverState: ${visitorState}});
</script>
</head>
<body>
<p>${content}</p>
<script src="AppMeasurement.js"></script>
<script>var s_code=s.t();if(s_code)document.write(s_code);</script>
</body>
</html>
`;
const app = express();
const targetClient = TargetClient.create(CONFIG);
app.use(cookieParser());
// We assume that VisitorAPI.js and AppMeasurement.js are stored in "public" directory
app.use(express.static(__dirname + "/public"));
function saveCookie(res, cookie) {
if (!cookie) {
return;
}
res.cookie(cookie.name, cookie.value, {maxAge: cookie.maxAge * 1000});
}
const getResponseHeaders = () => ({
"Content-Type": "text/html",
"Expires": new Date().toUTCString()
});
function sendSuccessResponse(res, response) {
res.set(getResponseHeaders());
const result = TEMPLATE
.replace("${organizationId}", CONFIG.organizationId)
.replace("${visitorState}", JSON.stringify(response.visitorState))
.replace("${content}", response);
saveCookie(res, response.targetCookie);
res.status(200).send(result);
}
function sendErrorResponse(res, error) {
res.set(getResponseHeaders());
res.status(500).send(error);
}
app.get("/abtest", async (req, res) => {
const visitorCookie = req.cookies[TargetClient.getVisitorCookieName(CONFIG.organizationId)];
const targetCookie = req.cookies[TargetClient.TargetCookieName];
const request = {
execute: {
mboxes: [{
address: { url: req.headers.host + req.originalUrl },
name: "a1-serverside-ab"
}]
}};
try {
const response = await targetClient.getOffers({ request, visitorCookie, targetCookie });
sendSuccessResponse(res, response);
} catch (error) {
sendErrorResponse(res, error);
}
});
app.listen(3000, function () {
console.log("Listening on port 3000 and watching!");
});
@Controller
public class TargetControllerSample {
@Autowired
private TargetClient targetJavaClient;
@GetMapping("/targetAnalytics")
public String targetMcid(Model model, HttpServletRequest request, HttpServletResponse response) {
Context context = getContext(request);
Map<String, CustomerState> customerIds = new HashMap<>();
customerIds.put("userid", CustomerState.authenticated("67312378756723456"));
customerIds.put("puuid", CustomerState.unknown("550e8400-e29b-41d4-a716-446655440000"));
TargetDeliveryRequest targetDeliveryRequest = TargetDeliveryRequest.builder()
.context(context)
.prefetch(getPrefetchRequest())
.cookies(getTargetCookies(request.getCookies()))
.customerIds(customerIds)
.trackingServer("imsbrims.sc.omtrds.net")
.build();
TargetDeliveryResponse targetResponse = targetJavaClient.getOffers(targetDeliveryRequest);
model.addAttribute("visitorState", targetResponse.getVisitorState());
model.addAttribute("organizationId", "0DD934B85278256B0A490D44@AdobeOrg");
setCookies(targetResponse.getCookies(), response);
return "targetAnalytics";
}