<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Adam</title><generator>teletype.in</generator><description><![CDATA[Adam]]></description><image><url>https://img2.teletype.in/files/9e/4d/9e4d2939-9a86-4560-9eea-9c00546f89fe.png</url><title>Adam</title><link>https://teletype.in/@adamusfb</link></image><link>https://teletype.in/@adamusfb?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/adamusfb?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/adamusfb?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 19 Oct 2026 07:17:36 GMT</pubDate><lastBuildDate>Mon, 19 Oct 2026 07:17:36 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@adamusfb/shemny-traffic-postroenie-komandnoy-strukturi</guid><link>https://teletype.in/@adamusfb/shemny-traffic-postroenie-komandnoy-strukturi?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb</link><comments>https://teletype.in/@adamusfb/shemny-traffic-postroenie-komandnoy-strukturi?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb#comments</comments><dc:creator>adamusfb</dc:creator><title>Схемный трафик (ч. 2): Построение командной структуры на основе связки Keitaro + PuzzleBot </title><pubDate>Sun, 02 Jul 2023 19:26:16 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d1/60/d1609798-deb9-4739-a56d-9934893ce1f5.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/ac/fc/acfc73aa-baba-484f-9ca2-d4de849dc5c5.png"></img>В предыдущей статье (ч. 1) мы разобрали как связать партнерку =&gt; Keitaro =&gt; PuzzleBot в единую &quot;триаду&quot; для построения автоворонок внутри Telegram. Уверен, многие посыпались от технических сложностей и по итогу забили на подобный способ пролива. Возможно кого-то не убедили плюсы высказанные в пользу бота и все как лили на тг-каналы, так и льют. ]]></description><content:encoded><![CDATA[
  <figure id="igLw" class="m_column">
    <img src="https://img3.teletype.in/files/ac/fc/acfc73aa-baba-484f-9ca2-d4de849dc5c5.png" width="2400" />
  </figure>
  <p id="YVgX">В <a href="https://teletype.in/@adamusfb/shemny-traffic-integracia-keitaro-puzzlebot" target="_blank">предыдущей статье (ч. 1)</a> мы разобрали как связать партнерку =&gt; Keitaro =&gt; <a href="https://puzzlebot.top/?r=gvinj38Z" target="_blank">PuzzleBot </a>в единую &quot;триаду&quot; для построения автоворонок внутри Telegram. Уверен, многие посыпались от технических сложностей и по итогу забили на подобный способ пролива. Возможно кого-то не убедили плюсы высказанные в пользу бота и все как лили на тг-каналы, так и льют. </p>
  <p id="YVIh">Использование <a href="https://puzzlebot.top/?r=gvinj38Z" target="_blank">PuzzleBot </a>в схемном трафике позволяет снизить нагрузки на обработчиков и сделать контент персонализированным (подробнее о всех плюсах в <a href="https://teletype.in/@adamusfb/shemny-traffic-integracia-keitaro-puzzlebot#XGGr" target="_blank">первой части</a>). Помимо этого существуют плюсы &quot;второго уровня&quot;, которые снимают головняки как с овнеров, так и с обработчиков. </p>
  <p id="pk4y">Для того чтобы увидеть эти возможности, необходимо обладать чуть бОльшим количеством знаний в программировании, чем нам требовалось в ч.1. Но даже если вы ими не обладаете, всегда есть <a href="https://chat.openai.com/" target="_blank">Chat GPT</a>, в котором можно собрать все что угодно букавально в пару кликов. К слову код приведенный ниже, &quot;блочно&quot; собран именно в нейронке GPT. </p>
  <p id="2uIY"><strong>Плюсы тг-ботов для овнеров:</strong></p>
  <ul id="twZv">
    <li id="BHG2">Невозможность повторно записать деп к себе в стату, если этот деп уже присвоен другому обработчику (обмануть / украсть). В связи с этим не нужен спец. человек, который будет заниматься проверкой и подсчетом депов и выплат каждому из обрабов (считается автоматически ботом).</li>
    <li id="1HY3">Полная изолированность сотрудников от внутренних процессов / доступа в партнерки / трекеры. Обработчики в лучшем случае будут иметь доступ в Кейтаро, но и без этого можно обойтись с помощью персонального бота под каждого обработчика (пример кода приведен ниже в статье).</li>
  </ul>
  <blockquote id="zAxX">Сейчас крупные команды выдают доступы к партнеркам обработчикам, для того чтобы те сверяли id игроков и тем самым проверяли действительно ли юзер перерегистрировался по трек ссылке.</blockquote>
  <p id="YbrA"><strong>Плюсы тг-ботов для обработчиков:</strong></p>
  <ul id="skQJ">
    <li id="ngbn">Легкая, интуитивно-понятная запись депа к себе в стату обработчиком. Больше не надо просить юзера прислать его ID на платформе казино, у нас вся привязка осуществляется по chat_id юзера в Telegram</li>
    <li id="gJJ1">Легкая доступность статистики для обработчика через персонального бота обработчика + автоматический рассчет выплаты / прямого доступа в Кейтаро (по усмотрению овнера)</li>
  </ul>
  <p id="YvFq"><strong>Общие минусы:</strong></p>
  <ul id="fYzQ">
    <li id="bvHi">Всех юзеров надо регистрировать через специальную ссылку на бота с параметром ?start=имя_обраба. <u>Не обязательно заливать конкретно на бота</u>, можно и на канал, но ссылка <u>с канала должна вести на бота</u> со специальным параметром, чтобы бот сразу же скидывал ссылку для регистрации юзеру, вместо обычных постов на команде start</li>
  </ul>
  <p id="PcjU"></p>
  <h3 id="B9bx">Объяснение реализации</h3>
  <p id="f3LP">Прежде чем реализовать подобную схему, необходимо понять как это работает и что на что влияет с технической точки зрения. Рекомендую обратить внимание на названия параметров, это особенно важно. Набросал небольшую схему в Miro, чтобы было проще сложить паззл в голове, настоятельно рекомендую ознакомиться:</p>
  <figure id="Y9tv" class="m_column">
    <iframe src="https://miro.com/app/embed/uXjVMAcwuJw=/?pres=1&frameId=3458764559758923411&embedId=340228001928"></iframe>
  </figure>
  <p id="WH3t">Я специально создал схему с логикой работы скрипта, чтобы команды могли отдать это своим штатным кодерам. Мой код ниже - <strong>это лишь пример возможностей не претендующий на лучшее качество </strong>и тд.</p>
  <h3 id="vdkI"><br />Требования</h3>
  <p id="5Gkt">- Наличие редакции <a href="https://keitaro.io/89119/info" target="_blank">Keitaro с admin api</a><br />- Базовое понимание работы трекера<br />- Базовое понимание кода и работы с python</p>
  <p id="v5nv"></p>
  <h3 id="kGZR">Настройка скрипта</h3>
  <p id="BReA">1. У меня код стоит на винде, поэтому и рассказывать я буду про винду. Для начала нам надо накатить <a href="https://www.python.org/downloads/" target="_blank">python 3й версии.</a> Далее устанавливаем <a href="https://www.google.com/search?sxsrf=AB5stBiX7V-lWUS5RCLLHV4JCUEls7gFGA:1689776293351&q=%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0+%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D1%85+%D1%81%D1%80%D0%B5%D0%B4+python&tbm=vid&sa=X&ved=2ahUKEwiX7tud-5qAAxVdBxAIHcG9BQYQ0pQJegQIDBAB&biw=1745&bih=845&dpr=1.1#fpstate=ive&vld=cid:595c0a13,vid:lAXNSTyALC8" target="_blank">переменные среды</a> для удобной работы. После этого открываем cmd и ставим библиотеки <code>requests</code> и <code>aiogram</code> следующими командами: <br />- <code>pip install requests</code><br />- <code>pip install aiogram</code><br /><br />2. Когда пайтон и библиотеки установлены, можно приступить к настройке кода. Создаем папку в любом месте системы и в ней создаем текстовик с содержимым указанным ниже. Далее файл нужно будет переименовать в .py вместо .txt. </p>
  <blockquote id="7FPM">Код приведенный ниже полностью написан с помощью Chat GPT точечными запросами. Т.е я писал его не целиком, а именно блочно, соединяя потом эти блоки воедино. По сути это демонстрирует возможности, которые открываются буквально всем, было бы время и желание в этом развиваться. Поэтому enjoy, можно писать все что угодно для командной структуры затрачивая минимум времени.</blockquote>
  <pre id="BP5g">import requests
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
import datetime
import os

# ==================== CONFIG ====================
# Настройки телеграм
bot_token = &#x27;from_botfather_token&#x27; # Тут указываем токен бота созданного в @botfather_bot

# Настройки кейтаро
kt_address = &#x27;https://domain.com&#x27; # Необходимо указать домен привязанный в Кейтаро на ssl сертификате (обязательно!)
kt_token = &#x27;keitaro_token&#x27; # Получаем админский токен от Кейтаро тут - keitarodomain.com/admin/#!/profile/admin_api_keys
kt_timezone = &#x27;Europe/Moscow&#x27; # От часового пояса будет зависеть разбивка статы у обработчика

