diumenge, 28 de gener de 2018

Bot Telegram 2: cosetes útils


En el passat post vam veure com crear un bot de Telegram programat en python. Ara veurem algunes coses que ens poden ser útils.

A la funció start d'inici de bot se li passen 2 paràmetres: bot i update
Bot té les dades del bot:
Ex:
{'username': u'ElJordifaBIBot', 'first_name': u'ElJordifaBIBot', 'id': 515033793}

I update té els dades de l'usuari:
Ex:
{'message': {'delete_chat_photo': False, 'new_chat_photo': [], 'from': {'first_name': u'Jordi', 'is_bot': False, 'id': 353926538, 'language_code': u'es-ES'}, 'text': u'/start', 'caption_entities': [], 'entities': [{'length': 6, 'type': u'bot_command', 'offset': 0}], 'channel_chat_created': False, 'new_chat_members': [], 'supergroup_chat_created': False, 'chat': {'first_name': u'Jordi', 'type': u'private', 'id': 353926538}, 'photo': [], 'date': 1517151466, 'group_chat_created': False, 'message_id': 12, 'new_chat_member': None}, 'update_id': 541194784}

De l'update podem extrure informació molt útil com el:
    - update.message.chat.id: és l'id del chat, és sempre el mateix per usuari i ens permetrà identificar-lo. També ens permetrà enviar-li missatges al seu telegram. Per exemple, per respondre a una acció o bé per enviar un missatge en boradcast a tots els usuaris connectats.
    - update.message.chat.first_name: és el nom de l'usuari, per referir-nos a ell.
    etc.
   

És útil anar guardant els chats_id en un diccionari de python amb informació de l'estat de cada usuari per després poder interaccionar-hi. Al diccionari pot ser útil guardar, a més de chat_id, l'step de l'aplicació on està l'usuari i d'on ve, per tal de saber quin menú mostrar o com anar en darrera, quines seleccions ha anat fent durant el menú, etc.
Si volem mantenir aquesta informació permanent l'haurem de guardar també en una BBDD, però alerta, això ens provocarà que el bot vagi més lent. Si no necessitem guardar la informació permanentment i en tenim prou en saber els usuaris actius des que hem engegat l'aplicació al nostre servidor amb un diccionari ja en tenim prou.

Aquí teniu un exemple d'ús del diccionari:

userDict = {0:{"step":"", "laststep":"", "chatid":0, "name":""}}

def start(bot, update):
    print("Ja som dins")
    userDict[update.message.chat.id]={"step":"Start","chatid":update.message.chat_id, "name":update.message.chat.first_name}
    bot.send_message(chat_id=update.message.chat.id, text="Hola *: "+userDict[update.message.chat.id]["name"]+"*", parse_mode=telegram.ParseMode.MARKDOWN)       
    keyboard = [[InlineKeyboardButton("El meu primer BOT", callback_data='IRES'),
                 InlineKeyboardButton("Un altre botó per pantalla", callback_data='CRES')],[InlineKeyboardButton("El tercer botó", callback_data='ICEN')]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text('Trieu una opció:',reply_markup=reply_markup)  
 

      
En aquest script també utilitzem bot.send_message per escriure el nom de l'usuari al chat de telegram.

Al codi anterior invocàvem a 2 funcions més:
    - button: que és on anirem quan es premi un InlineButton
    - Other: que és on anirem quan l'usuari escrigui text al chat.
   
Aquestes 2 funcions també tenen com a paràmetres bot i update.
    En la funció button utilitzarem:
        - update.callback_query.from_user.id: per saber el chat_id
        - update.callback_query.data: per saber l'identificador del botó premut (IRES, CRES, ICEN en el programa d'exemple)
       
    En la funció other utilitzarem:
        - update.message.from_user.id: per saber el chat_id
        - update.message.text: per saber el text escrit



       
A partir d'aquí ja podrem anar creant accions diferents segons el que escrigui l'usuari o el botó que premi, i anar canviant els botons de menú segons l'opció escollida. És recomanable anar guardant aquests valors al diccionari d'usuaris que hem creat en el botó start.

A partir d'aquí imaginació al poder, ja podeu crear els vostres bots amb tota la potència que us dóna python. Aneu en compte sempre amb el rendiment! A l'usuari no li agrada esperar.

Un parell de llibreries útils:
    - emoji (pip install emoji --upgrade) per escriure emojis a telegram (ex. emojize(":kissing_closed_eyes:", use_aliases=True))
    - sqlite3 per guardar les dades a bbdd
   
   
   
   
   
   



Cap comentari:

Publica un comentari