# KClient PHP

pro business

KClient PHP — это один из методов интеграции Keitaro, который позволяет подключаться к удаленным ресурсам посредством PHP кода и делать динамическую подмену контента без видимого редиректа.

Этот метод подходит для любых удаленных сайтов, где можно разместить php код, а также для импорта в webview мобильных приложений.

# Получение KClient PHP

Примечание

Для корректной работы интеграции вам потребуется использование протокола HTTPS на припаркованном домене и удаленном сайте, на который будет установлена интеграция.

# Загрузка kclient.php по FTP/SFTP

После создания кампании необходимо подключиться по SFTP.

В директории сайта создайте файл index.php:

Подсказки

Если у вас есть файл index.html, удалите его или переименуйте в index.php.

После чего открываем index.php и вставляем код в самое начало файла (до <html> и DOCTYPE).

Проверка на UTF-8 BOM

Важным условием добавления и сохранения файла с кодом сайта, является отсутствием BOM в кодировке Utf-8. BOM (Byte Order Mark) — символ вида U+FEFF.

Сделать это можно с помощью обычного текстового редактора:

# Скачивание kclient.php

Скачайте файл kclient.php на вкладке Интеграции:

Качаем файл и загружаем его рядом с файлом index куда только что мы вставляли код интеграции.

На этом основной этап интеграции завершен. При переходе на главную страницу сайта, в код которой мы добавили интеграцию, будет вызвана созданная нами кампания Кейтаро.

# Тестирование

Проверить работу клиента можно с помощью Лога трафика в кампании.

Откройте сайт, затем смотрите лог трафика. В нем должен быть отображен клик и действие которое было выбрано для него (Редирект на оффер, Ничего не делать и т.д.).

Включение лога

Если ранее вы не пользовались логом трафика, включите его и откройте сайт еще раз.

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

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

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

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

$url = 'POSTBACK_URL/postback?payout=100&status=sale&subid=' . urlencode($_SESSION['subid']);
file_get_contents($url);
1
2

Замените POSTBACK_URL.

Смотрите также:

# Создание ссылки оффера

Ссылка на оффер создается методом $client->getOffer(). Пример:

<?php
require_once dirname(__FILE__) . '/kclient.php';
$client = new KClient('https://domain_tracker/api.php?', 'wzbfwg3dxlmttkvt5v63mbw3x');
?>
<html>
...
<body>
<a href="<?php echo $client->getOffer() ?>">CLICK!</a>
</body>
</html>
1
2
3
4
5
6
7
8
9
10

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

Если необходимо вызвать определённый оффер, передавайте в таком виде $client->getOffer(array('offer_id' => ID)):

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

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

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

# Показ HTML в определенных местах на сайте

  1. Удалите (закомментируйте) строки:
$client->execute();`
1

и

$client->executeAndBreak();
1
  1. Добавьте:
$GLOBALS['client'] = $client;
1
  1. Вставьте код в шаблоне сайта:
<?php echo $GLOBALS['client']->getContent() ?>
1

# Методы KClient PHP

Метод Описание
$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('QUERY') Использование значения QUERY в качестве ключевика
$client->execute() Выполнение инструкций Keitaro и с продолжением выполнения кода страницы
$client->executeAndBreak() Выполнение инструкций Keitaro с остановкой выполнения страницы. Если передано действие в потоке «Ничего не делать», остановки не произойдет
$client->getOffer() Получение ссылки на оффер. В кампании должен быть поток со схемой Офферы, иначе получите результат no_offer
$client->getBody() Получение содержимого body
$client->getHeaders() Получение заголовков (headers)
$client->isUnique(TypE) Статус уникальности (варианты TYPE: stream, campaign, global)
$client->isBot() Статус бота
$client->disableSessions() Отключение куки PHP-сессии (без этой куки restoreFromSession не будет работать)
$client->restoreFromQuery() Ловит параметры _subid и _token из запроса и не заводит нового клика
$client->restoreFromSession() Восстанавливает предыдущее посещение из сессии и не заводит нового клика

# Отладка

Проверьте, есть ли клики в кампании. Для этого смотрите лог трафика или отчёт Клики кампании.

Если кликов нет, добавьте $client->showLog(); после строк ($client->execute() или $client->executeAndBreak()).

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

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

  • [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: 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] — неизвестная ошибка: проверьте логи трекера.

# KClient PHP FAQ

Почему показывает ошибку 500 или белую страницу?

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

ini_set('display_errors', 'on');
error_reporting(7);
1
2
Как фильтровать ботов?

Создаем два потока. Первый поток с действием Ничего не делать и фильтром БОТ. Что позволит нам оставлять ботов на сайте.

Второй поток мы будем использовать для наших клиентов, тут можем добавить ссылку на редирект, оффер и лендинг, все зависит от воронки трафика.

Такая настройка позволяет оставлять ботов на сайте, и направлять клиентов куда нам необходимо.

Как не создавать новые клики на внутренних страницах?

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

<?php
require_once dirname(__FILE__) . '/kclient.php';
$client = new KClient('http://domain_tracker/api.php?', 'token');

$client->restoreFromSession();
1
2
3
4
5

Вызывайте те же методы, но без создания нового клика. Например, создать ссылку на оффер:

<a href="<?php echo $client->getOffer()">offer link</a>
1
Как получить subid?

SubID можно получить через метод $client->getSubId().

<?php
$url = 'https://domain_tracker/85474/postback?payout=0&status=lead&subid=' . urlencode($client->getSubId());
?>
1
2
3
Как получить subid на внутренних страницах сайта?

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

$_SESSION['sub_id'];

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

session_start();
...
$data = array(
 'sub1' => $_SESSION['sub_id'],
 'name' => $_POST['name'],
  ...
);
1
2
3
4
5
6
7
Как оставить определенных пользователей на сайте?

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

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

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

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

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

Как выявить: убедитесь, что перед кодом нет пробела или любого другого символа. Как исправить: удалите этот символ. Если не получится, сохраните заново в UTF-8 without BOM.

Внимание

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

Проверка ботов на сайте
/*
код инициализации клиента
*/
if ($client->isBot()) {
   echo 'bot';
} else {
   echo 'not bot';
}
1
2
3
4
5
6
7
8

Подсказки

Чтобы отключить запись данных в статистику, включите в потоке опцию "Не считать клики".

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

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

Как передать title в качестве ключевой фразы?

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

$client->keyword($myTitle);`
1

$myTitle — это пример того, как содержимое переменной передаётся в качестве keyword.

Как указать путь до kclient.php, если сайт не в корне?

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

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