# Внутренние переменные бота
admin = &#x27;@admin&#x27; # Здесь необходимо указать ник юзера, отвечающего за тех. обслуживание ботов для обработчиков. В случае ошибки, обработчик будет знать кому переслать ошибку выданную ботом
chat_id = &#x27;&#x27; # Оставляем пустым, не обращаем внимание
handler_name = &#x27;az&#x27; # Это метка обработчика, которая будет записываться в Кейтаро. Не указывайте длинные метки, пусть лучше будут 2-3 символа
aff_links = [{&#x27;Grecia - GR&#x27;:&#x27;https://my.links&#x27;}] # Тут можно указывать список ссылок в формате json array. Все эти ссылки будут присылаться обработчику после вызова команды /links. Бот будет подставлять метку handler_name в каждую из ссылок

# Путь к файлу с логами chat_id
chat_ids_file = &#x27;chat_ids.txt&#x27; # Если для вас название файла лога не имеет значение, оставляем все как есть
# ==================== CONFIG ====================

# Инициализируем бота и диспетчера
bot = Bot(token=bot_token)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

# Подпись в консоли чей бот
print(f&#x27;============== {handler_name} ==============&#x27;)

# Проверка наличия chat_id в файле
def check_chat_id(chat_id):
    if os.path.isfile(chat_ids_file):
        with open(chat_ids_file, &#x27;r&#x27;) as file:
            return str(chat_id) in file.read()
    else:
        return False

def clear_text_file():
    # Открытие файла в режиме записи (существующий файл будет перезаписан)
    with open(chat_ids_file, &#x27;w&#x27;) as file:
        # Запись пустой строки в файл
        file.write(&#x27;&#x27;)

# Запись chat_id в файл
def write_chat_id(chat_id):
    with open(chat_ids_file, &#x27;a&#x27;) as file:
        file.write(str(chat_id) + &#x27;\n&#x27;)

def calculate_payment(client_count):
    if client_count &lt;= 15:
        payment = 1 * client_count
    elif client_count &lt;= 30:
        payment = (1 * 15) + (2 * (client_count - 15))
    elif client_count &lt;= 45:
        payment = (1 * 15) + (2 * 15) + (3 * (client_count - 30))
    else:
        payment = (1 * 15) + (2 * 15) + (3 * 15) + (3 * (client_count - 45))

    return payment

periods = [
    {&quot;today&quot;: &quot;За сегодня&quot;},
    {&quot;yesterday&quot;: &quot;За вчера&quot;},
    {&quot;last_monday&quot;: &quot;Текущая неделя&quot;},
    {&quot;7_days_ago&quot;: &quot;За последние 7 дней&quot;},
    {&quot;first_day_of_this_month&quot;: &quot;Текущий месяц&quot;},
    {&quot;previous_month&quot;: &quot;Предыдущий месяц&quot;},
    {&quot;1_month_ago&quot;: &quot;За последние 30 дней&quot;}
]

# Обработчик команды /stats
@dp.message_handler(Command(&#x27;stats&#x27;))
async def process_stats_command(message: types.Message, state: FSMContext):
    # Отправляем сообщение с просьбой ввести текст
    await message.reply(&quot;Форматы дат: \n&quot;+&#x27;\n&#x27;.join([f&quot;{list(period.keys())[0]}: {list(period.values())[0]}&quot; for period in periods]))

    # Устанавливаем состояние &#x27;answer&#x27; для данного пользователя
    await state.set_state(&#x27;answer&#x27;)

# Обработчик ответа с текстом
@dp.message_handler(state=&quot;answer&quot;, content_types=types.ContentTypes.TEXT)
async def process_text_answer(message: types.Message, state: FSMContext):
    # Получаем текст из ответа
    interval = message.text
    
    if any(interval in item for item in periods):
        body = {
          &quot;range&quot;: {
            &quot;interval&quot;: interval,
            &quot;timezone&quot;: kt_timezone
          },
          &quot;columns&quot;: [
            &quot;datetime&quot;,
            &quot;campaign&quot;,
          ],
          &quot;metrics&quot;: [],
          &quot;grouping&quot;: [],
          &quot;filters&quot;: [
            {
              &quot;name&quot;: &quot;is_sale&quot;,
              &quot;operator&quot;: &quot;IS_TRUE&quot;,
              &quot;expression&quot;: None
            },
            {
              &quot;name&quot;: &quot;sub_id_7&quot;,
              &quot;operator&quot;: &quot;CONTAINS&quot;,
              &quot;expression&quot;: handler_name
            }
          ],
          &quot;sort&quot;: [
            {
              &quot;name&quot;: &quot;datetime&quot;,
              &quot;order&quot;: &quot;desc&quot;
            }
          ],
          &quot;summary&quot;: True,
          &quot;limit&quot;: 500,
          &quot;offset&quot;: 0
        }

        result = requests.post(f&#x27;{kt_address}/admin_api/v1/clicks/log&#x27;, json=body, headers={&#x27;Api-key&#x27;: kt_token})

        if(result.status_code == 200):
            json = result.json()
            
            results = {}

            for row in json[&#x27;rows&#x27;]:
                campaign = row[&#x27;campaign&#x27;]
                click_datetime = row[&#x27;datetime&#x27;]
                click_date = datetime.datetime.strptime(click_datetime, &#x27;%Y-%m-%d %H:%M:%S&#x27;).strftime(&#x27;%Y-%m-%d&#x27;)
                
                if campaign not in results:
                    results[campaign] = {}
                
                if click_date not in results[campaign]:
                    results[campaign][click_date] = 0 
                
                results[campaign][click_date] += 1

            # Сортировка результатов по дате
            sorted_results = {}
            for campaign, dates in results.items():
                sorted_dates = dict(sorted(dates.items(), key=lambda x: datetime.datetime.strptime(x[0], &#x27;%Y-%m-%d&#x27;)))
                sorted_results[campaign] = sorted_dates

            # Форматированный вывод результатов
            for campaign, dates in sorted_results.items():
                output = f&quot;Campaign: {campaign}\n&quot;
                summ_sales = 0
                summ_payout = 0
                
                for date in dates.items():
                    sales = date[1]
                    payout = calculate_payment(date[1])
                    
                    summ_sales += sales
                    summ_payout += payout
                    
                    output += f&quot;  {date[0]}:\n&quot;
                    output += f&quot;    Sales: {sales}\n&quot;
                    output += f&#x27;    Payout: {payout}$\n\n&#x27;
                
                output += f&#x27;------------\nTotal:\nSales: {summ_sales}\nPayout: {summ_payout}$&#x27;
                await message.reply(output)
        else:
            print(f&#x27;Ошибка запроса {result.status_code}&#x27;)
    else:
        await message.reply(&#x27;Неверный формат даты&#x27;)

    # Сбрасываем состояние &#x27;answer&#x27; для данного пользователя
    await state.finish()


@dp.message_handler(Command(&#x27;links&#x27;))
async def links(message: types.Message):
    for link in aff_links:
        key = next(iter(link.keys()))
        await bot.send_message(message.chat.id, f&#x27;{key}:&#x27;)
        await bot.send_message(message.chat.id, f&#x27;{link[key]}?start={handler_name}&#x27;)

# Обработчик команды /help
@dp.message_handler(Command(&#x27;help&#x27;))
async def start(message: types.Message):
    await message.reply(f&#x27;&#x27;&#x27;
/help - получить список команд
/links - получить список твоих ссылок
/stats - получить статистику
&#x27;&#x27;&#x27;)

# Обработчик команды /clear_log
@dp.message_handler(Command(&#x27;clear_log&#x27;))
async def clear_log(message: types.Message):
    clear_text_file()
    await message.reply(f&#x27;Файл лога {chat_ids_file} очищен&#x27;)

# Обработчик пересланных сообщений
@dp.message_handler(content_types=types.ContentType.TEXT, is_forwarded=True)
async def forwarded_message(message: types.Message, state: FSMContext):
    global chat_id
    if message.forward_from:
        chat_id = str(message.forward_from.id)

        if not check_chat_id(chat_id):
            write_chat_id(chat_id)
            await message.reply(f&#x27;Запрос на запись юзера {chat_id} на ваше имя {handler_name} в обработке ⚙️&#x27;) #message.chat.id, 

            # Выполнение указанного кода с тремя попытками
            # tries = 5
            try:
            # for i in range(tries):
                # print(f&#x27;Попытка получить данные из трекера по chat_id {chat_id} №{i}&#x27;)
            
                data = {
                    &quot;range&quot;: {
                        &quot;interval&quot;: &quot;1_month_ago&quot;,
                        &quot;timezone&quot;: kt_timezone
                    },
                    &quot;columns&quot;: [
                        &quot;sub_id&quot;
                    ],
                    &quot;metrics&quot;: [],
                    &quot;grouping&quot;: [],
                    &quot;filters&quot;: [
                        {
                            &quot;name&quot;: &quot;sub_id_9&quot;,
                            &quot;operator&quot;: &quot;CONTAINS&quot;,
                            &quot;expression&quot;: chat_id
                        }
                    ],
                    &quot;sort&quot;: [
                        {
                            &quot;name&quot;: &quot;datetime&quot;,
                            &quot;order&quot;: &quot;desc&quot;
                        }
                    ],
                    &quot;summary&quot;: True,
                    &quot;limit&quot;: 250,
                    &quot;offset&quot;: 0
                }

                response = requests.post(f&#x27;{kt_address}/admin_api/v1/clicks/log&#x27;, json=data, headers={&quot;Api-Key&quot;: kt_token})
                
                # success = False
                
                if response.status_code == 200:
                    rows = response.json().get(&#x27;rows&#x27;, [])
                    print(f&#x27;Ответ на получение subid\&#x27;s по chat_id {chat_id}: {rows}&#x27;)
                    
                    if len(rows) &gt; 0:
                        completed_subids = []
                    
                        for row in rows:
                            subid = row.get(&#x27;sub_id&#x27;)
                              
                            print(f&#x27;Началась обработка {subid}&#x27;)
                            
                        # for _ in range(tries):
                            result = requests.get(f&#x27;{kt_address}/?_update_tokens=1&amp;sub_id={subid}&amp;sub_id_7={handler_name}&#x27;)
                            if result.status_code == 200:
                                completed_subids.append(subid)
                                print(f&#x27;Запрос по обновление токенов по {subid} обработан успешно&#x27;)
                                
                                # break
                            else: 
                                await bot.send_message(message.chat.id, f&#x27;Запрос на обновление токена по {subid} завершился ошибкой ❌. Перешли эту ошибку админу бота {admin}&#x27;)
                        # break
                        
                        completed_subids_str = &#x27;\n&#x27;.join(completed_subids)
                        await bot.send_message(message.chat.id, f&#x27;Все {len(completed_subids)+1} кликов юзера {chat_id} записаны на {handler_name}✅\r\n\r\nСписок subid\&#x27;s:\r\n{completed_subids_str}&#x27;)
                    else:
                        # success = True
                        print(f&#x27;Юзер с id {chat_id} не найден в системе трекера&#x27;)
                        await bot.send_message(message.chat.id, f&#x27;Юзер с id {chat_id} не найден в системе трекера 📔. Необходимо чтобы этот юзер был зарегистрирован по одной из трекинговых ссылок. Полный список ссылок по команде /links&#x27;)
                else:
                    print(f&#x27;Не удалось получить данные от keitaro по chat_id {chat_id}. Status code: {response.status_code}&#x27;)
                    
                # if success:
                    # break
            except Exception as e:
                await bot.send_message(message.chat.id, f&quot;Произошла ошибка при выполнении запроса: {str(e)}. Перешли эту ошибку админу бота {admin}&quot;)
        else:
            await message.reply(f&#x27;Этот chat_id {chat_id} юзера уже присвоен одному из обработчиков 😔&#x27;) #message.chat.id,
    else:
        await message.reply(&#x27;Пересланное сообщение не из чата&#x27;) #message.chat.id, 

# Запускаем бота
if __name__ == &#x27;__main__&#x27;:
    from aiogram import executor
    executor.start_polling(dp, skip_updates=True)
</pre>
  <p id="ytRq">3. Заменяем все данные в переменных в блоке CONFIG, <u>предварительно внимательно прочитав</u> комментарии к каждой переменной (после #)!</p>
  <p id="fde9">Если все сделано правильно, можно запустить код двумя нажатиями на файл, который вы переименовали в .py во 2-ом шаге. Но лучший вариант запустить отдельно cmd, перейти в папку со скриптом командов <code>cd C:\\путь_до_папки_со_скриптом</code> и только потом через команду <code>python code.py</code> запустить скрипт. Так вы сможете видеть ошибки (traceback&#x27;s), появляющиеся в момент выполнения скрипта.</p>
  <p id="EZfY"><br /><strong>Нюансы по работе кода:</strong></p>
  <ul id="6ueB">
    <li id="X1sr">Для работы кода выше, необходимо чтобы юзер переходил на регистрацию по вашей трекинговой ссылке кампании с подставленным параметром <code>keitarodomain.com/?chat_id={{USER_ID_TEXT}}</code> - Такую ссылку должен выдавать ваш бот для регистрации. О том <a href="https://teletype.in/@adamusfb/shemny-traffic-integracia-keitaro-puzzlebot#3Hrx" target="_blank">как настроить источник и его параметры в ч.1</a></li>
    <li id="SZMH">Источник в кейтаро должен иметь параметр для хранения метки оператора. У меня к примеру это sub_id_7 и код под это заточен. Если вы хотите изменить метку в которой у вас будет храниться параметр с именем оператора, измените его в источнике, затем в кампании и в коде в 266 строчке <code>{kt_address}/?_update_tokens=1&amp;sub_id={subid}&amp;sub_id_7={handler_name}</code> (sub_id_ваш_id_метки)</li>
    <li id="E8JI">Запись лида на юзера производится в клики Кейтаро, не в конверсии. Т.е мы не можем обновить параметры внутри конверсий, тк. будет повторная отработка s2s если таковые в кампании имеются. Соотв. смотреть стату по конверсиям не получится, но нам доступна стата кампании.</li>
    <li id="XSXE">Каждый файл с таким кодом = 1 новый бот из botfather + новое название обработчика в переменной handler_name. Простыми словами у каждого обработчика должен быть свой бот, со своими токеном и со своим названием переменной handler_name</li>
    <li id="XHls">Все файлы всех ботов должны находиться в одной папке, тк. файл с логом ботов и все боты ориентируются на него. Если расположить их по разным папкам, будет недоступна функция проверки записан ли юзер уже на одного из обработчиков или нет.</li>
  </ul>
  <p id="6D74"></p>
  <h3 id="IPNB">Настройка <a href="https://puzzlebot.top/?r=gvinj38Z" target="_blank">PuzzleBot</a></h3>
  <p id="EGkY">Теперь стоит сказать пару слов о том, как сделать, чтобы бот <a href="https://puzzlebot.top/?r=gvinj38Z" target="_blank">Puzzle </a>отправлял сразу ссылку на регистрацию с подставленными параметрами сразу после вызова команды start.</p>
  <p id="Fj3o">В конструкторе бота создаем условную конструкцию, которая будет проверять на пустоту переменную <code>start_payload</code> и если она пустая - отрабатывать обычный скрипт бота. Если не пустая - отправлять юзеру сразу текст с ссылкой для регистрации с параметрами, по примеру <code><a href="https://keitaro-campaign-domain.com/?chat_id=" target="_blank">https://keitaro-campaign-domain.com/?chat_id=</a>{{USER_ID_TEXT}}</code></p>
  <figure id="5j9m" class="m_column">
    <img src="https://img3.teletype.in/files/e3/7f/e37f03af-2ef3-447c-8f9f-d9aea2627920.png" width="901" />
  </figure>
  <p id="VWoF"><strong>У меня пост с регистрацией выглядит так:</strong></p>
  <figure id="7qHo" class="m_original">
    <img src="https://img2.teletype.in/files/1d/4e/1d4e0c2a-51cf-45a5-a80a-80967d073314.png" width="487" />
  </figure>
  <p id="J16C"><code>url_first_play</code> - в этой переменной хранится ссылка на кампанию кейтаро, которая делает редирект уже на оффер<br /><code>start_payload</code> - в этой метке я передаю метку обработчика. Он кидает юзеру ссылку на бота в таком формате <a href="https://t.me/mybot?start=handler" target="_blank"><code>https://t.me/mybot?start=handler</code></a>, где handler это метка обработчика<br /><code>user_id_text </code>- это переменная содержащая внутри себя chat_id телеграма этого юзера. Этот id нужен для работы скрипта приведенного выше</p>
  <p id="QqPH"><strong>Таким образом из всех этих переменных собирается ссылка для регистрации:<br /></strong><code>https://mydom.com/hanler=az&amp;chat_id=9445674&amp;registred=0</code></p>
  <p id="VcId">После проделанных выше действий, при переходе юзером в бота с подставленным параметром start, вызывается действие, которое присылает юзеру пост с готовой ссылкой для регистрации с необходимыми нам параметрами.</p>
  <p id="eGJo">Осталось лишь объяснить обработчикам для чего подставлять <code>?start=</code> к ссылке бота и где брать сслки для залива :) (<strong>PS</strong>: в боте командой /links, если они там указаны предварительно конечно).<br /></p>
  <h3 id="Tif7">Послесловие</h3>
  <figure id="3iF8" class="m_column">
    <img src="https://img2.teletype.in/files/d6/62/d6624d97-3253-4bd3-8598-a449413b13ad.png" width="1090" />
    <figcaption>Так выглядит работа правильно настроенного бота. Если не видно что написано ПКМ =&gt; открыть изображение в новом окне</figcaption>
  </figure>
  <p id="c7zS">Вот и все :) Теперь вы можете заливать как с канала в бот, так и с лички в бот, имея при этом полный трекинг всего что вам нужно. Выше показан пример работы бота и какие команды за что отвечают.</p>
  <p id="zL4g">Если вы читали первую статью и делали все точь в точь <a href="https://teletype.in/@adamusfb/shemny-traffic-integracia-keitaro-puzzlebot#3Hrx" target="_blank">как в ней</a>, то эта часть должна встать в вашу систему как влитая. Если же вы делали изменения, меняли метки и пр., <strong>необходимо адаптировать код под это дело </strong>/ написать новый под свои задачи.<br /></p>
  <h3 id="z7Q2">Что будет дальше этой статьи?</h3>
  <figure id="Joim" class="m_column">
    <img src="https://img2.teletype.in/files/56/de/56de3992-e8c1-458d-b0ce-497e5271ea25.png" width="816" />
    <figcaption>Отбив статуса lead в Facebook с помощью Conversion Api </figcaption>
  </figure>
  <p id="WOBX">По сути хотел остановиться на этом, но перая часть статьи вызвала бурный интерес к теме, поэтому я буду отталкиваться от реакций и просмотров данной части. Если продолжение будет вам интересно, напишу еще пару статей про залив за подписки в тг и оптимизацию за ФД / РД. </p>
  <p id="qgqt">На данный момент <strong>найден способ отбивать лиды при подписке на канал</strong>, но выглядит он громоздко, хоть и работает как часы. Рекомендую тем кто шарит заливать просто на ФД, РД, благо сделать это гораздо проще чем при заливах за подписки</p>
  <h3 id="a9JM">Немного о спонсорах</h3>
  <figure id="q5xL" class="m_column">
    <img src="https://img1.teletype.in/files/0e/57/0e57e55e-437b-4b3d-aa4f-9850d70e55a6.jpeg" width="1200" />
  </figure>
  <p id="uF3k">Как вы сами убедились из серии статей, <a href="https://keitaro.io/89119/info" target="_blank">Keitaro </a>невероятно эффективный инструмент в работе с трафиком. Как раз сейчас выходит новая версия 10.1, в которой будут значительные улучшения опыта работы с трекером. Советую лично от себя обновиться прямо сейчас. А чтобы обновление не вышло в копеечку, предоставляю вам промо <code>adamblog</code> с 20% скидкой для новых участников. <a href="https://keitaro.io/89119/info" target="_blank">Перейди на зеленую сторону и увеличь свой ROI кратно вместе с Keitaro</a></p>
  <p id="BpgC"><strong>Для тех кому интересно, выкладываю список новых функций:<br /></strong>⚡️Интеграции по автоматической передаче расходов с Google Ads и TikTok<br />⚡️Режим чтения кампаний/лендингов/офферов для отдельных пользователей<br />⚡️Новые статусы конверсий Reg &amp; Dep для работы с гемблингом<br />⚡️Новые метрики в отчетах от уникальных кликов (uCPC, uEPC и др)<br />⚡️Новый редактор лендингов (обновленный функционал и дизайн)<br />⚡️Совместимость с Bearer token<br />⚡️Обновленная цветовая гама Dashboard </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@adamusfb/shemny-traffic-integracia-keitaro-puzzlebot</guid><link>https://teletype.in/@adamusfb/shemny-traffic-integracia-keitaro-puzzlebot?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb</link><comments>https://teletype.in/@adamusfb/shemny-traffic-integracia-keitaro-puzzlebot?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb#comments</comments><dc:creator>adamusfb</dc:creator><title>Схемный трафик (ч.1): Автоворонка в боте</title><pubDate>Mon, 12 Jun 2023 23:08:50 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2c/9f/2c9f868e-5086-44ff-a7ca-e93ac38a9ed4.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/ea/49/ea4939f0-4e4f-43c1-ad0c-56fa63e74be4.png"></img>Еще год-полтора назад появилось такое понятие как &quot;Схемный трафик&quot; и изначально им пользовались исключительно гемблисты. Позже этим же способом начали лить бинарки, крипту, нутру и все прочее. Сейчас схемный находится в топе, все больше аффов адаптируют свои классические воронки под работу с мессенджерами в связке с чат-операторами. ]]></description><content:encoded><![CDATA[
  <figure id="HRCT" class="m_column">
    <img src="https://img3.teletype.in/files/ea/49/ea4939f0-4e4f-43c1-ad0c-56fa63e74be4.png" width="2400" />
  </figure>
  <h3 id="CIlQ">Предыстория</h3>
  <p id="4uq2">Еще год-полтора назад появилось такое понятие как &quot;Схемный трафик&quot; и изначально им пользовались исключительно гемблисты. Позже этим же способом начали лить бинарки, крипту, нутру и все прочее. Сейчас схемный находится в топе, все больше аффов адаптируют свои классические воронки под работу с мессенджерами в связке с чат-операторами. </p>
  <p id="xizS">Мне было интересно взяться за подобное и посмотреть на устройство этого изобретения изнутри, ну и конечно же придумать пару технических штук для упрощения работы операторов и команды в целом. <br /></p>
  <h3 id="17HD">О чем эта статья</h3>
  <p id="VxTv">Сегодня речь пойдет об автоворонке и ее реализации с помощью сервиса <a href="https://puzzlebot.top/?r=gvinj38Z" target="_blank">PuzzleBot</a>. Кто не в курсе, Puzzle - это <code>no-code</code> конструктор чат ботов Telegram, обладающий практически неограниченными возможностями.</p>
  <p id="eX9W"><strong>Почему я выбрал именно PuzzleBot? <br /></strong><em>- Стабильность<br />- Наличие входящего и исходящего API <br />- Наличие сценариев / постинга<br />- Возможность интеграции WebApp в бота</em></p>
  <p id="1Uxg">Сразу скажу, в данной статье <u><strong>я не буду разбирать конкретные примеры воронок</strong></u> (текст, визуал), а лишь покажу возможности, которые открываются при использовании связки партнерки + трекера + пазла. Для кого-то информация изложенная внизу может показаться банальной, для кого-то это будет откровением.<br /> <br />Чтобы было проще понять о чем идет речь, <strong><u>я сделал пример</u></strong> такого бота специально для вас: ➡️<a href="https://t.me/scheme_traffic_bot" target="_blank">https://t.me/scheme_traffic_bot⬅️</a>. <strong><u>Потыкайтесь</u></strong> и вернитесь в статью. </p>
  <p id="nr7R"></p>
  <h3 id="PZT5">Немного о минусах и плюсах</h3>
  <p id="D9uF">Для начала стоит перечислить минусы использования ботов в схемном трафике. Глупо было бы ожидать что все будет идеально, ведь если крупные команды прямо сейчас заливают на каналы, значит не все так гладко, ну либо они слишком ленивы и не хотят заниматься продумыванием структуры ботов. <br /><br /><strong>Главный </strong>и <strong>самый существенный минус бота</strong> - это неумение аудитории пользоваться кнопками и прочим функицоналом ТГ. Среди всего прочего, этот минус выделяется и бьет по шарам. Тем не менее, этот &quot;острый угол&quot; можно сгладить с помощью сценариев / событий / контента внутри бота.</p>
  <p id="XGGr"><strong>Плюсы бота:</strong> </p>
  <ul id="SbPR">
    <li id="K21e">Полный трекинг <u><strong>всего что можно оттрекать</strong></u></li>
    <li id="d7ok">Сигментирование аудитории на всех этапах</li>
    <li id="A2Cg">Сохранение контактов юзера, если они регнулись через ссылку на бота из канала (вместо прямых ссылок, размещаем ссылки на бота в канале и юзеры делают регу через него)</li>
    <li id="87OL">Скрытость воронки (контента) от посторонних глаз</li>
    <li id="whOk">Процент отписки (блокировки) от бота ~25% от общего числа подписавшихся <u>за счет персонализированного контента</u>. Тогда как в канале этот процент может достигать 55-60%.</li>
    <li id="d3A9">Автоматическая работа с юзером на основе S2S постбэков из <a href="https://keitaro.io/89119/info" target="_blank">Keitaro</a> \ <a href="https://cp.binom.org/aff/go/pavelogsflt" target="_blank">Binom</a></li>
    <li id="5hJu">Возможность встраивания WebApp (сайт) прямо внутрь бота</li>
    <li id="vOYe">Возможность использования Conversion API Facebook для трекинга различных событий</li>
  </ul>
  <p id="c0FA"><strong>Минусы бота</strong>: </p>
  <ul id="MBzX">
    <li id="8KQw">Отсутствие соц. подтверждения в виде количества подписчиков на канале \ количестве просмотров и лайков на постах</li>
    <li id="AXbO">Безграмотность аудитории и не понимание как работать с ботом (зависит от гео и от вашего поясняющего этот момент контента)</li>
    <li id="FvVX">Не у всех партнерок есть настройка постбэков в трекер на каждое из событий</li>
  </ul>
  <p id="RI6v"></p>
  <h3 id="z74q"><strong>Как сделать подобное</strong></h3>
  <p id="faIN">Если вы протыкали все кнопки в <a href="https://t.me/scheme_traffic_bot" target="_blank">тестовом боте</a> и дошли до этой главы, то вы готовы немного напрячь мозги и сделать красиво. Ниже будет приведена пошаговая инструкция для реализации. Сразу скажу, для того чтобы пройтись по руководству и нигде не ошибиться, нужно ознакомиться <strong><u>хотя бы с базой функционала вашего трекера</u></strong> и <strong><u><a href="https://puzzlebot.top/?r=gvinj38Z" target="_blank">сервиса PuzzleBot</a></u></strong>. Без этого фундамента, вряд ли у вас получится собрать &quot;пазл&quot; воедино и получить что-то рабочее на выходе. </p>
  <p id="CUcx">Бот который был приведен в пример выше собран в связке ПП + <a href="https://keitaro.io/89119/info" target="_blank">Keitaro </a>+ PuzzleBot. Соотв. все что приведено ниже, будет сделано на примере <a href="https://keitaro.io/89119/info" target="_blank">Keitaro</a>. Если у вас <a href="https://cp.binom.org/aff/go/pavelogsflt" target="_blank">Binom </a>- курите их <a href="https://docs.binom.org/" target="_blank">доку</a>.<br /><br /><strong>Из тех знаний, которые пригодятся в работе: </strong></p>
  <ul id="EpKC">
    <li id="YAOd"><a href="https://docs.keitaro.io/ru/conversions-and-postback/postback.html" target="_blank">Настройка постбэков из партнерской сети</a></li>
    <li id="3jdV"><a href="https://docs.keitaro.io/ru/campaigns-and-streams/s2s-postback.html?h=s2s" target="_blank">Настройка S2S постбэков внутри кампании трекера</a></li>
    <li id="R7Ml"><a href="https://help.puzzlebot.top/article?r=17&a=150" target="_blank">Входящий API сервиса PuzzleBot</a></li>
  </ul>
  <p id="CL9X">Я не буду рассказывать как работает тот или иной сервис / как подцепить бота в Puzzle или как добавить в бота ресурс (канал или чат). Читайте их <a href="https://help.puzzlebot.top/" target="_blank">доку </a>/ смотрите поясняющие видосы на их <a href="https://www.youtube.com/c/iampuzzlebot" target="_blank">Youtube-канале</a>. <strong>Там все / обо всем подробно расписано</strong>. </p>
  <h3 id="n87m"><br />Настроим PuzzleBot</h3>
  <p id="FsMj">1. После подключения бота и нужных ресурсов в него, зайдем в раздел <a href="https://cp.puzzlebot.top/moderation" target="_blank">Модерация</a> и создадим следующие категории: </p>
  <ul id="6l17">
    <li id="EuKH">Зарегистрирован</li>
    <li id="oG5m">Сделал Sale</li>
    <li id="FkgL">Сделал Rebill </li>
  </ul>
  <blockquote id="CyAB">В моем примере они указаны так. Вы конечно же можете назвать их как вам заблагорассудиться. Главное чтобы эти категории отображали смысл полученного постбэка от трекера (lead/sale/rebill).</blockquote>
  <figure id="qrPF" class="m_column">
    <img src="https://img4.teletype.in/files/bf/58/bf5824d0-b950-41a6-97f7-b14fca1264ba.png" width="782" />
    <figcaption>Категории будут присваиваться юзерам автоматически (если это нстроено в конструкторе) после прохождения определенных команд в боте (рега, деп, редеп). Далее мы сможем смотреть стату, &quot;разбивать&quot; их по статусам и пр. Создавать категории можно не только под постбэки, но и под любые другие действия в боте - тут все зависит от ваших целей. </figcaption>
  </figure>
  <p id="E1Vk">2. <strong>Зайдем в <a href="https://cp.puzzlebot.top/constructor" target="_blank">Конструктор Puzzle </a>и создадим 3 базовые команды</strong>, которые будут вызываться по API PuzzleBot с помощью настроеного S2S постбэка в кампании <a href="https://keitaro.io/89119/info" target="_blank">Keitaro</a>. У меня эти действия называются <code>registred, deposited, redeposited</code>. Вы же можете назвать их как вам угодно, <u>главное что бы было понимание что эти названия команд, в дальнейшем необходимо будет указывать при обращении к апи паззла</u>. </p>
  <figure id="Hpoe" class="m_column">
    <img src="https://img2.teletype.in/files/d4/a7/d4a7b4d7-7bf5-4427-af8a-f931552abc66.png" width="1173" />
    <figcaption>Так выглядит базовая конструкция бота, для работы с постбэками из Keitaro TDS. От этих 3х действий можно строить дальнейшие логические цепочки и планировать воронку.</figcaption>
  </figure>
  <p id="G527"><strong>Рассмотрим подробнее как выглядят эти команды внутри:</strong></p>
  <figure id="Aj90" class="m_column">
    <img src="https://img2.teletype.in/files/1e/fc/1efc1e3f-fee0-4f2c-b13c-068e183346f2.png" width="1166" />
    <figcaption>Остальные действия deposited, rediposited настроены аналогичным образом, как на скриншоте выше, но категории там присваиваются юзеру уже совсем другие, которые отвечают отработке постбэков на sale / rebill.</figcaption>
  </figure>
  <p id="3xyg">В каждой команде я поставил <strong><u>доп. действие</u></strong> при срабатывании команды. Первое действие что мы делаем - меняем категорию для юзера, у которого сработала команда <code>registred</code> . По желанию делаем уведомление в спец. группу о переходе юзера из одной категории в другую. Это уже по желанию, но мне так удобнее, потому что я и моя команда <u>всегда видим кто/что/когда сделал</u> и можем по <u>одному клику найти этот диалог в тг</u>.</p>
  <p id="FvRT">3. <strong>Создадим токен</strong> от нашего <a href="https://puzzlebot.top/?r=gvinj38Z" target="_blank">Puzzle бота</a> для доступа к внешнему API и сохраним его к себе в блокнотик. Он нам пригодится, когда будем настраивать S2S внутри кампании KT.</p>
  <figure id="ZlsF" class="m_column">
    <img src="https://img2.teletype.in/files/14/7f/147f50ed-e682-426d-a472-bca34b70c71b.png" width="1157" />
    <figcaption>Созданные токены всегда доступны в настройках бота, в разделе &quot;Интеграции&quot;. </figcaption>
  </figure>
  <p id="rcC7">На этом настройка <strong><u>базы</u></strong> для автобота завершена. После настройки других компонентов (пп, трекера) этого большого пазла, можно будет вернуться и &quot;обвесить&quot; этот каркас контентом и пр. лабудой. </p>
  <p id="5rdB"></p>
  <h3 id="1vbY">Настройка Партнерской сети</h3>
  <p id="zzDQ">Практически в каждом трекере уже имеются готовые шаблоны для прокидывания постбэков из ПП. Все что вам надо сделать, зайти в раздел Партнерские сети (<code>/admin/#!/affiliate_networks/</code>) в трекере, нажать на кнопку &quot;Создать&quot; и выбрать готовый шаблон постбэка. Далее вам выпадет готовая ссылка для вставки в настройки партнерской сети. Мы ее копируем, идем в настройки нашей ПП и вставляем в настройки постбэков.</p>
  <figure id="0UZF" class="m_column">
    <img src="https://img2.teletype.in/files/d0/47/d0476442-9e56-4828-8d78-632af83e9ca0.png" width="917" />
  </figure>
  <p id="0HCM"><strong>Но что делать, если среди шаблонов не оказалось нужной ПП?</strong> - Не отчаиваться и запастись терпением. Для начала рекомендую прочесть <a href="https://docs.keitaro.io/ru/conversions-and-postback/postback.html" target="_blank">FAQ от КТ по созданию Партнерской сети в трекере</a>. <br /><br />Для успешного создания своей ПП в <a href="https://keitaro.io/89119/info" target="_blank">Keitaro</a>, необходимо знать <strong>1 фундаментальную вещь</strong>: Все данные синхронизируются с помощью subid (в биноме это clickid) трекера. Сабайди это уникальный идентификатор клика, который у каждого юзера<u>,</u> при каждом заходе <strong><u>на ссылку кампании разный</u></strong>. Я специально выделил жирным что это именно <strong><u>ссылка кампании</u></strong>, а не прямая на лендинг, тк. subid попросту не присваивается юзеру, если вы заливаете напрямую  ссылку на ленд! Этот subid мы обязаны передать в партнерку, чтобы в дальнейшем, после целевого действия юзера партнерка смогла забрать этот subid из своей БД и отправить постбэк в трекер. Звучит сложно, но на самом деле все гораздо проще чем кажется. </p>
  <p id="mhye"><strong>Mindmap с объяснением взаимодействия ПП и трекара и роли Subid в этом взаимодействии:</strong></p>
  <figure id="orKU" class="m_column">
    <iframe src="https://miro.com/app/live-embed/uXjVMAcwuJw=/?moveToViewport=1325,-954,1819,895&embedId=901846784455"></iframe>
  </figure>
  <p id="gdgZ">Еще одна важная деталь состоит в том, что для каждого события свой статус. В кейтаро есть 3 основных статуса: <code>lead</code>(конверсия), <code>sale</code>(продажа), <code>rebill</code>(на самом деле <code>sale + tid</code>, но в БД КТ это пишется как <code>rebill</code>- допродажа). <br /><br /><strong>Хвост постбэка на</strong> <code><em>lead</em></code>:<br /><code>postback/?subid={subid}&amp;status=lead&amp;payout={payout}</code></p>
  <p id="GBYe"><strong>Хвост постбэка на</strong> <code><em>sale</em></code>:<br /><code>postback/?subid={subid}&amp;status=sale&amp;payout={payout}</code></p>
  <p id="37Op"><strong>Хвост постбэка на</strong> <code>rebill</code>:<br /><code>postback/?subid={subid}&amp;status=sale&amp;payout={payout}&amp;tid={tid}</code></p>
  <p id="i2MX">По поводу статуса lead, все понятно. Но есть некоторая путаница по поводу sale &amp; rebill. Смотрите, если мы отправляем постбэк только с 3 метками <code>subid / status / payout</code> - то все это считается <strong><u>продажей</u></strong>, но если к этому хвосту добавить <code>tid</code> (transaction id) - то этот постбэк будет считаться <strong><u>допродажей</u></strong>. По этой логике можно быстро собирать свои постбэки для любого из событий, для любой из ПП, где есть возможность настраивать постбэки.</p>
  <h3 id="3Hrx"><br /><strong>Настроим источник в Keitaro</strong>: </h3>
  <p id="nPQY"><strong>Зайдем в &quot;Источники&quot;</strong> (<code>/admin/#!/traffic_sources/</code>) в трекере и выберем источник с которого будем заливать схемный трафик, в моем случае это Facebook. Пропишем метку, в которую будет записываться <code>chat_id</code>(уникальный идентификатор пользователя Telegram). По этому <strong><u>параметру</u> </strong>в дальнейшем будет происходить <u><strong>синхронизация с ботом юзера</strong></u>. Если <strong><u>не передать</u></strong> <code>chat_id</code>, мы <strong><u>не сможем сделать S2S запрос</u></strong> на API PuzzleBot с названием команды для ее запуска у юзера. </p>
  <p id="JIu9"><strong>Поэтому настраиваем либо как на скрине, либо в таком порядке: </strong><br />Моя метка (Название метки для отображения в стате) | my_metka | {my_metka} (в виде макроса). </p>
  <p id="dMIt">Далее необходимо прожать галку в левом нижнем углу &quot;Обновить в кампаниях&quot; и сохранить. Опять же, если вы льете <strong><u>не</u></strong> только схемный, но и другие вертикали, необходимо вручную <u>у<strong>далить источник из кампании со схемным</strong></u> и снова его туда проставить, а затем сохранить, чтобы все измененные метки из источника подятнулись и проставились в раздел параметров внутри кампании. </p>
  <figure id="LIUx" class="m_column">
    <img src="https://img4.teletype.in/files/b7/c9/b7c939cf-26ae-4434-99f6-0340886d7a3e.png" width="911" />
    <figcaption>Так выглядит у меня настройка кампании. Остальные метки замазаны. Вы можете проставить свои метки <u>в ближайшее свободное поле</u></figcaption>
  </figure>
  <figure id="Kwc8" class="m_column">
    <img src="https://img4.teletype.in/files/37/0f/370f8474-4f3c-4524-8f7c-c12cc1df7da4.png" width="1088" />
    <figcaption>Параметры должны проставиться в <u>каждой кампании</u>, которую вы собираетесь заливать <u>в связке с ботом</u>.</figcaption>
  </figure>
  <p id="og6s"></p>
  <h3 id="bIMv">Настройка S2S постбэков внутри кампании Keitaro</h3>
  <p id="n7RQ">Вот тут-то нам и пригодится <a href="#FvRT">созданный токен</a> от <a href="https://puzzlebot.top/?r=gvinj38Z" target="_blank">PuzzleBot </a>и их <a href="https://help.puzzlebot.top/article?r=17&a=150" target="_blank">дока</a>. Из их руководства следует: Для того чтобы вызвать команду у конкретного пользователя, мы обязаны сделать запрос с указанием его chat_id Telegram и названием запускаемой команды: </p>
  <p id="gVHx"><code>method: <strong>sendCommand</strong></code><br /><code>params:</code><br /><code> command_name - string, name of command ot condition</code><br /><code> tg_chat_id - number, Telegram id of resource or user</code></p>
  <p id="CEnR"><code>success result: code = 0, data = &quot;ok&quot;</code><br /><br /><strong>URL для запуска команды <em>registred</em></strong><strong>в моем случае будет выглядеть вот так</strong>:<br /><em>https://api.puzzlebot.top/?token=LF4cRL0ZXmV2S6SXUCMYJmkVHIZ&amp;method=sendCommand&amp;command_name=registred&amp;tg_chat_id={sub_id_9}</em></p>
  <p id="e1qD">Я скопировал <a href="#FvRT">заранее созданный api-ключ из сервиса PuzzleBot</a> и подставил его в метку token=. Затем в метку command_name= прописал <a href="#E1Vk">название команды</a> так, <strong><u>как она называется у меня в конструкторе внутри PuzzleBot</u></strong>. Ну и конечно же вставил <a href="#JIu9">метку от трекера</a>, в которой у меня хранится chat_id человека, который совершил целевое действие на моей ссылке кампании. <br /><br />Небольшая путаница возникает у людей, когда они сталкиваются с настройкой S2S в КТ. Почему я поставил макрос с названием <em>{sub_id_9} </em>вместо {<em>chat_id</em>}? - <strong>Все просто</strong>: Для БД трекера &quot;chat_id&quot; - это лишь <strong><u>пользовательское название метки</u></strong> <em>sub_id_№ </em>с порядковым номером 9. Если вы поставите в S2S ваше пользовательское название (у меня это chat_id), то трекер попросту <u><strong>не найдет такой метки</strong></u>, не сможет испольнить макрос и получить значение из БД. <br /><br /><strong>Найти свой порядковый номер sub_id_ очень легко. Достаточно зайти в кампанию и посчитать сверху вниз по нарастающей, как указано это на скриншоте снизу:</strong></p>
  <figure id="Eell" class="m_column">
    <img src="https://img2.teletype.in/files/db/0a/db0a6102-49aa-4ed2-bd67-3606030dcd46.png" width="1077" />
    <figcaption>Исходя из этой логики, нужное мне значение лежит в метке sub_id_9</figcaption>
  </figure>
  <p id="JLYM">1. С <a href="#CEnR">собранной ссылкой</a> для S2S, идем во вкладку S2S Postback внутри настраиваемой кампании, создаем перый наш постбэк для события lead и вписываем собранную ссылку в поле URL:</p>
  <figure id="u182" class="m_column">
    <img src="https://img3.teletype.in/files/22/ca/22ca38ad-61bd-43c2-934e-c8035a6136fb.png" width="955" />
  </figure>
  <p id="a5YL">2. Далее я создаю еще один постбэк с помощью кнопки &quot;Добавить&quot;, заменяю в <a href="#CEnR">URL</a> в метке <em>command_name</em>= значение на следующую мою пользовательскую команду из конструктора PuzzleBot - у меня это deposited: </p>
  <figure id="Hl8M" class="m_column">
    <img src="https://img3.teletype.in/files/ef/88/ef884e22-f61e-471e-8432-f0d8a1759803.png" width="960" />
  </figure>
  <p id="yNyb">3. Те же действия проделываем с 3им постбэком: создаем, заменяем на соотв. команду (у меня это redeposited) и снимаем галки как показано на скрине:</p>
  <figure id="dSna" class="m_column">
    <img src="https://img4.teletype.in/files/34/20/34206d4a-0fb0-4af4-832d-545427605485.png" width="1749" />
  </figure>
  <h3 id="ZqZy">Проставляем ссылки в бот</h3>
  <p id="OfaY">Копируем ссылку из кампании, убираем все ненужные метки из ссылки, оставляем только те что действительно нужны (chat_id). Можете конечно и не убирать, но те же макросы от Facebook тут работать не будут (вообще лучше создать отдельный источник в КТ и проставить кастом параметры там).</p>
  <p id="HUhQ"><strong>В метку где будет храниться наш chat_id,  пишем внутренний макрос PuzzleBot в виде</strong> <code>chat_id={{USER_ID_TEXT}}</code>: </p>
  <figure id="LFds" class="m_column">
    <img src="https://img4.teletype.in/files/3d/d1/3dd1bc43-7ded-4d7e-bf81-c29bc798c2b1.png" width="1165" />
  </figure>
  <p id="quzW">Поздравляю, с этого момента, любое целевое действие совершенное пользователем на нашей трекинговой ссылке КТ, будет передаваться по API в Puzzle и для пользователя будет запускаться команда указанная в command_name=. </p>
  <h3 id="46Su"><br /><strong>Подитог</strong></h3>
  <p id="s7ar">С виду все выглядит невероятно сложно, но если разобраться в этом всего лишь один раз - можно будет творить все что придет в голову. <u>Возможности современных сервисов это позволяют</u>. </p>
  <p id="JJMk">На описанный выше &quot;каркас&quot; можно навешать любой контент. В общем можно все это оформить интуитивно для пользователя и вывести для себя идеальную формулу автобота. Ну а если аудитория безграмотная, можно наполнить бот визуалом, объясняющим как с ним взаимодействовать (прямо показывать что можно тыкать на кнопки в видео). </p>
  <p id="CJkk">В таком сетапе латам у нас шел замечательно, а вот Индия в дикий минус, потому что индусы не очень грамотные и очень ленивые, <u>тупо не хотят разбираться с тем как это работает</u>. В общем все зависит от гео и от вашего подхода / инструкций в визуале. </p>
  <h3 id="FKxT"><br />О чем будет следующая статья</h3>
  <p id="jSIn">В след. теме, я разберу возможности пролива на канал и регистрации юзеров через бот, а так же создание персональных ботов для каждого обработчика и снятие 50% существующих головняков у команд. </p>
  <p id="H9cJ">С помощью регистрации юзеров через бота, мне удалось выстроить систему, при которой обработчики могут записывать юзеров пришедших им в личку просто переслав сообщение этого юзера в свой персональный бот (красное выделение). </p>
  <p id="16HX">Так же за счет интеграции персональных ботов с трекером, у обработчика появляется возможность смотреть свою стату с подсчетом их заработка даже не заходя в трекер (синее выделение):</p>
  <figure id="XgB6" class="m_column">
    <img src="https://img2.teletype.in/files/d6/62/d6624d97-3253-4bd3-8598-a449413b13ad.png" width="1090" />
  </figure>
  <p id="oZn2"></p>
  <h3 id="vO3l">Немного о партнерах</h3>
  <p id="1KMa">Моим верным партнером и незаменимым инструментом в работе все так же остается трекер <a href="https://keitaro.io/89119/info" target="_blank">Keitaro</a>. Совсем недавно разработчики полностью обновили внутрянку трекера, сделав его еще быстрее и функциональнее. </p>
  <p id="l1NF">Настоятельно рекомендую сделать апдейт и перейти на новую, 10ую версию <a href="https://keitaro.io/89119/info" target="_blank">Keitaro TDS</a>. Ну а по промокоду <code>adamblog</code>, вы сможете это сделать с выгодой -20%. Регистрируйтесь <a href="https://keitaro.io/89119/info" target="_blank">https://keitaro.io/89119/info</a> и переходите на &quot;зеленую&quot; сторону.</p>
  <figure id="lOpP" class="m_column">
    <img src="https://img2.teletype.in/files/5e/76/5e760cac-5208-4661-bd2c-af11358c0514.png" width="1200" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@adamusfb/AsMzjACY1BM</guid><link>https://teletype.in/@adamusfb/AsMzjACY1BM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb</link><comments>https://teletype.in/@adamusfb/AsMzjACY1BM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb#comments</comments><dc:creator>adamusfb</dc:creator><title>Универсальный конструктор апи и настройка лендинга за 2 минуты</title><pubDate>Wed, 02 Nov 2022 15:28:10 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c7/ea/c7eadda9-23c6-47fb-a146-7c25eb7888fe.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/b7/c3/b7c3f547-c80f-4f6a-96fc-598ce9d9f97b.png"></img>Список ПП доступных для сборки конструткором:
- aff1
- terraleads
- lemonad
- leadtrade
- leadrock
- leadreaktor
- leadbit
- kma
- cpagetti
- adcombo]]></description><content:encoded><![CDATA[
  <figure id="4kXB" class="m_column">
    <img src="https://img4.teletype.in/files/b7/c3/b7c3f547-c80f-4f6a-96fc-598ce9d9f97b.png" width="1343" />
  </figure>
  <h2 id="kI6q"><br />Конструктор</h2>
  <p id="V7HC"><strong>Список ПП доступных для сборки конструткором:<br />- </strong>aff1<br />- terraleads<br />- lemonad<br />- leadtrade<br />- leadrock<br />- leadreaktor<br />- leadbit<br />- kma<br />- cpagetti<br />- adcombo</p>
  <p id="QAlg"></p>
  <p id="48S2"><strong>Настройка </strong><br />1. Размещаем папку <strong>thanks </strong>и <strong>apis </strong>в <u>корне своего трекера<br /></u>2. Заходим в папку apis, находим файлик <code>config.php</code> и вставляем туда свои API-токены от партнерок (где найти токены в каждой из пп, можно посмотреть там же). <br />3. Находим в этом же файлике переменную <code>$custom,</code> в ней прописываем название меток, из которых будут передаваться данные в партнерки. </p>
  <p id="ylq7"><strong>Для ссылки такого вида:</strong><code><br /><em>https://mydom.com/?buyer=zeliboba&amp;account=bm45&amp;domain=mydom.com&amp;pixel=9999999999999</em></code></p>
  <p id="coOr"><strong>Переменная<code> $custom</code> должна иметь след. вид:</strong><br /><code>$custom = [<br />	&quot;sub_id_1&quot;	=&gt;&quot;buyer&quot;,<br />	&quot;sub_id_2&quot;	=&gt;&quot;account&quot;,<br />	&quot;sub_id_3&quot;	=&gt;&quot;domain&quot;,<br />	&quot;sub_id_4&quot;	=&gt;&quot;pixel&quot;,<br />	&quot;clickid&quot;	=&gt;&quot;subid&quot;<br />];</code></p>
  <p id="wjgZ"><strong>Если у вас нет меток для передачи в пп, то просто оставим эти поля пустыми:</strong></p>
  <p id="qN1y"><code>$custom = [<br />	&quot;sub_id_1&quot;	=&gt;&quot;&quot;,<br />	&quot;sub_id_2&quot;	=&gt;&quot;&quot;,<br />	&quot;sub_id_3&quot;	=&gt;&quot;&quot;,<br />	&quot;sub_id_4&quot;	=&gt;&quot;&quot;,<br />	&quot;clickid&quot;	=&gt;&quot;subid&quot;<br />];<br /><br /></code>Поле <code>clickid</code> называем так, как у вас в трекере называется макрос для передачи сабайди (нужен для постбэка с пп в трекер). В данном случае это Кейтаро, поэтому оставляем <code>subid</code>.</p>
  <p id="0N5A"></p>
  <p id="8xrY"><strong>После настройки имеем пути с которыми мы будем работать: </strong><br /><a href="https://yourdomain.com/apis/index.php" target="_blank">https://yourdomain.com/apis/index.php</a> - тут мы собираем код для интеграции в форму лендинга</p>
  <figure id="Xz5I" class="m_original">
    <img src="https://img2.teletype.in/files/15/b5/15b5dbe5-722d-4436-9c6d-6254fd29e5b2.gif" width="600" />
  </figure>
  <p id="iYz6"><strong>Пример сборки в конструкторе и последующая отправка лида:</strong></p>
  <figure id="xRvF" class="m_column">
    <iframe src="https://www.youtube.com/embed/ZErC0sFUL_U?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="YyQg"><br /><br /><a href="https://yourdomain.com/apis/logs/index.php" target="_blank">https://yourdomain.com/apis/logs/index.php</a>  - тут мы можем в удобном виде читать логи отправленных заявок за каждый день из каждой пп</p>
  <figure id="GDto" class="m_column">
    <img src="https://img2.teletype.in/files/5c/c9/5cc9070e-21b3-48d3-8d8f-a7679d8cbf44.gif" width="1276" />
  </figure>
  <p id="2nIw"></p>
  <p id="LRKH"><a href="https://yourdomain.com/thanks/contacts/get.php" target="_blank">https://yourdomain.com/thanks/contacts/get.php</a> - здесь мы можем посмотреть собранные данные пользователей в формате name - phone - mail (если скопировать это в таблицу, то все встанет по ячейкам автоматически).</p>
  <figure id="00nD" class="m_column">
    <img src="https://img2.teletype.in/files/db/8d/db8d8557-a2a9-4cd7-a2f9-b6ca40060fda.gif" width="576" />
  </figure>
  <p id="K5IS"></p>
  <h2 id="8pe1">Страница спасибо</h2>
  <p id="xdu4">Я уже <a href="https://t.me/adamusfb/256" target="_blank">выкладывал у себя на канале эту штуку</a> и довольно подробно описывал принцип ее работы. Не вижу смысла расписывать заново что куда, поэтому просто скопирую текст сюда:<br /><br /><strong>Логика работы:</strong><br />1) С помощью метки <code>country</code> передаем в формате <a href="https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes" target="_blank">iso </a>страну <code>mydom.com/thanks?country=RU</code><br />2) Если перевод для этой страны имеется — покажет перевод под эту страну<br />2.1) Если такой страны с переводом нет в <code>source/iso</code> — покажет страницу спасибо <u>на английском языке</u>.<br /><br /><strong>Возможности</strong>:<br />- Содержит в себе практически все языки перевода и автоматически определяет на какой перевод отправить пользователя.<br /><br />- Можно вписывать свой js код, который будет подгружаться <u>на всех</u> переводах страницы спасибо. Делается это по пути: <code>thanks/source/js/script.js</code>. Внутри этого файла так же присутствует пиксель. Все что вам надо сделать - <u>вписать имя метки</u> в которой вы его передаете в переменную <code>let pxname = &#x27;pixel&#x27;;</code>.<br /><br />- Если пользователь вписывает свой email, его данные попадают в файлик в формате <code>name:phone:email</code>. Сам файл имеет название по передаваемым на страницу спасибо меткам <code>country_vertical_date.txt</code>. <br /></p>
  <p id="hRbc"><br /><strong>Настройка:<br />-</strong> Грузим архив в корень трекера (keitaro/binom) и распаковываем (не в lander / landers а именно в корень сервера).<br /><br />- Если вы используете универсальную страницу спасибо вместе с конструктором апи, то <u>больше ничего делать не надо</u>. Нужно лишь вписать метку в которой передается ваш пиксель в файл <code>thanks/source/js/script.js</code>.<br /><br />- Если вы используете свой апи файл для передачи лидов:</p>
  <ul id="WKqA">
    <li id="P7CE">Ставим редирект на нашу страницу спасибо в апи файле в таком формате<br /><code>header(&#x27;Location:<a href="https://domain.com/thanks/?name=" target="_blank">https://domain.com/thanks/?name=</a>&#x27;.$_POST[&#x27;name&#x27;].&#x27;&amp;phone=&#x27;.$_POST[&#x27;name&#x27;].&#x27;&amp;country=&#x27;.$_POST[&#x27;country&#x27;].&#x27;&amp;vertical=&#x27;.$_POST[&#x27;vertical&#x27;].&#x27;&amp;pixel=&#x27;.$_POST[&#x27;pixel&#x27;].&#x27;);</code></li>
    <li id="vmnX">На лендинг ставим импуты для передачи всех данных для корректной работы страницы спасибо:<br /><code>&lt;input name=&quot;name&quot; type=&quot;hidden&quot; value=&quot;vasya&quot;&gt;<br />&lt;input name=&quot;phone&quot; type=&quot;hidden&quot; value=&quot;9999999999&quot;&gt;<br />&lt;input name=&quot;vertical&quot; type=&quot;hidden&quot; value=&quot;adult&quot;&gt;<br />&lt;input name=&quot;country&quot; type=&quot;hidden&quot; value=&quot;{country}&quot;&gt; <br />&lt;input name=&quot;vertical&quot; type=&quot;hidden&quot; value=&quot;{pixel}&quot;&gt;<br /></code></li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@adamusfb/1WRtMBon4Kc</guid><link>https://teletype.in/@adamusfb/1WRtMBon4Kc?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb</link><comments>https://teletype.in/@adamusfb/1WRtMBon4Kc?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=adamusfb#comments</comments><dc:creator>adamusfb</dc:creator><title>Настраиваем лендинги на COD офферы за 1 минуту</title><pubDate>Mon, 24 Oct 2022 13:54:54 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/64/1a/641a2702-3f93-4894-94e1-d198cdcef153.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/5c/c9/5cc9070e-21b3-48d3-8d8f-a7679d8cbf44.gif"></img>В очередной раз выкладываю то что когда-то писал для себя, но так и не внедрил в оборот (лол). Наверное я один остался из альтруистов кто что-то выкладывает в плане технички, чувствую себя белой вороной. Ну да ладно. 

Не буду долго расписывать, это простой скрипт для быстрой настройки лендингов под COD-товарку. Настраивается 1 раз, а лендингов в последствии настроит сотни и тысячи (если вы этого захотите). Если не понятно что это и зачем, смотрите видео выше ⬆️⬆️⬆️]]></description><content:encoded><![CDATA[
  <figure id="8Rza" class="m_column">
    <iframe src="https://www.youtube.com/embed/ZErC0sFUL_U?autoplay=0&loop=0&mute=0"></iframe>
    <figcaption>Видеодемонстрация работы</figcaption>
  </figure>
  <p id="ZSVY">В очередной раз выкладываю то что когда-то писал для себя, но так и не внедрил в оборот (лол). Наверное я один остался из альтруистов кто что-то выкладывает в плане технички, чувствую себя белой вороной. Ну да ладно. <br /><br />Не буду долго расписывать, это простой скрипт для быстрой настройки лендингов под COD-товарку. Настраивается 1 раз, а лендингов в последствии настроит сотни и тысячи (если вы этого захотите). Если не понятно что это и зачем, смотрите видео выше ⬆️⬆️⬆️</p>
  <p id="up9Z">Благодаря этой небольшой системке, не надо подбирать страницу спасибо, тк. она универсальная и к слову говоря <u>умеет собирать контакты людей</u>, которые оставили свой мэйл на ней. <br /><br /><strong>Список ПП доступных для сборки конструткором:</strong><br />- terraleads<br />- lemonad<br />- aff1<br />- leadtrade<br />- leadrock<br />- leadreaktor<br />- leadbit<br />- kma<br />- cpagetti<br />- adcombo<br /><br /><br /><strong>Настройка конструктора</strong><br />1. Размещаем папку <strong>thanks </strong>и <strong>apis </strong>в <u>корне своего трекера<br /></u>2. Заходим в папку apis, находим файлик <code>config.php</code> и вставляем туда свои API-токены от партнерок (где найти токены в каждой из пп, можно посмотреть там же). <br />3. Находим в этом же файлике переменную <code>$custom,</code> в ней прописываем название меток, из которых будут передаваться данные в партнерки. </p>
  <p id="sfyl"><strong>Для ссылки такого вида:</strong><br /><em>https://mydom.com/?buyer=zeliboba&amp;account=bm45&amp;domain=mydom.com&amp;pixel=9999999999999</em></p>
  <p id="5g2T"><strong>Переменная<code> $custom</code> должна иметь след. вид:</strong><br /><code>$custom = [<br />	&quot;sub_id_1&quot;	=&gt;&quot;buyer&quot;,<br />	&quot;sub_id_2&quot;	=&gt;&quot;account&quot;,<br />	&quot;sub_id_3&quot;	=&gt;&quot;domain&quot;,<br />	&quot;sub_id_4&quot;	=&gt;&quot;pixel&quot;,<br />	&quot;clickid&quot;	=&gt;&quot;subid&quot;<br />];</code></p>
  <p id="i5EO"><strong>Если у вас нет меток для передачи в пп, то просто оставим эти поля пустыми:</strong></p>
  <p id="Gmp6"><code>$custom = [<br />	&quot;sub_id_1&quot;	=&gt;&quot;&quot;,<br />	&quot;sub_id_2&quot;	=&gt;&quot;&quot;,<br />	&quot;sub_id_3&quot;	=&gt;&quot;&quot;,<br />	&quot;sub_id_4&quot;	=&gt;&quot;&quot;,<br />	&quot;clickid&quot;	=&gt;&quot;subid&quot;<br />];<br /><br /></code>Поле <code>clickid</code> называем так, как у вас в трекере называется макрос для передачи сабайди (нужен для постбэка с пп в трекер). В данном случае это Кейтаро, поэтому оставляем <code>subid</code>.</p>
  <p id="wCTE"></p>
  <p id="p6LE"><strong>После настройки имеем пути с которыми мы будем работать: </strong><br /><a href="https://yourdomain.com/apis" target="_blank">https://yourdomain.com/apis/index.php</a> - тут мы собираем код для интеграции в форму лендинга<br /><a href="https://yourdomain.com/apis/logs" target="_blank">https://yourdomain.com/apis/logs/index.php </a> - тут мы можем в удобном виде читать логи отправленных заявок за каждый день из каждой пп</p>
  <figure id="M5s9" class="m_column">
    <img src="https://img2.teletype.in/files/5c/c9/5cc9070e-21b3-48d3-8d8f-a7679d8cbf44.gif" width="1276" />
  </figure>
  <p id="Rgm0"><a href="https://yourdomain.com/thanks/contacts/get.php" target="_blank">https://yourdomain.com/thanks/contacts/get.php</a> - здесь мы можем посмотреть собранные данные пользователей в формате name - phone - mail (если скопировать это в таблицу, то все встанет по ячейкам автоматически).</p>
  <figure id="5tSD" class="m_column">
    <img src="https://img2.teletype.in/files/db/8d/db8d8557-a2a9-4cd7-a2f9-b6ca40060fda.gif" width="576" />
  </figure>
  <p id="jIPs">О том как работать с конструктором, можно посмотреть в видео <u>в самом начале поста</u>.<br /><br />Не забудь подписаться - <a href="https://t.me/adamusfb" target="_blank">https://t.me/adamusfb</a></p>

]]></content:encoded></item></channel></rss>