Sistema de referidos en bots de Telegram

¡Hola a todos! Seguro que has visto en varios bots un enlace de referencia como https://t.me/ <username_bot>? Start = <number>. Por lo general, el ID de Telegram del remitente se indica como un número. En este artículo, explicaré cómo manejar dichos enlaces en mi bot.





Para desarrollar bots, utilizo la biblioteca Python pytelegrambotapi.





Omitiré el proceso de creación de un bot a través de @BotFather , procederé directamente al código. Hay un archivo config.py



con la variable TOKEN, que almacena el token del bot. bot.py



"Químicaremos" el archivo . Escribamos un controlador para el comando / start y visualicemos todo lo que está almacenado en el objeto de mensaje.





import telebot

import config

bot = telebot.TeleBot(config.TOKEN)


@bot.message_handler(commands=["start"])
def start_command_handler(msg):
    print(msg)


if __name__ == '__main__':
    bot.polling(none_stop=True)

      
      



'text': '/start'.



https://t.me/<_>?start=test 10- print(msg.text)







/start test



. , msg.text



, .





. , /start , /start



. ( /start test



). ID .





@bot.message_handler(commands=["start"])
def start_command_handler(msg):
    user_id = msg.from_user.id
    referrer = None

    if " " in msg.text:
        referrer_candidate = msg.text.split()[1]
				#  
      
      



https://t.me/<_>?start=test test2, test2 msg.text, , , test2 . msg.text



. , . (msg.text.split()



), ( , , ?).





, . , , . - "" , ID - . .





@bot.message_handler(commands=["start"])
def start_command_handler(msg):
    user_id = msg.from_user.id
    referrer = None

    #    -    
    if " " in msg.text:
        referrer_candidate = msg.text.split()[1]

        #     
        try:
            referrer_candidate = int(referrer_candidate)
						#  
        except ValueError:
            pass
      
      



, try... except



int()



. referer



, int()



ValueError







referer . : int()



"-101" -101. referer . , .





TG ID. , . . ID , user_id = msg.from_user.id







@bot.message_handler(commands=["start"])
def start_command_handler(msg):
    user_id = msg.from_user.id
    referrer = None

    #    -    
    if " " in msg.text:
        referrer_candidate = msg.text.split()[1]

        #     
        try:
            referrer_candidate = int(referrer_candidate)

            #    TG ID  TG ID 
            if user_id != referrer_candidate:
              #  
							pass

        except ValueError:
            pass
      
      



, get_all_users(), . , , .





@bot.message_handler(commands=["start"])
def start_command_handler(msg):
    user_id = msg.from_user.id
    referrer = None

    #    -    
    if " " in msg.text:
        referrer_candidate = msg.text.split()[1]

        #     
        try:
            referrer_candidate = int(referrer_candidate)

            #    TG ID  TG ID 
            #  ,       
            if user_id != referrer_candidate and referrer_candidate in get_all_users():
                referer = referrer_candidate

        except ValueError:
            pass
      
      



¿Qué se debe hacer si el usuario ya tiene un referente? Después de todo, no daremos una bonificación por la referencia referida cada vez que use un enlace de referencia, simplemente nos arruinará. Por lo tanto, es necesario emitir un cheque. Escribamos una función has_referrer()



que devolverá True si el usuario tiene una referencia y False si no la tiene. Es lógico escribirlo al principio para optimizarlo.





@bot.message_handler(commands=["start"])
def start_command_handler(msg):
    user_id = msg.from_user.id
    #      
    if not has_referrer():
        referrer = None

        #    -    
        if " " in msg.text:
            referrer_candidate = msg.text.split()[1]

            #     
            try:
                referrer_candidate = int(referrer_candidate)

                #    TG ID  TG ID 
                #  ,       
                if user_id != referrer_candidate and referrer_candidate in get_all_users():
                    referer = referrer_candidate

            except ValueError:
                pass
      
      



¡Espero que este artículo le resulte útil!








All Articles