คุณมีงานที่ทำซ้ำวันแล้ววันเล่า สัปดาห์แล้วสัปดาห์เล่าหรือไม่? เช่น การเขียนรายงาน. คุณขอข้อมูล วิเคราะห์ แสดงภาพ (สร้างกราฟ แผนภูมิ) แล้วส่งให้เจ้านายของคุณ แต่จะเกิดอะไรขึ้นถ้าทั้งหมดนี้เป็นแบบอัตโนมัติ?
ในบทช่วยสอนนี้ เราจะสร้างบอทสำหรับ Telegram ซึ่งจะช่วยรายงานโดยอัตโนมัติ และที่เจ๋งที่สุดคือทั้งโปรแกรมจะประกอบด้วยโค้ดเพียง 50 บรรทัดเท่านั้น! หากคุณกำลังสร้างบอทสำหรับ Telegram เป็นครั้งแรก คุณควรอ่านบอทนี้ด้วย
Skillbox แนะนำ: หลักสูตรภาคปฏิบัติ
ผู้พัฒนา Python ตั้งแต่เริ่มต้น .เราเตือนคุณ: สำหรับผู้อ่าน "Habr" ทุกคน - ส่วนลด 10 rubles เมื่อลงทะเบียนในหลักสูตร Skillbox ใด ๆ โดยใช้รหัสส่งเสริมการขาย "Habr"
มาเริ่มกันเลย
การติดตั้งไลบรารี
เราจะใช้
pip3 ติดตั้ง google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
กำลังเชื่อมต่อ Google BigQuery API
หากเราต้องการใช้บริการเราจำเป็นต้องเชื่อมต่อ Google BigQuery API การทำเช่นนี้เราไปที่
ในแผงควบคุม ให้เลือกเปิดใช้งาน APIS และบริการ และมองหา 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 คือชื่อเรื่องสำหรับแกน และ title คือชื่อเรื่องของการแสดงภาพทั้งหมด
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 (แบบสอบถาม)
จากนั้นเราใช้คอลัมน์ข้อมูลวันที่สำหรับแกน x และคอลัมน์ Total_posts สำหรับแกน y
x = dataframe['วันที่'].tolist()
y = dataframe['total_posts'].tolist()
เราแสดงภาพโดยใช้ฟังก์ชัน Visualize_bar_chart และบันทึกเป็นรูปภาพ
plt = Visualize_bar_chart(x=x, x_label='วันที่', y=y, y_label='โพสต์ทั้งหมด', title='โพสต์รายวัน')
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
เราใช้
ตอนนี้เรามาสร้างฟังก์ชัน 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'))
โปรแกรมหลัก
ในที่สุด เราก็สร้างฟังก์ชันอื่นขึ้นมา main เพื่อเปิดแอปพลิเคชัน อย่าลืมเปลี่ยน 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 บรรทัดที่สร้างรายงานโดยที่เราไม่ต้องดำเนินการใดๆ
มาตรวจสอบบอทกัน
สามารถรับโค้ดที่เสร็จแล้วได้ที่
Skillbox แนะนำ:
- หลักสูตรภาคปฏิบัติสองปี
"ฉันเป็นนักพัฒนาเว็บ PRO" .- คอร์สออนไลน์
"นักพัฒนา C # จาก 0" .- หลักสูตรปีปฏิบัติ
"นักพัฒนา PHP จาก 0 ถึง PRO" .
ที่มา: will.com