# KClient PHP

Обратите внимание!

Доступно только в профессиональной и бизнес редакции

# Общая информация

KClient PHP — интерфейс для получения результата выполнения кампании и их потоков. Для управления кампаниями и получаением отчетов смотрите Admin API.

При запросе к API необходимо передавать «token» кампании. Взять его можно со страницы редактирования кампании, слева внизу в настройках кампании.

# API URL

Префикс доступа к KClient PHP:

/click_api/v3/

# Пример запроса

curl "http://keitaro.soft.project/click_api/v3?token=ebd928ea"

# Параметры

Специальные параметры для API:

  • ip — IP адрес вида IPv4;
  • user_agent;
  • language;
  • landing_id;
  • uniqueness_cookie — текущее содержимое cookie;
  • log — нужен ли лог обработки клика (1 или 0);
  • info — получить блок info (1 или 0);
  • force_redirect_offer — выполнить действие оффера, иначе вернется только info.token. Также параметры для кампаний.

# Ответ

Ответ возвращается в формате JSON. Его атрибуты:

Атрибут Тип Описание
headers array Массив header ответов
body string Тело ответа (например, текст страницы)
contentType string Тип ответа (в случае с json, будет «application/json; charset=utf-8»)
uniqueness_cookie string Cookie, которое необходимо отправлять в дальнейших запросах к KClient PHP.
log array Содержимое лога обработки клика
cookies_ttl int Количество часов, на протяжении которых нужно хранить куки на стороне сайта
info object Контейнер с информацией по клику
info.sub_id string
info.campaign_id int
info.stream_id int
info.landing_id int
info.offer_id array
info.token string
info.uniqueness array
info.uniqueness.campaign boolean
info.uniqueness.stream boolean
info.uniqueness.global boolean
info.is_bot boolean

# Пример запроса и ответа

curl "http://tracker.com/click_api/v3?token=ebd928ea&log=1&info=1"

{
    "body": null,
    "contentType": "text/html; charset=utf-8",
    "headers": [
        "Location: http://domain.com/?data=&utm-campaign=aff1"
    ],
    "info": {
        "campaign_id": 2,
        "stream_id": 1117,
        "sub_id": "o2q6e42hs08jq",
        "type": "location",
        "url": "http://domain.com/?data=$keyword&utm-campaign=aff1"
    },
    "log": [
        "Processing campaign 2",
        "Referrer: ",
        "Source: ",
        "Keyword: ",
        "IP: 127.0.0.1",
        "UserAgent: HTTPie/0.6.0",
        "Language: ",
        "Is unique in campaign: no",
        "Checking stream #1282",
        "Filter  \"uniqueness\": allow",
        "Filter \"uniqueness\": rejected",
        "Checking stream #1343",
        "Filter \"region\": rejected",
        "Checking stream #1355",
        "Filter  \"limit\": allow",
        "Filter \"ip\": rejected",
        "Checking stream #1117",
        "Accepted by filters",
        "Stream #1117",
        "Send headers: Location: http://domain.com/?data=&utm-campaign=aff1",
        "[Profiler] 0.101 sec.  1 sql queries, 9MB (+7MB)"
    ],
    "uniqueness_cookie": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkYXRhIjoie1wic3RyZWFtc1wiOntcIjExMTdcIjoxNDkwNzA1MTQyfSxcImNhbXBhaWduc1wiOntcIjJcIjoxNDkwNzA1MTQyfSxcInRpbWVcIjoxNDkwNzA1MTQyfSJ9._u5H9oOOdyp02VTnDN8VG47oLDoqRHHKyYI3ChxRqw8"
}

# Есть ли готовый клиент?

Да, Click API Client.

# Как отправить на оффер?

Сформируйте ссылку по формату:

http://trackerdomain.com/?_lp=1&_token=info.token

info.token вы получите при первом запросе к API.

# Click API Client

PHP-скрипт для интеграции внешних сайтов.

# Возможности

  • Передача информации о текущем посетителе в Keitaro.
  • Передача параметров из адресной строки.
  • Обработка и выполнение инструкций Keitaro: показ текста, выполнение редиректа.

