Para que
Com a estrutura complexa de campanhas publicitárias e um grande número de chamadas, são necessárias ferramentas adicionais para armazenar, processar e analisar informações sobre as chamadas recebidas. Geralmente, você precisa de acesso rápido aos dados por um longo período de tempo. Às vezes, você precisa de processamento de dados complexo, correlacionando chamadas para um canal ou campanha específica.
Uma das opções para acelerar o trabalho, que também oferece benefícios adicionais, é importar chamadas do CoMagic para o Google BigQuery. Muito foi escrito sobre os benefícios do BigQuery, então vamos à criação.
Para criar uma importação automática, você precisará de:
- Conta do Google (se ainda não estiver) com o projeto criado
- Conhecimento em Python
- Apresentando a documentação do Google Cloud
Como criar um projeto é descrito
aqui . Após a criação do projeto, você precisa criar um conjunto de dados no BigQuery.
Documentação e
instruções da BQ para criar um conjunto de dados .
Recuperando dados do CoMagic
Voltando à
documentação do CoMagic. Para obter uma lista de chamadas, precisamos da seção de relatórios.
Criamos uma classe simples para trabalhar com a API CoMagic. Todos os requisitos necessários serão indicados no final do link para o GitHub.
import json import requests import random import pandas as pd class ComagicClient: """ CoMagic""" def __init__(self, login, password): """ CoMagic""" self.login = login self.password = password self.base_url = 'https://dataapi.comagic.ru/v2.0' self.payload_ = {"jsonrpc":"2.0", "id":1, "method":None, "params": None} self.token = self.get_token(self.login, self.password) def base_request(self, method, params): """ CoMagic. API . JSON-like . : https://www.comagic.ru/support/api/data-api/""" id_ = random.randrange(10**7)
Agora você precisa determinar que tipo de dados é necessário. Os dados precisam ser processados e tornados visíveis para que possam ser carregados no BigQuery.
Crie uma classe auxiliar e defina os dados recebidos do CoMagic.
class ComagicHandler(ComagicClient): """ , CoMagic""" time_partition_field = 'PARTITION_DATE' def __init__(self, login, password, first_call_date): self.day_before_first_call = pd.to_datetime(first_call_date) - pd.Timedelta(days=1) super().__init__(login, password) def get_calls_report(self, date_from, date_till): """ . . Pandas DataFrame. . Connector . . . Pnadas.DataFrame""" method = "get.calls_report" fields = ['id', 'visitor_id', 'person_id', 'start_time', 'finish_reason', 'is_lost', 'tags', 'campaign_name','communication_number', 'contact_phone_number', 'talk_duration', 'clean_talk_duration', 'virtual_phone_number', 'ua_client_id', 'ym_client_id', 'entrance_page', 'gclid', 'yclid', 'visitor_type', 'visits_count', 'visitor_first_campaign_name', 'visitor_device', 'site_domain_name','utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'eq_utm_source', 'eq_utm_medium', 'eq_utm_campaign', 'attributes']
Enviando dados para o BigQuery
Depois que os dados do CoMagic são recebidos e convertidos, você precisa enviá-los para o BigQuery.
from google.cloud import bigquery from google.cloud.exceptions import NotFound import pandas as pd class BQTableHanler: """ BigQuery""" time_partition_field = 'PARTITION_DATE' def __init__(self, full_table_id, service_account_file_key_path = None): """ `myproject.mydataset.mytable`. , Application Default Credentials, .""" self.full_table_id = full_table_id project_id, dataset_id, table_id = full_table_id.split(".") self.project_id = project_id self.dataset_id = dataset_id self.table_id = table_id if service_account_file_key_path:
Determinar a lógica para atualizar dados
Como existe um limite no número de linhas de dados recebidas do CoMagic, é necessário limitar o número de dados solicitados. Nós limitaremos o período de solicitação. Para fazer isso, você precisa de uma função auxiliar que divida um grande período de tempo em segmentos de um comprimento especificado.
def interval_split(array, interval): """ . , 2, - , - . : get_intervals([1,2,3,4,5,6,7], 3) => [[1,3], [4,6], [7]] get_intervals([1,2,3], 4) => [[1,3]]""" intervals = [] iw, i = 0, 0 l = len(array) for v in array: if i==0 or (i)%interval==0: intervals.append([v]) if (i+1)%interval == 0 or (i+1) == l: intervals[iw].append(v) iw+=1 i+=1 return intervals
Isso é necessário ao carregar dados pela primeira vez, quando você precisa fazer o download de dados por um longo período de tempo. O período é dividido em vários pequenos períodos. A propósito, é melhor fazer isso sem usar a função Cloud, pois eles têm um limite de tempo. Bem, ou, como opção, você pode executar a função muitas e muitas vezes.
Criamos uma classe de conectores para vincular a tabela do BigQuery na qual queremos armazenar os dados e os dados do CoMagic.
from helpfunctions import interval_split import pandas as pd class Connector: """ """ time_partition_field = 'PARTITION_DATE'
Em seguida, prescrevemos a principal função para atualizar os dados, que serão lançados em uma programação.
from connector import Connector from bqhandler import BQTableHanler from comagichandler import ComagicHandler from credfile import * def main(event, context): """ event, context : https://cloud.google.com/functions/docs/writing/background#functions-writing-background-hello-pubsub-python"""
Configurar o Google Cloud Platform
Coletamos todos os arquivos em um arquivo ZIP. No arquivo credfile.py, inserimos o login e a senha do CoMagic para receber o token, o nome completo da tabela no BigQuery e o caminho para o arquivo da conta de serviço se o script for iniciado na máquina local.
Criar uma função de nuvem
- Vá para o console
- Se nenhuma função foi criada ainda, clique em "Criar função"
- No campo acionador, selecione PUB / SUB
- Crie um novo tema para o PUB / SUB. Por exemplo, 'update_calls'
- Origem: upload ZIP (arquivo ZIP local)
- Ambiente: Python 3.7
- Faça o download do arquivo zip
- Escolhendo um segmento temporário do Cloud Storage
- No campo `chamado function`, escrevemos 'main'
- Memória alocada: opcional

Configurando o Scheduler e o PUB / SUB
Na última etapa, criamos o gatilho `update_calls`. Este tópico automático apareceu na
lista de tópicos .

Agora, com o Cloud Scheduler, você precisa configurar o gatilho. quando será acionado e o GCF será iniciado.
- Vá para o console
- No campo de frequência no formato CRON, defina quando o gatilho deve disparar e a função é iniciada.
- Destino: Pub / Sub
- Assunto: registre o tema que foi especificado ao criar a função: “update_calls”
- Cargas úteis * (Cargas úteis) - são as informações que serão transferidas para Pub / Sub e para a função principal

Agora, o script será iniciado diariamente às 01:00 e os dados da chamada serão atualizados no final do dia anterior.
Link para o GitHub para executar no computador local
Link para o arquivo ZIP do GitHub