Análisis para bots de Telegram escritos en Python

Por el momento, el auge en la creación de bots de telegramas ha comenzado a desvanecerse, pero el tema de su creación no pierde relevancia. Se han escrito muchas bibliotecas para facilitar la interacción con la API de Bot de Telegram, pero después de crear el bot no encontré un script (biblioteca) para obtener las estadísticas del bot. Por lo tanto, decidí escribir un script para todos los bots en Python. Recibiremos estadísticas registrando las acciones de los usuarios y procesando registros de manera conveniente.

Requisitos medioambientales


Para usar la secuencia de comandos, debe instalar las siguientes bibliotecas:

pip install datetime
pip install pandas

¿Cómo incrustar análisis en tu bot?


Descargue el script py desde el repositorio para su sistema operativo y el archivo data.csv. Colóquelos en la carpeta donde se encuentra su bot.

Después de conectar las bibliotecas que usa en el archivo con el cuerpo del bot, agregue la línea:

import tg_analytic

Después de que los comandos del bot agreguen:

tg_analytic.statistics(<id >, <>)

Si está utilizando la biblioteca telebot, debería verse así:


Además, para obtener estadísticas directamente desde el bot, debe agregar a message_handler (content_types = ['text']):

if message.text[:(  )] == '< >':
        st = message.text.split(' ')
        if 'txt' in st or '' in st:
            tg_analytic.analysis(st,message.chat.id)
            with open('%s.txt' %message.chat.id ,'r',encoding='UTF-8') as file:
                bot.send_document(message.chat.id,file)
                tg_analytic.remove(message.chat.id)
        else:
            messages = tg_analytic.analysis(st,message.chat.id)
            bot.send_message(message.chat.id, messages)

La palabra clave necesita ser inventada e ingresada para que solo usted pueda ver las estadísticas de su bot. El bot de telegramas con el análisis ya implementado también se almacena en el repositorio para que pueda familiarizarse con cómo conectarlo usando un ejemplo.

¿Qué comandos usar para obtener estadísticas?


Por ejemplo, la palabra clave sería "estadísticas":

    if message.text[:10] == '' or message.text[:10] == 'C':
        st = message.text.split(' ')
        if 'txt' in st or '' in st:
            tg_analytic.analysis(st,message.chat.id)
            with open('%s.txt' %message.chat.id ,'r',encoding='UTF-8') as file:
                bot.send_document(message.chat.id,file)
                tg_analytic.remove(message.chat.id)
        else:
            messages = tg_analytic.analysis(st,message.chat.id)
            bot.send_message(message.chat.id, messages)

El cuerpo del comando bot es el siguiente:
estadísticas <número de días> <parámetros de solicitud * >>

* - Hay equipos: "usuarios", "equipos" y "tkht". Se puede usar simultáneamente. "Usuarios" proporciona estadísticas sobre las personas durante el número de días requerido. "Equipos" proporciona estadísticas sobre los equipos para la cantidad de días que necesita. Al especificar txt, recibirá un archivo; de lo contrario, la respuesta estará en un telegrama.

Ejemplo de uso de comando


Estadísticas 2 usuarios del equipo


Estadísticas 2 equipos


Estadísticas 2 usuarios del equipo


¿En qué consiste un guión?


En general, si no está interesado en el script, ya en esta etapa puede terminar de leer el artículo y comenzar a implementarlo en su bot.

La primera parte del script es registrar las acciones del usuario. Decidí guardar solo la fecha, la identificación de usuario y el comando utilizado por él:

def statistics(user_id, command):
    data = datetime.datetime.today().strftime("%Y-%m-%d")
    with open('data.csv', 'a', newline="", encoding='UTF-8') as fil:
        wr = csv.writer(fil, delimiter=';')
        wr.writerow([data, user_id, command])

La segunda parte es el procesamiento de datos a pedido y la producción de las estadísticas necesarias. Leemos datos de csv en Pandas, agrupados por usuarios y comandos:

season = int(bid[1])
#   Dataframe
df = pd.read_csv('data.csv', delimiter=';', encoding='utf8')
#     
number_of_users = len(df['id'].unique())
number_of_days = len(df['data'].unique())
#      
df_user = df.groupby(['data', 'id']).count().reset_index().groupby('data').count().reset_index()
list_of_dates_in_df_user = list(df_user['data'])
list_of_number_of_user_in_df_user = list(df_user['id'])
list_of_dates_in_df_user = list_of_dates_in_df_user[-season:]
list_of_number_of_user_in_df_user = list_of_number_of_user_in_df_user[-season:]
#      
df_command = df.groupby(['data', 'command']).count().reset_index()
unique_commands = df['command'].unique()
commands_in_each_day = []
list_of_dates_in_df_command = list(df_command['data'])
list_of_number_of_user_in_df_command = list(df_command['id'])
list_of_name_of_command_in_df_command = list(df_command['command'])
commands_in_this_day = dict()
for i in range(len(list_of_dates_in_df_command)):
     commands_in_this_day[list_of_name_of_command_in_df_command[i]] = list_of_number_of_user_in_df_command[i]
     if i + 1 >= len(list_of_dates_in_df_command) or list_of_dates_in_df_command[i] != list_of_dates_in_df_command[i + 1]:
     commands_in_each_day.append(commands_in_this_day)
     commands_in_this_day = dict()
commands_in_each_day = commands_in_each_day[-season:]

La respuesta al usuario se basa en los datos del paso anterior:


message_to_user = '    %s %s: \n' % (season, day_type.get(season, ''))
message_to_user += '    %s %s: \n' % (number_of_days, day_type.get(season, ''))
if season > number_of_days:
     season = number_of_days
     message_to_user += '    , \n' \
                        '      \n'
if '' in bid:
    message_to_user += '    : ' + '%s' % number_of_users \
    + ' %s ' % users_type.get(number_of_users, '') + '\n' \
    '   %s %s: \n' % (season, day_type.get(season, ''))
    for days, number, comm_day in zip(list_of_dates_in_df_user, list_of_number_of_user_in_df_user, 
    commands_in_each_day):
      message_to_user += ':%s :%d   :%s\n' % (days, number, comm_day.get('/start', 0))
if '' in bid:
    message_to_user += '    %s %s: \n' %  
    (season,day_type.get(season, ''))
    for days, commands in zip(list_of_dates_in_df_user, commands_in_each_day):
       message_to_user += ':%s\n' % days
       for i in unique_commands:
           if i in commands:
                message_to_user += '%s - %s \n' % (i, commands.get(i))
          else:
                message_to_user += '%s - 0 \n' % i

Al final, después de redactar el mensaje de respuesta, verificamos la solicitud del usuario de la presencia del comando "txt" para decidir en qué formato responder:

if 'txt' in bid or '' in bid:
    with open('%s.txt' % user_id, 'w', encoding='UTF-8') as fil:
        fil.write(message_to_user)
        fil.close()
    else:
        return message_to_user

Conclusión


El script se prueba y funciona en modo normal. Si está interesado en ver cómo funciona realmente en un bot, puede probar en cualquiera de mis bots: @exchange_minsk_bot, @pogoda_belarus_bot, @fast_translate_bot.

Palabra clave: "estadísticas".

Que tengas un buen uso!

Source: https://habr.com/ru/post/undefined/


All Articles