
האם יש לך משימות שחוזרות על עצמן יום אחר יום, שבוע אחר שבוע? למשל, כתיבת דוחות. אתה מבקש נתונים, מנתחים אותם, מדמיינים אותם (יוצרים גרפים, תרשימים), ואז שולחים אותם לבוס שלך. אבל מה אם כל זה היה אוטומטי?
במדריך זה ניצור בוט לטלגרם שיעזור להפוך את הדיווח לאוטומטי. והדבר הכי מגניב הוא שהתוכנית כולה תהיה מורכבת מ-50 שורות קוד בלבד! אם אתה יוצר בוט עבור טלגרם בפעם הראשונה, עליך לקרוא גם את זה .
Skillbox ממליצה: קורס מעשי .
אנו מזכירים: לכל קוראי Habr - הנחה של 10 רובל בעת הרשמה לכל קורס Skillbox באמצעות קוד ההטבה של Habr.
בואו נתחיל
התקנת ספריות
אנחנו נשתמש כדי לקבל נתונים מ-Google BigQuery. , и יעזור לך לדמיין את הנתונים שלך. ישלח את הנתונים המוגמרים לטלגרם.
pip3 להתקין את google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
חיבור Google BigQuery API
אם אנחנו רוצים להשתמש בשירות, אנחנו צריכים לחבר את Google BigQuery API. כדי לעשות זאת אנחנו הולכים ל וצור פרויקט חדש (או בחר קיים).
בלוח הבקרה, בחר ENABLE APIS AND SERVICES וחפש את BigQuery API.

בחר הפעל כדי לחבר את ה-API.

צור מפתח חשבון
בוא נלך שוב , בחר בכרטיסייה אישורים, צור אישורים ומפתח חשבון שירות.
לאחר מכן - חשבון שירות חדש, והזן את השם בשדה שם חשבון שירות.
מהרשימה הנפתחת תפקיד, בחר פרויקט > בעלים ולאחר מכן צור.

הקובץ שיורד אוטומטית נקרא creds.json.
הגדר GOOGLE_APPLICATION_CREDENTIALS, ציון הנתיב אל creds.json בטרמינל.
ייצוא GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'
אם הכל הלך כשורה, הגיע הזמן להתחיל בכתיבת התוכנית.
צור אפליקציה
עבור המדריך נשתמש בנתונים מ-bigquery-public-data.stackoverflow, עבור הדוח שלנו נבחר את מספר הפרסומים היומיים.
הכל די פשוט.
שאילתה בטבלה -> הדמיין את הנתונים -> שמור את ההדמיה -> שלח את התמונה
בואו ניצור פונקציה אחת כדי להגדיר כל שרשור.
שאילתה ל-BigQuery
ראשית אנו מייבאים את הספרייה.
מ-google.cloud ייבוא bigquery
אנו יוצרים פונקציה בשם query_to_bigquery, כאשר הפרמטר הוא query.
def query_to_bigquery(query):
client = bigquery.Client()
query_job = client.query(query)
result = query_job.result()
dataframe = result.to_dataframe()
return dataframeפונקציה זו תחזיר את הבקשה כמסגרת נתונים.
הדמיית נתונים
כדי לפתור בעיה זו, בחר matplotlib.
יבוא matplotlib.pyplot כ- plt
אנחנו צריכים חמישה פרמטרים, כאשר x הוא נתוני ציר ה-x, x_label היא הכותרת של הציר, y היא נתוני ציר ה-y, y_label היא הכותרת של הציר, וכותרת היא הכותרת של ההדמיה כולה.
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שמור את התמונה
כעת נשתמש בשתי פונקציות כדי ליצור הדמיה ולשמור אותה.
אנו נשלח את מספר הפוסטים המתפרסמים מדי יום. ראשית נכתוב בקשה.
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
"""השאילתה עוזרת באיסוף נתונים למשך שבועיים החל מה-2 בדצמבר 2018.
אנו משתמשים בתאריך זה מכיוון ש-2018-12-02 הוא הנתונים העדכניים ביותר שתועדו ב-bigquery-public-data.stackoverflow.post_history, במקרים אחרים אתה יכול להשתמש ב-CURRENT_DATE() כדי לקבל את הנתונים החדשים ביותר.
התקשר לפונקציה query_to_bigquery כדי לקבל את הנתונים.
dataframe = query_to_bigquery(query)
לאחר מכן אנו משתמשים בעמודת נתוני התאריך עבור ציר ה-x, ובעמודת total_posts עבור ציר ה-y.
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
אנו מדמיינים אותו באמצעות הפונקציה visualize_bar_chart ושומרים אותו כתמונה.
plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')
אנו עוטפים את הקוד הזה בפונקציה שנקראת 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')שלח תמונה
על מנת לשלוח דוח לנמען, עליך לדעת את הפרמטר chat_id.
השתמש והקלד /start. הבוט מגיב עם המידע הדרוש, chat_id כלול בשדה id.
עכשיו בואו ניצור את הפונקציה send_image. זה ישתמש בפונקציה get_and_save_image כדי לאחזר ולשמור את התמונה. ואז אנחנו שולחים הכל לאיש הקשר הנכון.
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'))תוכנה ראשית
לבסוף, אנו יוצרים פונקציה נוספת, ראשית, להפעלת האפליקציה. אל תשכח לשנות את YOUR_TOKEN עבור הבוט.
זכור: תוכנית זו תשלח את התמונה באופן אוטומטי בזמן שתציין. למשל, נשלח דוח כל יום בתשע בבוקר.
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()כתוצאה מכך, היישום שלנו ייראה כך:
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()שמור את הקובץ וקרא לו main.py.
אנו מפעילים את האפליקציה על ידי הזנת הפקודה בטרמינל:
python3 main.py
הכל מוכן. כעת יש לנו רובוט המורכב מ-50 שורות קוד שמפיק דוחות ללא התערבותנו.
בוא נבדוק את הבוט על ידי בחירה בפקודה /send.

אתה יכול לקבל את הקוד המוגמר ב .
Skillbox ממליצה:
- קורס מעשי שנתיים .
- קורס מקוון .
- קורס מעשי בן שנה .
מקור: www.habr.com
