Analytics untuk bot Telegram ditulis dengan Python

Saat ini, boom dalam penciptaan bot telegram telah mulai memudar, tetapi tema penciptaan mereka tidak kehilangan relevansi. Banyak perpustakaan telah ditulis untuk memfasilitasi interaksi dengan API Bot Telegram, tetapi setelah membuat bot saya tidak menemukan skrip (perpustakaan) untuk mendapatkan statistik bot. Oleh karena itu, saya memutuskan untuk menulis naskah untuk semua bot dengan Python. Kami akan menerima statistik dengan mencatat tindakan pengguna dan memproses log dengan cara yang mudah.

Persyaratan lingkungan


Untuk menggunakan skrip, Anda perlu menginstal perpustakaan berikut:

pip install datetime
pip install pandas

Bagaimana cara menanamkan analitik ke bot Anda?


Unduh skrip py dari repositori untuk file OS dan data.csv Anda. Tempatkan mereka di folder tempat bot Anda berada.

Setelah menghubungkan pustaka yang Anda gunakan dalam file dengan tubuh bot, tambahkan baris:

import tg_analytic

Setelah perintah bot tambahkan:

tg_analytic.statistics(<id >, <>)

Jika Anda menggunakan perpustakaan telebot, maka akan terlihat seperti ini:


Juga, untuk mendapatkan statistik langsung dari bot, Anda perlu menambahkan ke 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)

Kata kunci perlu diciptakan dan dimasukkan sehingga hanya Anda yang dapat melihat statistik bot Anda. Bot telegram dengan analitik yang sudah diterapkan juga disimpan dalam repositori sehingga Anda dapat membiasakan diri dengan cara menghubungkannya menggunakan contoh.

Perintah apa yang digunakan untuk mendapatkan statistik?


Misalnya, kata kunci akan menjadi "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)

Isi perintah bot adalah sebagai berikut:
statistik <jumlah hari> <parameter permintaan * >>

* - Ada tim: "pengguna", "tim" dan "tkht". Dapat digunakan secara bersamaan. "Pengguna" memberikan statistik orang untuk jumlah hari yang diperlukan. "Tim" memberikan statistik tentang tim untuk jumlah hari yang Anda butuhkan. Saat menentukan txt, Anda akan menerima file, jika tidak jawabannya ada dalam telegram.

Contoh penggunaan perintah


Statistik 2 pengguna tim


Tim Statistik 2


Statistik 2 pengguna tim


Terdiri dari apa sebuah skrip?


Secara umum, jika Anda tidak tertarik dengan skrip, maka sudah pada tahap ini Anda dapat selesai membaca artikel dan mulai mengimplementasikannya di bot Anda.

Bagian pertama dari skrip adalah mencatat tindakan pengguna. Saya memutuskan untuk hanya menyimpan tanggal, id pengguna dan perintah yang digunakan olehnya:

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

Bagian kedua adalah pemrosesan data sesuai permintaan dan output dari statistik yang diperlukan. Kami membaca data dari csv di Pandas, dikelompokkan berdasarkan pengguna dan perintah:

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

Respons terhadap pengguna didasarkan pada data dari langkah sebelumnya:


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

Pada akhirnya, setelah menyusun pesan respons, kami memeriksa permintaan pengguna untuk kehadiran perintah "txt" untuk memutuskan dalam format apa yang akan ditanggapi:

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

Kesimpulan


Skrip diuji dan berfungsi dalam mode normal. Jika Anda tertarik untuk melihat cara kerjanya di bot, Anda dapat menguji bot saya: @exchange_minsk_bot, @pogoda_belarus_bot, @fast_translate_bot.

Kata kunci: "statistik".

Selamat menikmati!

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


All Articles