
Apakah Anda memiliki tugas yang diulang hari demi hari, dari minggu ke minggu? Misalnya, menulis laporan. Anda meminta data, melakukan analisis, memvisualisasikan (membuat grafik, bagan), dan kemudian mengirimkannya ke bos. Tetapi bagaimana jika semua ini dilakukan secara otomatis?
Dalam tutorial ini, kami akan membuat bot untuk Telegram yang akan membantu mengotomatiskan pelaporan. Dan yang paling keren adalah seluruh program hanya terdiri dari 50 baris kode! Jika Anda membuat bot untuk Telegram untuk pertama kalinya, maka Anda harus membaca
posting ini di
sini .
Skillbox merekomendasikan: Pengembang Python langsung dari awal .
Kami mengingatkan Anda: untuk semua pembaca "Habr" - diskon 10.000 rubel saat mendaftar untuk kursus Skillbox apa pun menggunakan kode promo "Habr".
Turun
Instal perpustakaanKami akan menggunakan
google-cloud-bigquery untuk mengambil data dari Google BigQuery.
matplotlib ,
numpy dan
panda akan membantu memvisualisasikan data.
python-telegram-bot akan mengirim data yang sudah selesai ke Telegram.
pip3 instal google-cloud-bigquery matplotlib pand numpy python-telegram-botHubungkan Google BigQuery APIJika kami ingin menggunakan layanan ini, kami harus menghubungkan API Google BigQuery. Untuk melakukannya, buka
Google Developers Console dan buat proyek baru (atau pilih yang sudah ada).
Di panel kontrol, pilih AKTIFKAN LAYANAN DAN LAYANAN dan cari BigQuery API.

Pilih Aktifkan untuk menghubungkan API.
Buat kunci akunKami kembali ke
Google Developers Console , pilih tab Kredensial, Buat kredensial, dan kunci akun Layanan.
Lalu - Akun layanan baru, dan di bidang Nama akun layanan, masukkan namanya.
Dari daftar turun bawah Peran, pilih Proyek> Pemilik, lalu Buat.