# Использование

  • Зайдите в Keitaro, на страницу кампании;
  • Перейдите в окно «Интеграция»;
  • Выберите «KClient PHP».
  • Скачайте файл kclick_client.php и положите его в директорию вашего сайта.
  • Затем скопируйте код и вставьте в шаблон сайта, в самом начале шаблона, до и DOCTYPE
  • Следуя инструкции, установите код на вашем сайте.

# Инициализация клиента

require_once 'kclick_client.php'; // файл должен быть загружен в туже директорию, что и страница
$client = new KClickClient('АДРЕС API', 'токен кампании');

# Описание методов

Метод Описание
$client->sendAllParams(); Передача параметров из адресной строки
$client->forceRedirectOffer(); Если в потоке был выбран оффер, то выполнить редирект на него. В ином случае нужно использовать getOffer()
$client->params('param1=c&param2=b'); Передача строки параметров
$client->param('extra_param_5', '123'); Альтернативный способ передачи параметра
$client->sendUtmLabels(); Передача из адресной строки только utm-меток
$client->debug(); Показ отладочной информации
$client->currentPageAsReferrer(); Отправить адрес текущей страницы в качестве реферера
$client->keyword('KEYWORD'); Использование значения 'KEYWORD' в качестве ключевика
$client->execute(); Выполнение инструкций Keitaro и с продолжением выполнения кода страницы
$client->executeAndBreak(); Выполнение инструкций Keitaro с остановкой выполнения страницы. Если передано действие в потоке «Ничего не делать», остановки не произойдет.
$client->getOffer(); Получение ссылки на оффер. В кампании должен быть поток со схемой «Офферы», иначе результат 'no_offer'.
$client->getBody(); Получение содержимого 'body'.
$client->getHeaders(); Получение заголовков (headers)
$client->isUnique(level); Статус уникальности (варианты level: stream, campaign, global)
$client->isBot(); Статус бота
$client->restoreFromQuery() Ловит параметры _subid и _token из запроса и не заводит нового клика
$client->restoreFromSession() Восстанавливает предыдущее посещение из сессии и не заводит нового клика

# Как сделать ссылку на оффер?

Пример использования KClickClient для генераци ссылки на оффер:

<?php
require_once 'kclick_client.php';
$client = new KClickClient('http://example.con/api.php', 'token');
?>
<html>
...
<body>
<a href="<?php echo $client->getOffer() ?>">CLICK!</a>
</body>
</html>

В потоке должна использоваться схема «Лендинги» или «Офферы».

Если нужно вызвать определенный оффер, передавайте параметр offer_id:

<a href="<?php echo $client->getOffer(array('offer_id' => 123), '#');?>">LINK</a>

Если есть вероятность, что трекре не вернет оффер, можно выставить ссылку по умолчанию вторым параметром:

<a href="<?php echo $client->getOffer(null, 'http://ya.ru');?>">LINK</a>

# Отправка постбека

Для отправки постбека, вам потребуется subid, его можно получить через $client->getSubid(); и положить в сессию:

...
$_SESSION['subid'] = $client->getSubid();

На странице, с которой нужно отправляется постек, берите subid из сессии:

$url = 'http://tds/POSTBACK_KEY/postback?payout=100&status=sale&subid=' . urlencode($_SESSION['subid']);
file_get_contents($url);

# FAQ по KClient PHP

# Как подключить к Wordpress?

Смотрите страницу WordPress плагин.

# Как сделать, чтобы после кода не загружался сайт?

Замените

$client->execute(); на

$client->executeAndBreak();

# Как передать title в качестве ключевика?

Для этого вы должны знать как получить title в php скриптах. Передавать ключевик нужно через метод $client->keyword('...'):

$client->keyword($myTitle);

$myTitle - это лишь пример того, как содержимое переменной передается в качестве ключевика.

# Как показывать HTML код из потока в определенном месте?

  1. Удалите строки:

$client->execute();

и

$client->executeAndBreak();

  1. Добавьте:

$GLOBALS['client'] = $client;

  1. В нужном месте сайта вставьте:

