คู่มือนี้จะช่วยคุณในการใช้ฟีเจอร์ขั้นสูงต่างๆ ของ Meta Business SDK ที่ออกแบบมาสำหรับผู้ใช้ API คอนเวอร์ชั่นโดยเฉพาะ คำขอแบบไม่ซิงโครไนซ์การจัดกลุ่มในเวลาเดียวกัน และอินเทอร์เฟซบริการ HTTP พร้อมใช้งานใน SDK ที่เป็นภาษา PHP, NodeJS, Java, Python และ Ruby โปรดดูการใช้งาน API คอนเวอร์ชั่นขั้นพื้นฐานในเอกสาร API คอนเวอร์ชั่นฉบับหลัก
Meta Business SDK ช่วยให้คุณเข้าใช้งานชุด API ทางธุรกิจของเราได้ ซึ่งจะทำให้คุณสามารถสร้างโซลูชั่นที่ปรับแต่งให้ไม่เหมือนใครเพื่อรองรับธุรกิจและลูกค้าของคุณ หนึ่งใน API ที่ผู้ใช้ SDK ของเราสามารถใช้ได้คือ API คอนเวอร์ชั่น
คุณจำเป็นต้องติดตั้ง Meta Business SDK ไว้ก่อนจึงจะใช้ฟีเจอร์ทั้งหมดในรายการด้านล่างนี้ได้ โปรดดูเริ่มต้นใช้งาน Meta Business SDK หรือปฏิบัติตามคำแนะนำ README
ที่ระบุไว้ที่นี่
facebook-nodejs-business-sdk
facebook-python-business-sdk
ในการใช้ฟีเจอร์เหล่านี้ คุณต้องมีเวอร์ชั่นภาษาขั้นต่ำดังต่อไปนี้
ใช้ฟีเจอร์นี้หากคุณไม่ต้องการบล็อกการดำเนินงานของโปรแกรมเพื่อรอให้คำขอเสร็จสิ้น เมื่อใช้วิธีนี้ คุณจะสามารถสร้างคำขอและรับสัญญาณตอบกลับจากเซิร์ฟเวอร์เมื่อคำขอเสร็จสิ้นได้ ในขณะที่คุณรอการตอบกลับ โปรแกรมจะสามารถดำเนินการต่อไปได้
คำขอแบบไม่ซิงโครไนซ์ช่วยให้คุณสามารถใช้ทรัพยากรได้อย่างมีประสิทธิภาพมากยิ่งขึ้น ซึ่งส่งผลให้เวลาในการตอบกลับของเซิร์ฟเวอร์น้อยลง นอกจากนี้ยังเปิดโอกาสให้คุณควบคุมวิธีที่โปรแกรมใช้ในการจัดการข้อผิดพลาดที่มาจากเซิร์ฟเวอร์ได้มากขึ้น และผสานการทำงาน SDK เข้ากับโค้ดที่ใช้งานแบบไม่ซิงโครไนซ์อยู่แล้วได้อย่างง่ายดาย
หากต้องใช้งานคำขอแบบไม่ซิงโครไนซ์ โปรดดูตัวอย่างโค้ดในภาษาต่างๆ ดังต่อไปนี้
use FacebookAds\Api;
use FacebookAds\Object\ServerSide\CustomData;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequest;
use FacebookAds\Object\ServerSide\EventRequestAsync;
use FacebookAds\Object\ServerSide\UserData;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Promise;
$pixel_id = getenv('PIXEL_ID');
$access_token = getenv('ACCESS_TOKEN');
if (empty($pixel_id) || empty($access_token)) {
throw new Exception('Missing required test config. Got pixel_id: "' . $pixel_id . '", access_token: "' . $access_token . '"');
}
Api::init(null, null, $access_token, false);
function create_events($num) {
$user_data = (new UserData())
->setEmail('joe' . $num . '@eg.com')
->setClientIpAddress($_SERVER['REMOTE_ADDR'])
->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
$custom_data = (new CustomData())
->setCurrency('usd')
->setValue(123.45);
$event = (new Event())
->setEventName('Purchase')
->setEventTime(time())
->setEventSourceUrl('http://jaspers-market.com/product/123')
->setUserData($user_data)
->setCustomData($custom_data)
->setActionSource(ActionSource::WEBSITE);
return array($event);
}
function create_async_request($pixel_id, $num) {
$async_request = (new EventRequestAsync($pixel_id))
->setEvents(create_events($num));
return $async_request->execute()
->then(
null,
function (RequestException $e) {
print(
"Error!!!\n" .
$e->getMessage() . "\n" .
$e->getRequest()->getMethod() . "\n"
);
}
);
}
// Async request:
$promise = create_async_request($pixel_id, 2);
print("Request 1 state: " . $promise->getState() . "\n");
print("Async request - OK.\n");
// Async request with wait:
$promise = create_async_request($pixel_id, 3);
$response2 = $promise->wait();
print("Request 2: " . $response2->getBody() . "\n");
print("Async request with wait - OK.\n");
// Multiple async requests:
$promises = [
"Request 3" => create_async_request($pixel_id, 4),
"Request 4" => create_async_request($pixel_id, 5),
];
$response3 = Promise\unwrap($promises);
foreach ($response3 as $request_name => $response) {
print($request_name . ": " . $response->getBody()."\n");
}
print("Async - Multiple async requests OK.\n");
การจัดกลุ่มในเวลาเดียวกันใช้ประโยชน์จากคำขอแบบไม่ซิงโครไนซ์ในการเพิ่มปริมาณข้อมูลให้มากขึ้น ผ่านการใช้ทรัพยากรอย่างมีประสิทธิภาพมากยิ่งขึ้น คุณสามารถสร้างคำขอแบบกลุ่มเพื่อรองรับกรณีการใช้งานต่างๆ เช่น event request workers, cron jobs และอีกมากมาย
คุณสามารถเลือกวิธีการ BatchProcessor
ที่ต้องการได้จากตัวเลือกดังต่อไปนี้
วิธีการ | ควรใช้เมื่อใด |
---|---|
| ใช้เพื่อประมวลผลเหตุการณ์ที่มีช่อง |
| นี่คือตัวสร้างโค้ดเบื้องหลังของ นอกจากนี้ยังสามารถใช้เพื่อประมวลผลเหตุการณ์ที่มีช่อง |
| ใช้เพื่อประมวลผล |
| นี่คือตัวสร้างโค้ดเบื้องหลังของ นอกจากนี้ยังสามารถใช้เพื่อประมวลผล |
เมื่อใช้การจัดกลุ่มในเวลาเดียวกัน ควรส่งเหตุการณ์ให้ใกล้เคียงเวลาแบบเรียลไทม์มากที่สุดเท่าที่จะทำได้ หากต้องการข้อมูลเพิ่มเติม โปรดดูความถี่ในการแชร์
หากคุณใช้ SDK ที่เป็นภาษา PHP, Python หรือ Ruby วิธีการข้างต้นจะต้องใช้อ็อบเจ็กต์ EventRequestAsync แทนที่จะเป็นอ็อบเจ็กต์ EventRequest
หากต้องใช้งานการจัดกลุ่มในเวลาเดียวกัน โปรดดูตัวอย่างโค้ดในภาษาต่างๆ ดังต่อไปนี้
use FacebookAds\Api;
use FacebookAds\Object\ServerSide\BatchProcessor;
use FacebookAds\Object\ServerSide\CustomData;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequestAsync;
use FacebookAds\Object\ServerSide\UserData;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Promise;
$pixel_id = getenv('PIXEL_ID');
$access_token = getenv('ACCESS_TOKEN');
if (empty($pixel_id) || empty($access_token)) {
throw new Exception('Missing required test config. Got pixel_id: "' . $pixel_id . '", access_token: "' . $access_token . '"');
}
$api = Api::init(null, null, $access_token, false);
function create_event($i) {
$user_data = (new UserData())
->setEmail('joe' . $i . '@eg.com')
->setClientIpAddress($_SERVER['REMOTE_ADDR'])
->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
$custom_data = (new CustomData())
->setCurrency('usd')
->setValue(123.45);
return (new Event())
->setEventName('Purchase')
->setEventTime(time())
->setEventSourceUrl('http://jaspers-market.com/product/' . $i)
->setUserData($user_data)
->setCustomData($custom_data)
->setActionSource(ActionSource::WEBSITE);
}
function create_events($num) {
$events = [];
for ($i = 0; $i < $num; $i++) {
$events[] = create_event($i);
}
return $events;
}
function create_async_requests($pixel_id, $num) {
$requests = [];
for ($i = 0; $i < $num; $i++) {
$requests[] = (new EventRequestAsync($pixel_id))
->setUploadTag('test-tag-2')
->setEvents([create_event($i)]);
}
return $requests;
}
function run($pixel_id) {
print("Started CONVERSIONS_API_EVENT_CREATE_BATCH...\n");
$batch_processor = new BatchProcessor($pixel_id, 2, 2);
// processEvents
$events = create_events(11);
$batch_processor->processEvents(array('upload_tag' => 'test-tag-1'), $events);
// processEventRequests
$requests = create_async_requests($pixel_id, 5);
$batch_processor->processEventRequests($requests);
// processEventsGenerator
$process_events_generator = $batch_processor->processEventsGenerator(array('upload_tag' => 'test-tag-1'), $events);
foreach ($process_events_generator as $promises) {
try {
Promise\unwrap($promises);
} catch (RequestException $e) {
print('RequestException: ' . $e->getResponse()->getBody()->getContents() . "\n");
throw $e;
} catch (\Exception $e) {
print("Exception:\n");
print_r($e);
throw $e;
}
}
// processEventRequestsGenerator
$requests = create_async_requests($pixel_id, 5);
$process_event_requests_generator = $batch_processor->processEventRequestsGenerator($requests);
foreach ($process_event_requests_generator as $promises) {
try {
Promise\unwrap($promises);
} catch (RequestException $e) {
print('RequestException: ' . $e->getResponse()->getBody()->getContents() . "\n");
throw $e;
} catch (\Exception $e) {
print("Exception:\n");
print_r($e);
throw $e;
}
}
print("Finished CONVERSIONS_API_EVENT_CREATE_BATCH with no errors.\n");
}
run($pixel_id);
ใช้อินเทอร์เฟซบริการ HTTP หากคุณมีชุดข้อกำหนดที่เฉพาะเจาะจงสำหรับเลเยอร์บริการของ HTTP เมื่อใช้ฟีเจอร์นี้ คุณจะสามารถเขียนทับบริการ HTTP ตามค่าเริ่มต้นของ Business SDK และนำบริการแบบกำหนดเองของคุณมาใช้งานกับวิธีการหรือคลังที่คุณต้องการได้
หากต้องการใช้งานอินเทอร์เฟซบริการ HTTP ของคุณเอง โปรดดูตัวอย่างโค้ดในภาษาต่างๆ ดังต่อไปนี้
require __DIR__ . '/../vendor/autoload.php';
use FacebookAds\Api;
use FacebookAds\Object\ServerSide\CustomData;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequest;
use FacebookAds\Object\ServerSide\EventRequestAsync;
use FacebookAds\Object\ServerSide\HttpServiceClientConfig;
use FacebookAds\Object\ServerSide\UserData;
// Imports used by the TestHttpClient class
use FacebookAds\Object\ServerSide\HttpServiceInterface;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Psr7\MultipartStream;
use GuzzleHttp\Psr7\Request;
$pixel_id = getenv('PIXEL_ID');
$access_token = getenv('ACCESS_TOKEN');
if (empty($pixel_id) || empty($access_token)) {
throw new Exception('Missing required test config. Got pixel_id: "' . $pixel_id . '", access_token: "' . $access_token . '"');
}
function run($access_token, $pixel_id) {
Api::init(null, null, $access_token, false);
$request1 = getEventRequest($pixel_id, 1);
$request1->setHttpClient(new TestHttpClient());
$response1 = $request1->execute();
print("Response: " . $response1->getBody() . "\n");
print("Custom HTTP Service Request 1 - OK.\n");
// Alternatively, you can set the access_token and the HTTP Client on the HttpServiceClientConfig
Api::init(null, null, null, false);
HttpServiceClientConfig::getInstance()->setClient(new TestHttpClient());
HttpServiceClientConfig::getInstance()->setAccessToken($access_token);
$request2 = getEventRequest($pixel_id, 2);
$response2 = $request2->execute();
print("Response: " . $response2->getBody() . "\n");
print("Custom HTTP Service Request 2 - OK.\n");
}
function getEventRequest($pixel_id, $num) {
$user_data = (new UserData())
->setEmail('joe' . $num . '@eg.com')
->setClientIpAddress($_SERVER['REMOTE_ADDR'])
->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
$custom_data = (new CustomData())
->setCurrency('usd')
->setValue(123.45);
$event = (new Event())
->setEventName('Purchase')
->setEventTime(time())
->setEventSourceUrl('http://jaspers-market.com/product/123')
->setUserData($user_data)
->setCustomData($custom_data)
->setActionSource(ActionSource::WEBSITE);
return (new EventRequest($pixel_id))
->setEvents(array($event));
}
class TestHttpClient implements HttpServiceInterface {
public function executeRequest($url, $method, array $curl_options, array $headers, array $params) {
$multipart_contents = [];
foreach ($params as $key => $value) {
if ($key === 'data') {
$multipart_contents[] = [
'name' => $key,
'contents' => \GuzzleHttp\json_encode($value),
'headers' => array('Content-Type' => 'multipart/form-data'),
];
} else {
$multipart_contents[] = [
'name' => $key,
'contents' => $value,
'headers' => array('Content-Type' => 'multipart/form-data'),
];
}
}
$body = new MultipartStream($multipart_contents);
$request = new Request($method, $url, $headers, $body);
$handler_stack = HandlerStack::create(
new CurlHandler(['options' => $curl_options])
);
$client = new Client(['handler' => $handler_stack]);
return $client->send($request);
}
}
run($access_token, $pixel_id);
คุณสามารถทดสอบคำขอเหตุการณ์ต่างๆ ได้โดยใช้พารามิเตอร์ test_event_code
ค้นหาโค้ดสำหรับทดสอบโดยการไปที่เครื่องมือเหตุการณ์ทดสอบ ซึ่งอยู่ในตัวจัดการเหตุการณ์ ภายใต้แท็บแหล่งข้อมูล > พิกเซลของคุณ > เหตุการณ์ทดสอบ
หมายเหตุ: คุณต้องแทนที่ค่าตัวอย่างในโค้ดด้านล่างนี้ (ซึ่งก็คือ TEST12345
) ด้วยโค้ดทดสอบที่คุณได้มาจากแท็บเหตุการณ์ทดสอบ
...
$request = (new EventRequest($pixel_id))
->setTestEventCode('TEST12345')
->setEvents($events);
$response = $request->execute();
ขณะนี้เรายังไม่รองรับการตั้งค่าอินเทอร์เฟซบริการ HTTP แบบกำหนดเองเมื่อส่งคำขอจัดกลุ่มในเวลาเดียวกันหรือคำขอแบบไม่ซิงโครไนซ์