File yang akan dimuat secara otomatis disebut creds.json.
Kami mengekspos GOOGLE_APPLICATION_CREDENTIALS, yang menunjukkan jalur ke creds.json di terminal.
export GOOGLE_APPLICATION_CREDENTIALS = '[PATH_TO_CREDS.JSON]'Jika semuanya berjalan dengan baik, saatnya untuk mulai menulis sebuah program.
Pembuatan aplikasi
Untuk tutorial kami akan menggunakan data dari bigquery-public-data.stackoverflow, untuk laporan kami, kami akan memilih jumlah publikasi harian.
Semuanya cukup sederhana.
Permintaan tabel -> Visualisasikan data -> Simpan visualisasi -> Kirim gambar
Mari kita buat satu fungsi untuk mendefinisikan setiap utas.
Permintaan ke BigQueryPertama, impor perpustakaan.
dari google.cloud mengimpor bigqueryBuat fungsi yang disebut query_to_bigquery, di mana parameternya adalah kueri.
def query_to_bigquery(query): client = bigquery.Client() query_job = client.query(query) result = query_job.result() dataframe = result.to_dataframe() return dataframe
Fungsi ini akan mengembalikan permintaan sebagai bingkai data.
Visualisasikan dataUntuk mengatasi masalah ini, pilih matplotlib.
impor matplotlib.pyplot sebagai pltKita memerlukan lima parameter, di mana x adalah data pada sumbu x, x_label adalah nama untuk sumbu, y adalah data untuk sumbu y, y_label adalah nama untuk sumbu dan judul adalah judul dari keseluruhan visualisasi.
def visualize_bar_chart(x, x_label, y, y_label, title): plt.title(title) plt.xlabel(x_label) plt.ylabel(y_label) index = np.arange(len(x)) plt.xticks(index, x, fontsize=5, rotation=30) plt.bar(index, y) return plt
Simpan gambarSekarang mari kita gunakan dua fungsi untuk membuat visualisasi dan menyimpannya.
Kami akan mengirimkan jumlah posting yang diterbitkan setiap hari. Pertama, kami menulis permintaan.
query = """ SELECT DATE(creation_date) date, COUNT(*) total_posts FROM `bigquery-public-data.stackoverflow.post_history` GROUP BY 1 HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY) ORDER BY 1 """
Kueri membantu mengumpulkan data selama dua minggu mulai 2 Desember 2018.
Kami menggunakan tanggal ini karena 2018-12-02 adalah data terbaru yang direkam dalam bigquery-public-data.stackoverflow.post_history, dalam kasus lain Anda dapat menggunakan CURRENT_DATE () untuk mendapatkan data terbaru.
Panggil fungsi query_to_bigquery untuk mendapatkan data.
dataframe = query_to_bigquery (permintaan)Kemudian gunakan kolom tanggal untuk sumbu x, dan kolom total_post untuk sumbu y.
x = dataframe ['date']. tolist ()
y = dataframe ['total_posts']. tolist ()Kami memvisualisasikan menggunakan fungsi visualize_bar_chart dan menyimpannya sebagai gambar.
plt = visualize_bar_chart (x = x, x_label = 'Tanggal', y = y, y_label = 'Total Posting', title = 'Tulisan Harian')
plt.savefig ('viz.png')Kami membungkus kode ini dalam fungsi yang disebut get_and_save_image.
def get_and_save_image(): query = """ SELECT DATE(creation_date) date, COUNT(*) total_posts FROM `bigquery-public-data.stackoverflow.post_history` GROUP BY 1 HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY) ORDER BY 1 """ dataframe = query_to_bigquery(query) x = dataframe['date'].tolist() y = dataframe['total_posts'].tolist() plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts') plt.savefig('viz.png')
Kirim gambarUntuk mengirim laporan kepada penerima, Anda perlu mengetahui parameter chat_id.
Kami menggunakan
userinfobot dan ketik / mulai. Bot merespons dengan informasi yang diperlukan, chat_id terkandung dalam bidang id.
Sekarang buat fungsi send_image. Ini akan menggunakan fungsi get_and_save_image untuk mengambil dan menyimpan gambar. Dan kemudian kami mengirim semuanya ke kontak yang benar.
def send_image(bot, update): get_and_save_image() chat_id = 'CHAT_ID_RECEIVER' bot.send_photo(chat_id=chat_id, photo=open('viz.png','rb'))
Program utamaAkhirnya, buat fungsi lain, utama, untuk meluncurkan aplikasi. Jangan lupa untuk mengubah YOUR_TOKEN untuk bot.
Ingat: program ini akan mengirim gambar secara otomatis pada waktu yang Anda tentukan. Misalnya, kami akan mengirim laporan pada jam sembilan pagi setiap hari.
def main(): updater = Updater('YOUR_TOKEN') updater.job_queue.run_daily(send_image, time=datetime.datetime.strptime('9:00AM', '%I:%M%p').time(), days=(0,1,2,3,4,5,6)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
Akibatnya, aplikasi kita akan terlihat seperti ini:
from google.cloud import bigquery from telegram.ext import Updater import matplotlib.pyplot as plt import numpy as np import datetime def query_to_bigquery(query): client = bigquery.Client() query_job = client.query(query) result = query_job.result() dataframe = result.to_dataframe() return dataframe def visualize_bar_chart(x, x_label, y, y_label, title): plt.title(title) plt.xlabel(x_label) plt.ylabel(y_label) index = np.arange(len(x)) plt.xticks(index, x, fontsize=5, rotation=30) plt.bar(index, y) return plt def get_and_save_image(): query = """ SELECT DATE(creation_date) date, COUNT(*) total_posts FROM `bigquery-public-data.stackoverflow.post_history` GROUP BY 1 HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY) ORDER BY 1 """ dataframe = query_to_bigquery(query) x = dataframe['date'].tolist() y = dataframe['total_posts'].tolist() plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts') plt.savefig('viz.png') def send_image(bot, update): get_and_save_image() chat_id = 'CHAT_ID_RECEIVER' bot.send_photo(chat_id=chat_id, photo=open('viz.png', 'rb')) def main(): updater = Updater('YOUR_TOKEN') updater.job_queue.run_daily(send_image, time=datetime.datetime.strptime('9:00AM', '%I:%M%p').time(), days=(0,1,2,3,4,5,6)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
Simpan file dan beri nama main.py.
Kami meluncurkan aplikasi dengan memasukkan perintah di terminal:
python3 main.pySemuanya sudah siap. Sekarang kami memiliki robot yang terdiri dari 50 baris kode yang menghasilkan laporan tanpa campur tangan kami.
Mari kita periksa bot
dari sini dengan memilih perintah / send.

Anda bisa mendapatkan kode yang sudah jadi di
GitHub saya .
Skillbox merekomendasikan: