Analytics para bots de telegrama escritos em Python

No momento, o boom na criação de bots de telegrama começou a desaparecer, mas o tema de sua criação não perde relevância. Muitas bibliotecas foram escritas para facilitar a interação com a API do Telegram Bot, mas depois de criar o bot ainda não encontrei um script (biblioteca) para obter as estatísticas do bot. Portanto, decidi escrever um script para todos os bots em Python. Receberemos estatísticas registrando ações do usuário e processando logs de maneira conveniente.

Requerimentos ambientais


Para usar o script, você precisa instalar as seguintes bibliotecas:

pip install datetime
pip install pandas

Como incorporar análises no seu bot?


Faça o download do script py do repositório para o seu sistema operacional e o arquivo data.csv. Coloque-os na pasta onde seu bot está localizado.

Depois de conectar as bibliotecas que você usa no arquivo com o corpo do bot, adicione a linha:

import tg_analytic

Após os comandos bot, adicione:

tg_analytic.statistics(<id >, <>)

Se você estiver usando a biblioteca de telebot, ela deve ficar assim:


Além disso, para obter estatísticas diretamente do bot, você precisa adicionar ao 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)

A palavra-chave precisa ser inventada e inserida para que somente você possa visualizar as estatísticas do seu bot. O bot de telegrama com a análise já implementada também é armazenado no repositório para que você possa se familiarizar com a forma de conectá-lo usando um exemplo.

Quais comandos usar para obter estatísticas?


Por exemplo, a palavra-chave seria "estatí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)

O corpo do comando bot é o seguinte:
estatísticas <número de dias> <parâmetros de solicitação * >>

* - Existem equipes: "usuários", "equipes" e "tkht". Pode ser usado simultaneamente. "Usuários" fornece estatísticas sobre pessoas para o número de dias necessário. "Equipes" fornece estatísticas sobre as equipes para o número de dias que você precisa. Ao especificar txt, você receberá um arquivo, caso contrário, a resposta estará em um telegrama.

Exemplo de uso de comando


Estatísticas 2 usuários da equipe


Estatísticas 2 equipes


Estatísticas 2 usuários da equipe


Em que consiste um script?


Em geral, se você não estiver interessado no script, então, nesse estágio, poderá terminar de ler o artigo e começar a implementá-lo no seu bot.

A primeira parte do script é registrar ações do usuário. Decidi salvar apenas a data, o ID do usuário e o comando usado por ele:

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])

A segunda parte é o processamento de dados sob demanda e a saída das estatísticas necessárias. Lemos dados do csv no Pandas, agrupamos por usuários e 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:]

A resposta ao usuário é baseada nos dados da etapa 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

No final, depois de escrever a mensagem de resposta, verificamos a solicitação do usuário quanto à presença do comando "txt" para decidir em qual 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

Conclusão


O script é testado e funciona no modo normal. Se você estiver interessado em ver como ele realmente funciona em um bot, você pode testar em qualquer um dos meus bots: @exchange_minsk_bot, @pogoda_belarus_bot, @fast_translate_bot.

Palavra-chave: "estatísticas".

Tenha um bom uso!

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


All Articles