<?php echo $GLOBALS['client']->getContent() ?>

# Как решать проблемы с KClient PHP?

В первую очередь проверьте, доходят ли клики до трекера. Для этого смотрите лог трафика и отчет Клики кампании.

Если кликов нет. Добавьте в конец кода интеграции:

$client->showLog();

После $client->execute() и $client->executeAndBreak().

Это выведет отладочную информацию прямо на страницу.

Если лога нет, добавьте еще перед кодом интеграции (после <?php):

ini_set('display_errors', 'on');
error_reporting(7);

Если на странице ничего не появилось, значит у вас KClient PHP не подключен. Если вы видите только Requested: https://tracker.com/api.php - это значит домен с трекером недоступен для этого сайта (причины: кэш днс, блокировка РКН или просто не рабочий домен).

# Как оставлять пользователя на сайте при срабатывании определенного потока?

Используйте в потоке действие «Ничего не делать».

# Как проверить, считает ли Keitaro пользователя ботом?

/*
код инициализации клиента
*/
if ($client->isBot()) {
   echo 'bot';
} else {
   echo 'not bot';
}

# Почему не происходит редиректа на оффер?

По умолчанию, оффер подключается как ссылка с помощью $client->getOffer(). Чтобы выполнялся редирект оффера, добавьте строку:

$client->forceRedirectOffer();

# Как указать путь до kclick_client.php при наличии папок?

Посмотрите директорию вашего сайта и указывайте абсолютный путь:

require '/путь_до_сайта/kclick_client.php';
...

# Почему на сайте виден php-код и сам он не выполняется?

  1. Убедитесь, что имя файла, где установлен код с расширением .php

  2. Сам код должен быть обернут в теги:

<?php
....код....
?>

# Почему в браузере ошибка TOO_MANY_REDIRECTS

Это значит, что один ваш поток отправляет на сайт, где снова срабатывает проверки и снова его отправляет редиректом. Отредактируйте поток с редиректом на сайт. Смените схему на Действие и выберите «Ничего не делать».

# Почему в логе трафика http-редирект, но по факту не происходит?

Причина в том, что файл index.php сохранен в utf-8 с заголовком BOM.

Как выявить: смотрите нет ли пробела или какого-то символа перед кодом.

Как исправить: Удалить этот символ. Если не получится, пересохранить в «UTF-8 without BOM».

Важно! Не все редакторы видят этот символ.

# Как передать subid в скрипте m1-shop.ru используя KClient PHP?

SubId можно подключить через метода $client->getSubId(). Вот пример его использования в скрипте m1-shop:

<?php
require_once 'kclick_client.php';
$client = new KClickClient('http://example.con/api.php', 'token');
?>
<html>
...
<script type="text/javascript">
var m1_product_id = 123;
var ref = 123;
var script = document.createElement("script");
script.src = "http://m1-shop.ru/send_order/?ref="+ref+"&s=<?php echo $client->getSubId() ?>&w="+getC("w")+"&t="+getC("t")+"&p="+getC("p")+"&m="+getC("m")+"&product_id="+m1_product_id+'&out=1';
document.body.appendChild(script);
</script>

И код отправки заказа:

<script type="application/javascript">
function urlGen(f){
var i1 = 'http://m1-shop.ru/send_my_order/';
var i2 = '<?php echo $client->getSubId(); ?>';
var i3 = getC("w");
var i4 = getC("t");
var i5 = getC("p");
var i6 = getC("m");
f.action = i1 + '?s=' + i2 + '&w=' + i3 + '&t=' + i4 + '&p=' + i5 + '&m=' + i6;
return true;
}
</script>

# Как получить subid на второстепенных страницах?

Содержимое subid сохравняется в сессию:

$_SESSION['sub_id'];

Вы можете использовать для постановки в своих скриптах:

session_start(); // если сессия не использовалась ранее, то лучше запустить ее.
...
$data = array(
 'sub1' => $_SESSION['sub_id'],
 'name' => $_POST['name'],
  ...
);

# Как использовать KClient PHP на внутренних страницах?

