In Python geschriebene Analytics for Telegram-Bots

Im Moment hat der Boom bei der Erstellung von Telegramm-Bots allmählich nachgelassen, aber das Thema ihrer Erstellung verliert nicht an Relevanz. Viele Bibliotheken wurden geschrieben, um die Interaktion mit der Telegramm-Bot-API zu erleichtern, aber nach dem Erstellen des Bots habe ich immer noch kein Skript (Bibliothek) gefunden, um die Bot-Statistiken abzurufen. Aus diesem Grund habe ich beschlossen, ein Skript für alle Bots in Python zu schreiben. Wir erhalten Statistiken, indem wir Benutzeraktionen protokollieren und Protokolle auf bequeme Weise verarbeiten.

Umweltanforderungen


Um das Skript verwenden zu können, müssen Sie die folgenden Bibliotheken installieren:

pip install datetime
pip install pandas

Wie kann ich Analytics in Ihren Bot einbetten?


Laden Sie das py-Skript aus dem Repository für Ihr Betriebssystem und die Datei data.csv herunter. Legen Sie sie in den Ordner, in dem sich Ihr Bot befindet.

Fügen Sie nach dem Verbinden der in der Datei verwendeten Bibliotheken mit dem Bot-Body die folgende Zeile hinzu:

import tg_analytic

Nach den Bot-Befehlen hinzufügen:

tg_analytic.statistics(<id >, <>)

Wenn Sie die Telebot-Bibliothek verwenden, sollte sie folgendermaßen aussehen:


Um Statistiken direkt vom Bot zu erhalten, müssen Sie außerdem message_handler hinzufügen (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)

Das Schlüsselwort muss erfunden und eingegeben werden, damit nur Sie die Statistiken Ihres Bots anzeigen können. Der Telegramm-Bot mit den bereits implementierten Analysen wird ebenfalls im Repository gespeichert, sodass Sie sich anhand eines Beispiels mit dem Verbinden vertraut machen können.

Welche Befehle zum Abrufen von Statistiken verwenden?


Das Schlüsselwort wäre beispielsweise "Statistik":

    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)

Der Hauptteil des Bot-Befehls lautet wie folgt:
Statistik <Anzahl der Tage> <Anforderungsparameter * >>

* - Es gibt Teams: "Benutzer", "Teams" und "tkht". Kann gleichzeitig verwendet werden. "Benutzer" gibt Statistiken über Personen für die erforderliche Anzahl von Tagen an. "Teams" gibt Statistiken über Teams für die Anzahl der Tage an, die Sie benötigen. Wenn Sie txt angeben, erhalten Sie eine Datei, andernfalls erfolgt die Antwort in einem Telegramm.

Beispiel für die Verwendung von Befehlen


Statistik 2 Teambenutzer


Statistik 2 Teams


Statistik 2 Benutzer des Teams


Woraus besteht ein Skript?


Wenn Sie nicht an dem Skript interessiert sind, können Sie den Artikel bereits zu diesem Zeitpunkt lesen und mit der Implementierung in Ihrem Bot beginnen.

Der erste Teil des Skripts protokolliert Benutzeraktionen. Ich habe beschlossen, nur das Datum, die Benutzer-ID und den von ihm verwendeten Befehl zu speichern:

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

Der zweite Teil ist die Verarbeitung von Daten auf Abruf und die Ausgabe der erforderlichen Statistiken. Wir lesen Daten von CSV in Pandas, gruppieren nach Benutzern und Befehlen:

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

Die Antwort an den Benutzer basiert auf den Daten aus dem vorherigen Schritt:


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

Am Ende überprüfen wir nach dem Verfassen der Antwortnachricht die Anforderung des Benutzers auf das Vorhandensein des Befehls "txt", um zu entscheiden, in welchem ​​Format geantwortet werden soll:

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

Fazit


Das Skript wird getestet und funktioniert im normalen Modus. Wenn Sie interessiert sind, wie es wirklich auf einem Bot funktioniert, können Sie jeden meiner Bots testen: @exchange_minsk_bot, @pogoda_belarus_bot, @fast_translate_bot.

Stichwort: "Statistik".

Viel Spaß!

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


All Articles