Analytique pour les robots Telegram écrits en Python

À l'heure actuelle, l'essor de la création de robots télégrammes a commencé à s'estomper, mais le thème de leur création ne perd pas de sa pertinence. De nombreuses bibliothèques ont été écrites pour faciliter l'interaction avec l'API Telegram Bot, mais après avoir créé le bot, je n'ai toujours pas trouvé de script (bibliothèque) pour obtenir les statistiques du bot. Par conséquent, j'ai décidé d'écrire un script pour tous les bots en Python. Nous recevrons des statistiques en enregistrant les actions des utilisateurs et en traitant les journaux de manière pratique.

Exigences environnementales


Pour utiliser le script, vous devez installer les bibliothèques suivantes:

pip install datetime
pip install pandas

Comment intégrer des analyses dans votre bot?


Téléchargez le py-script à partir du référentiel de votre système d'exploitation et du fichier data.csv. Placez-les dans le dossier où se trouve votre bot.

Après avoir connecté les bibliothèques que vous utilisez dans le fichier avec le corps du bot, ajoutez la ligne:

import tg_analytic

Après les commandes du bot, ajoutez:

tg_analytic.statistics(<id >, <>)

Si vous utilisez la bibliothèque telebot, elle devrait ressembler à ceci:


De plus, pour obtenir des statistiques directement à partir du bot, vous devez ajouter à 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)

Le mot-clé doit être inventé et saisi afin que vous seul puissiez voir les statistiques de votre bot. Le bot de télégramme avec les analyses déjà implémentées est également stocké dans le référentiel, afin que vous puissiez vous familiariser avec la façon de le connecter à l'aide d'un exemple.

Quelles commandes utiliser pour obtenir des statistiques?


Par exemple, le mot clé serait "statistiques":

    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)

Le corps de la commande bot est le suivant:
statistiques <nombre de jours> <paramètres de demande * >>

* - Il existe des équipes: "utilisateurs", "équipes" et "tkht". Peut être utilisé simultanément. "Utilisateurs" donne des statistiques sur les personnes pour le nombre de jours requis. «Équipes» donne des statistiques sur les équipes pour le nombre de jours dont vous avez besoin. Lorsque vous spécifiez txt, vous recevrez un fichier, sinon la réponse est dans un télégramme.

Exemple d'utilisation des commandes


Statistiques 2 utilisateurs de l'équipe


Statistiques 2 équipes


Statistiques 2 utilisateurs de l'équipe


En quoi consiste un script?


En général, si vous n'êtes pas intéressé par le script, à ce stade, vous pouvez déjà terminer la lecture de l'article et commencer à l'implémenter dans votre bot.

La première partie du script enregistre les actions des utilisateurs. J'ai décidé de ne sauvegarder que la date, l'ID utilisateur et la commande utilisée par lui:

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 deuxième partie est le traitement des données à la demande et la production des statistiques nécessaires. Nous lisons les données de csv dans Pandas, groupées par utilisateurs et commandes:

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 réponse à l'utilisateur est basée sur les données de l'étape précédente:


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

Au final, après avoir composé le message de réponse, nous vérifions la demande de l'utilisateur pour la présence de la commande «txt» afin de décider dans quel format répondre:

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

Conclusion


Le script est testé et fonctionne en mode normal. Si vous êtes intéressé à voir comment cela fonctionne vraiment sur un bot, vous pouvez tester sur n'importe lequel de mes bots: @exchange_minsk_bot, @pogoda_belarus_bot, @fast_translate_bot.

Mot-clé: "statistiques".

Bonne utilisation!

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


All Articles