Подключите KClient PHP на внутренней странице, добавив $client->restoreFromSession(); :

<?php
require_once dirname(__FILE__) . '/kclick_client.php';
$client = new KClickClient('http://..../api.php?', 'TOKEN');

$client->restoreFromSession();

Теперь можете вызывать те же методы, но без создания нового клика:

<a href="<?php echo $client->getOffer()">offer link</a>

# Расшифровка ошибок при запросе

  • [REQ_ERR: 400] - запрос не удалось обработать из-за синтаксической ошибки
  • [REQ_ERR: 402] - тип лицензии не профессиональная или кончилась лицензия
  • [REQ_ERR: 401] - запрос требует аунтефикации пользователя
  • [REQ_ERR: 403] - доступ к указанному ресурсу ограничен
  • [REQ_ERR: 404] - сервер не нашел по указанному URI никаких ресурсов
  • [REQ_ERR: 405] - указанный метод нельзя применить к текущему ресурсу
  • [REQ_ERR: 407] - необходима авторизация на прокси-сервере
  • [REQ_ERR: 408] - превышено время ожидания запроса
  • [REQ_ERR: 410] - требуемый ресурс больше не доступен на сервере и адрес его расположения не известен
  • [REQ_ERR: 429] - слишком много запросов
  • [REQ_ERR: 500] - внутренняя ошибка сервера
  • [REQ_ERR: 501] - сервер не поддерживает функциональных возможностей, необходимых для выполнения запроса
  • [REQ_ERR: 502] - сервер, выступая в роли шлюза или прокси-сервера, получил некорректный ответ от вышестоящего сервера.
  • [REQ_ERR: 503] - сервер не может обработать запрос из-за временной перегрузки или технических работ.
  • [REQ_ERR: 504] - сервер, в роли шлюза или прокси-сервера, не дождался в рамках установленного таймаута ответа от вышестоящего сервера текущего запроса.
  • [REQ_ERR: 505] - сервер не поддерживает или отказывается поддерживать указанную в запросе версию протокола HTTP.
  • [REQ_ERR: UNSUPPORTED_PROTOCOL] - переданный URL содержит неподдерживаемый библиотекой cURL протокол
  • [REQ_ERR: FAILED_INIT] - проблема при инициализации запроса
  • [REQ_ERR: BAD_URL] - неправильно сформирован URL
  • [REQ_ERR: COULDNT_RESOLVE_PROXY] - проблема при определении прокси.
  • [REQ_ERR: COULDNT_RESOLVE_HOST] - проблема при определении сервера у домена. Проверьте DNS.
  • [REQ_ERR: COULDNT_CONNECT] - сбой при соединении с сервером
  • [REQ_ERR: PARTIAL_FILE] - передана только часть данных. Проверьте, системный лог трекера.
  • [REQ_ERR: READ_ERROR] - ошибка чтения данных
  • [REQ_ERR: OUT_OF_MEMORY] - недостаточно памяти
  • [REQ_ERR: OPERATION_TIMEDOUT] - превышен лимит ожидания ответа трекера. Проверьте, что сервер, где стоит KClient PHP может подключиться к трекеру.
  • [REQ_ERR: HTTP_POST_ERROR] - ошибка при HTTP запросе
  • [REQ_ERR: BAD_FUNCTION_ARGUMENT] - функция была вызвана с неправильными параметрами
  • [REQ_ERR: TOO_MANY_REDIRECTS] - слишком много переадресаций, достигнут счетчик разрешенных переадресаций
  • [REQ_ERR: GOT_NOTHING] - сервер отправил пустые данные
  • [REQ_ERR: SEND_ERROR] - сбой при отправке данных
  • [REQ_ERR: RECV_ERROR] - сбой при получении данных
  • [REQ_ERR: BAD_CONTENT_ENCODING] - нераспознанная кодировка данных
  • [REQ_ERR: SSL] - проблемы с SSL. Проверьте настройки Cloudflare (секция SSL).
  • [REQ_ERR: UNKNOWN] - неизвестная ошибка. Проверьте логи трекера.