
Compartilhar:
Polyglot hacker and lifelong student trying a little bit of everything and documenting the experience.
Envio de SMS a partir do Python com o Google Cloud Functions
Tempo de leitura: 7 minutos
O tutorial a seguir mostra como implantar uma função no Google Cloud Platform usando Python 3.7.
A função utiliza a SMS API da Vonage para enviar uma mensagem de texto a um usuário. O caso de uso consiste em enviar uma mensagem convidando o usuário a baixar um aplicativo. Essa função pode, então, ser chamada a partir de um front-end em JavaScript. É possível realizar tarefas mais sofisticadas com uma Google Cloud Function, mas esta é uma demonstração simples de como criar uma função básica que funcione.
Por que fazer isso?
Talvez você já tenha ouvido falar em “Funções como Serviço” ou na criação de aplicativos “sem servidor”: a tendência de implantar funções individuais em um provedor de serviços em nuvem como Google, Amazon ou Microsoft vem crescendo. A vantagem desse tipo de arquitetura é que ela permite dividir as Applications nas menores partes possíveis — funções individuais — e desenvolvê-las de forma rápida e escalável, sem precisar gerenciar servidores ou pagar por serviços que você não está usando.
Esse tipo de implantação é particularmente útil para adicionar uma quantidade mínima de código de back-end a um site predominantemente estático. Assim, é possível hospedar um site criado com um gerador de sites estáticos em uma plataforma como GitHub Pages ou Netlify, sem o incômodo ou o custo de manter um servidor web completo apenas para uma única função.
Como se cadastrar no Google
Para começar a usar o Google Cloud Platform, acesse cloud.google.com e cadastre-se. Você precisará de um Account do Google: se já usa um Account do Google para o Gmail, Android ou outros serviços do Google, pode usar esse mesmo Account.
Se você ainda não usou o Google Cloud Platform, eles oferecem um crédito generoso no valor de US$ 300 (ou o equivalente em sua moeda local) para usar no primeiro ano. A menos que seu site se torne extremamente popular e as pessoas o acessem constantemente, você provavelmente não vai usar mais do que o permitido pelo plano gratuito.
Configurando os pré-requisitos
As funções do Google Cloud Functions podem ser escritas para serem executadas tanto em Node.js quanto em Python 3. Se você estiver usando Node.js, o Google utiliza o biblioteca Express , já que, para o Python, utiliza-se a biblioteca Flask é utilizada para lidar com solicitações e respostas. Cada solicitação recebida é encaminhada à sua função como um flask.Request e sua função precisa retornar uma resposta da mesma forma que faria em um aplicativo Flask.
Uma coisa que você precisará resolver é o Cross-Origin Resource Sharing (CORS). Podemos resolver isso incluindo Flask-CORS.
O primeiro passo para criar nossa função é clicar em “Criar uma função” na seção Cloud Functions do console do Google Cloud Platform. Em seguida, você será solicitado a definir um nome para sua função e escolher algumas opções.
Create a Google Cloud Function
Vamos dar uma olhada rápida nesses pontos:
O nome da sua função também é usado na URL utilizada para chamá-la.
A memória alocada para sua função é a quantidade máxima de memória que pode ser utilizada: se você estivesse criando uma função que exigisse muito da memória (por exemplo, se ela lidasse com arquivos de áudio/Video), precisaria atribuir mais memória a ela — deixe esse valor definido em 256 MB.
O gatilho é a forma como sua função é acionada. Como nossa função será chamada a partir de um formulário em uma página da web, devemos mantê-lo configurado como HTTP, mas você poderia configurá-lo para agir com base em outras ações.
O código-fonte especifica onde o código está localizado: para este tutorial, usaremos o editor embutido, mas isso pode ser alterado para se adequar à sua forma de desenvolver código — ele pode ser implantado a partir de um arquivo ZIP que você enviar pelo navegador, de um arquivo ZIP que você implantar no Cloud Storage ou de um repositório.
É preciso definir o ambiente de execução: o padrão é o Node.js, mas usaremos o Python neste tutorial.
Abaixo do editor de código, há várias opções avançadas que vale a pena conferir:
A região: por padrão, está definida como us-central1 (Iowa, EUA), mas se a maioria dos seus visitantes for da Europa ou da Ásia, talvez seja melhor defini-la como europe-west1 (Bélgica) ou asia-northeast1 (Tóquio), conforme o caso. Alterar essa configuração mudará a URL.
O tempo limite está definido em 60 segundos: isso deve ser suficiente para nossos objetivos, mas você pode ajustá-lo. Lembre-se de que o uso do Cloud Functions é cobrado por milissegundo.
As variáveis de ambiente: você precisará definir duas variáveis de ambiente: VONAGE_API_KEY e VONAGE_API_SECRET.
Criando nossa função
O que sua função específica faz depende de você. Escrevi um exemplo simples que você pode conferir em Gist ou ler abaixo. Ela recebe dois argumentos:
phone: o número de telefone para o qual vamos enviar a mensagem. A Vonage exige que o número esteja no formato E.164.platform: o sistema operacional do dispositivo do usuário — que será o iOS ou o Android. Isso determinará se ele receberá uma mensagem com um link para a App Store da Apple ou para a Google Play Store.
import vonage
from flask import jsonify
def send_sms(request):
data = request.get_json()
# VONAGE_API_KEY and VONAGE_API_SECRET are in env vars
# which are set in the Google Cloud function
client = vonage.Client()
# you may prefer to use link shorteners to see how many clickthroughs happen
ios_msg = "Download our iOS app from https://example.org/apple"
android_msg = "Download our Android app from https://example.org/android"
if data['platform'] == "ios":
msg = ios_msg
elif data['platform'] == "android":
msg = android_msg
# you need some more data checking here. just an example...
args = {
'from': 'MyApp',
'to': data['phone'],
'text': msg
}
response = client.send_message(args)
return jsonify(response)Depois de escrever sua função, a maneira mais simples de implantá-la é copiá-la e colá-la no editor de código do site do Google Cloud Functions. Abaixo do editor de código, você precisa definir o nome da função a ser executada — isso indica ao Cloud Functions qual função em seu arquivo deve ser chamada. Na seção “Avançado”, você também precisa definir as variáveis de ambiente, VONAGE_API_KEY e VONAGE_API_SECRET.
Set environment variables
Quando terminar, clique em “Salvar”, aguarde alguns instantes até que os robôs mágicos do Google implementem a função e, em seguida, você poderá testá-la.
Apenas a título de demonstração, eis o que é retornado pela SMS API:
{
"message-count": "1",
"messages": [
{
"status": "0",
"network": "23410",
"remaining-balance": "10.00000000",
"to": "447700900000",
"message-price": "0.03330000",
"message-id": "1500000000000AA1"
}
]
}(É altamente recomendável que você filtre informações como o ID da mensagem, em vez de enviá-las de volta ao front-end.)
Integração de front-end
Depois de escrever a função, o próximo passo é integrar essa chamada de função a um front-end. Para um front-end baseado em JavaScript, você precisará garantir que todas as Cloud Functions que estiver chamando retornem o Cabeçalhos de Compartilhamento de Recursos entre Origens (CORS) para os domínios dos quais estão sendo chamadas.
Qualquer código que você escrever e usar em produção precisará ser um pouco mais sofisticado do que o exemplo apresentado aqui: é importante implementar verificações para garantir que você não esteja enviando mensagens em excesso. Só porque seu código é “sem servidor” não significa que você não precise se preocupar com segurança. Suas funções são pequenas e independentes, o que significa que não podem afetar outros códigos, mas você ainda precisa se certificar de validar os dados que chegam à sua função e garantir que as APIs chamadas a partir dela (incluindo as APIs da Vonage) sejam chamadas com segurança.
E agora?
O Cloud Functions do Google, assim como o Azure Functions da Microsoft e as funções Lambda da Amazon Web Services, permite criar APIs muito simples pelas quais você só paga quando são executadas. Elas são perfeitas para integração em sites estáticos, em front-ends JavaScript ou em aplicativos móveis.
Eles podem ser usados como uma forma de integrar serviços oferecidos por diversos provedores de API. Por exemplo, você poderia usar o Cloud Functions para:
responder a eventos de webhook dos serviços de Voice da Vonage
receber notificações do GitHub ou do seu serviço de integração contínua e, em seguida, acionar o envio de uma mensagem de texto caso alguma condição seja atendida
reunir informações do seu sistema de comércio eletrônico e do provedor de pagamentos para enviar uma mensagem de agradecimento ao cliente quando o pedido for despachado
armazenar dados analíticos do seu aplicativo móvel em um banco de dados como o Firestore
Depois de criar sua primeira função, você começa a perceber como elas podem resolver todos os tipos de problemas com os quais você está trabalhando.