Как мы реализовали реферальную программу в Telegram

b3dc4f713c5f009f6fe1507256c22f30.jpg

Эта статья для тех кто ищет быструю ману, как и что реализовать в ТГ.

В марте 2024 нам пришлось наш бесплатный тариф завернуть в реферальную систему, так как средств на содержание проекта все меньше и меньше, наш проект рекламировать запретили. НУ и в целом все очень плохо.

Придумали реферальную пирамиду — приведи друга и получи 40% от его платежа и 10% пожизненно от его пополнений. Что очень круто, ты можешь быть использовать любой платный тариф бесплатно да и еще просто запросить вывод средств. Но так как мы заперты в рамки Telegram и не имели опыта в этом, мы задались вопросом — как можно сделать реферальную ссылку на бота? — в статье я продемонстрирую пример реализации на python

from telegram import Update
from telegram.ext import Updater, CommandHandler, CallbackContext

def start(update: Update, context: CallbackContext) -> None:
    ref_id = update.message.text.split()[1] if len(update.message.text.split()) > 1 else None
    if ref_id:
        # здесь у вас может быть код для учета реферальных ссылок
        context.bot.send_message(chat_id=update.effective_chat.id, text=f"Приветствую! Вас пригласил пользователь с ID: {ref_id}")
    else:
        context.bot.send_message(chat_id=update.effective_chat.id, text="Приветствую! Вы пришли сюда сами.")

def main() -> None:
    updater = Updater("TOKEN", use_context=True)

    dispatcher = updater.dispatcher

    dispatcher.add_handler(CommandHandler("start", start))

    updater.start_polling()

    updater.idle()

if __name__ == '__main__':
    main()

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

Реферальные ссылки можно создать просто добавив ID реферала к команде /start в ссылке на вашего бота. Например: https://t.me/your_bot? start=REF_ID.

Для того, чтобы выводить пригласительную ссылку при выполнении команды /reflink, вы можете просто добавить новый обработчик команд в вашего бота. Вот как это можно сделать:

from telegram import Update
from telegram.ext import Updater, CommandHandler, CallbackContext

def reflink(update: Update, context: CallbackContext) -> None:
    # здесь вы можете генерировать идентификатор реферала на основе id пользователя
    ref_id = update.effective_user.id
    ref_link = f"https://t.me/your_bot?start={ref_id}"
    context.bot.send_message(chat_id=update.effective_chat.id, text=f"Ваша реферальная ссылка: {ref_link}\nСкопируйте и поделитесь этой ссылкой с друзьями.")

def main() -> None:
    updater = Updater("TOKEN", use_context=True)

    dispatcher = updater.dispatcher

    dispatcher.add_handler(CommandHandler("reflink", reflink))

    updater.start_polling()

    updater.idle()

if __name__ == '__main__':
    main()
```

Ну и ясно что нужно все это как то хранить вы можете использовать, например, SQLite если ваш ссанный проект очень мал.

import sqlite3
from telegram import Update
from telegram.ext import Updater, CommandHandler, CallbackContext

# Создаем подключение к базе данных (или создаем новую базу данных, если она не существует)
conn = sqlite3.connect('referrals.db')
cursor = conn.cursor()

# Создаем таблицу для хранения информации о рефералах, если она еще не существует
cursor.execute("""
CREATE TABLE IF NOT EXISTS referrals (
    user_id INTEGER NOT NULL,
    ref_id INTEGER NOT NULL
)
""")

def start(update: Update, context: CallbackContext) -> None:
    ref_id = update.message.text.split()[1] if len(update.message.text.split()) > 1 else None
    if ref_id:
        # Записываем информацию о реферале в базу данных
        cursor.execute("INSERT INTO referrals (user_id, ref_id) VALUES (?, ?)", (update.effective_user.id, ref_id))
        conn.commit()
        context.bot.send_message(chat_id=update.effective_chat.id, text=f"Приветствую! Вас пригласил пользователь с ID: {ref_id}")
    else:
        context.bot.send_message(chat_id=update.effective_chat.id, text="Приветствую! Вы пришли сюда сами.")

def reflink(update: Update, context: CallbackContext) -> None:
    ref_id = update.effective_user.id
    ref_link = f"https://t.me/your_bot?start={ref_id}"
    context.bot.send_message(chat_id=update.effective_chat.id, text=f"Ваша реферальная ссылка: {ref_link}\nСкопируйте и поделитесь этой ссылкой с друзьями.")

def main() -> None:
    updater = Updater("TOKEN", use_context=True)

    dispatcher = updater.dispatcher

    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("reflink", reflink))

    updater.start_polling()

    updater.idle()

if __name__ == '__main__':
    main()

а ну и если вы так же хотите начислять 40% за первый платеж и 10% пожизненно то просто табличку создайте на свой вкус с балансами и юзеайте формулы крч вот

def process_payment(user_id, amount):
    # Проверяем, были ли уже платежи от этого пользователя
    cursor.execute("SELECT * FROM payments WHERE user_id = ?", (user_id,))
    previous_payments = cursor.fetchall()

    # Если это первый платеж, начисляем 40% комиссии
    if not previous_payments:
        commission = amount * 0.4
    # Если это не первый платеж, начисляем 10% комиссии
    else:
        commission = amount * 0.1

    # Начисляем комиссию рефереру
    cursor.execute("SELECT ref_id FROM referrals WHERE user_id = ?", (user_id,))
    ref_id = cursor.fetchone()
    if ref_id:
        cursor.execute("UPDATE users SET balance = balance + ? WHERE id = ?", (commission, ref_id))

    # Записываем информацию о платеже в базу данных
    cursor.execute("INSERT INTO payments (user_id, amount) VALUES (?, ?)", (user_id, amount))
    conn.commit()

Пример бота и реализация

https://t.me/blacktemple_space

© Habrahabr.ru