
Você tem tarefas que se repetem dia após dia, semana após semana? Por exemplo, escrever relatórios. Você solicita dados, analisa, visualiza (faz gráficos, tabelas) e depois envia para seu chefe. Mas e se tudo isso fosse automatizado?
Neste tutorial criaremos um bot para Telegram que ajudará a automatizar os relatórios. E o mais legal é que todo o programa será composto por apenas 50 linhas de código! Se você está criando um bot para o Telegram pela primeira vez, então você também deve ler este .
A Skillbox recomenda: curso prático .
Lembramos: para todos os leitores de "Habr" - um desconto de 10 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".
Descer
Instalando bibliotecas
Nós vamos usar para obter dados do Google BigQuery. , и irá ajudá-lo a visualizar seus dados. enviará os dados finalizados para o Telegram.
pip3 instalar google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
Conectando a API Google BigQuery
Se quisermos usar o serviço, precisamos conectar a API Google BigQuery. Para fazer isso vamos e crie um novo projeto (ou selecione um existente).
No painel de controle, selecione ATIVAR APIS E SERVIÇOS e procure API BigQuery.

Selecione Habilitar para conectar a API.

Crie uma chave de conta
Vamos de novo , selecione a guia Credenciais, Criar credenciais e Chave da conta de serviço.
Então - Nova conta de serviço e insira o nome no campo Nome da conta de serviço.
Na lista suspensa Função, selecione Projeto > Proprietário e, em seguida, Criar.

O arquivo que será baixado automaticamente se chama creds.json.
Defina GOOGLE_APPLICATION_CREDENTIALS, especificando o caminho para creds.json no terminal.
exportar GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'
Se tudo correu bem, é hora de começar a escrever o programa.
Criando um aplicativo
Para o tutorial usaremos dados de bigquery-public-data.stackoverflow, para nosso relatório selecionaremos o número de publicações diárias.
Tudo é bem simples.
Consultar a tabela -> Visualizar os dados -> Salvar a visualização -> Enviar a imagem
Vamos criar uma função para definir cada thread.
Consultar no BigQuery
Primeiro importamos a biblioteca.
do google.cloud importar bigquery
Criamos uma função chamada query_to_bigquery, onde o parâmetro é query.
def query_to_bigquery(query):
client = bigquery.Client()
query_job = client.query(query)
result = query_job.result()
dataframe = result.to_dataframe()
return dataframeEsta função retornará a solicitação como um quadro de dados.
Visualizando dados
Para resolver este problema, escolha matplotlib.
importar matplotlib.pyplot como plt
Precisamos de cinco parâmetros, onde x são os dados do eixo x, x_label é o título do eixo, y são os dados do eixo y, y_label é o título do eixo e title é o título de toda a visualização.
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 pltSalvando a imagem
Agora vamos usar duas funções para criar uma visualização e salvá-la.
Enviaremos a quantidade de postagens publicadas diariamente. Primeiro escrevemos um pedido.
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
"""A consulta ajuda a coletar dados durante duas semanas a partir de 2 de dezembro de 2018.
Usamos essa data porque 2018/12/02 são os dados mais recentes registrados em bigquery-public-data.stackoverflow.post_history. Em outros casos, você pode usar CURRENT_DATE() para obter os dados mais recentes.
Chame a função query_to_bigquery para obter os dados.
quadro de dados = query_to_bigquery(consulta)
Em seguida, usamos a coluna de dados de data para o eixo x e a coluna total_posts para o eixo y.
x = dataframe['data'].tolist()
y = dataframe['total_posts'].tolist()
Nós o visualizamos usando a função visualize_bar_chart e salvamos como uma imagem.
plt = visualize_bar_chart(x=x, x_label='Data', y=y, y_label='Total de postagens', title='Postagens diárias')
plt.savefig('viz.png')
Envolvemos esse código em uma função chamada 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')Envie uma imagem
Para enviar um relatório ao destinatário, você precisa conhecer o parâmetro chat_id.
Nós usamos e digite /iniciar. O bot responde com as informações necessárias, chat_id está contido no campo id.
Agora vamos criar a função send_image. Ele usará a função get_and_save_image para recuperar e salvar a imagem. E então enviamos tudo para o contato correto.
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'))Programa principal
Por fim, criamos outra função, principal, para iniciar a aplicação. Não se esqueça de alterar YOUR_TOKEN para o bot.
Lembre-se: este programa enviará a imagem automaticamente no horário que você especificar. Por exemplo, enviaremos um relatório às nove da manhã todos os dias.
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()Como resultado, nosso aplicativo ficará assim:
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()Salve o arquivo e chame-o de main.py.
Iniciamos o aplicativo digitando o comando no terminal:
python3 principal.py
Tudo está pronto. Agora temos um robô composto por 50 linhas de código que gera relatórios sem a nossa intervenção.
Vamos verificar o bot selecionando o comando /send.

Você pode obter o código finalizado em .
A Skillbox recomenda:
- Curso prático de dois anos .
- Curso online .
- curso de ano prático .
Fonte: habr.com
