StackOverflow - Como um bom post e avaliado?
Considerações Iniciais
Primeira vez que vou publicar algo aqui já peço perdão pelas gafes e erros de ortografia, o objetivo deste post e realizar um desabafo e verificar como nao ter o problema ocorrido acontencendo novamente
O Objetivo
Há alguns meses, enfrentei um desafio que me causou certo estresse. Estava trabalhando na integração da plataforma da empresa com alguns recursos do Facebook para otimizar determinadas questões internas. Por exemplo, quem nunca se deparou com a situação de pessoas não abrindo chamados porque precisam enviar um e-mail ou preencher um formulário, e acabam reportando o problema por mensagem no WhatsApp, ou pulando algum processo alegando ter avisado alguém por mensagem? Diante disso, tive a ideia de integrar tarefas simples, como abrir chamados ou registrar situações diretamente por essas plataformas. Até aí tudo bem.
O Problema
Então, como fazer? Como todo desenvolvedor, recorri ao Google, documentação e outros recursos para resolver meu problema. Lendo a documentação da META, encontrei uma possível solução para os meus dilemas: a automação no WhatsApp, onde acabavam de lançar a ferramenta FLOWS, que basicamente envia um formulário simples na conversa.
Pensei: "Bem, posso testar isso!"
Assim, comecei a ler e implementar a rotina em um ambiente de testes. Como era uma ferramenta recente, o conteúdo disponível sobre ela era escasso, então eu sabia que enfrentaria algumas dificuldades. Após alguns dias de testes, deparei-me com um problema na hora de enviar a requisição para a plataforma, sempre recebendo um erro.
Fui atrás de verificar qual o motivo do erro e, como você deve imaginar, não encontrei a solução na documentação oficial, então recorri à comunidade, lendo alguns fóruns, mas não encontrei a solução.
Decidi então abrir uma pergunta em nosso grande STACK OVERFLOW.
Foi aí que começaram as dificuldades. Abri a pergunta na versão em português e em menos de 10 minutos, minha pergunta foi removida. Pensei comigo mesmo: "O que fiz de errado?"
Revisei a pergunta em busca de erros de português, codigo e tentei explicar melhor meu problema, reenviando o post. Ao mesmo tempo, fiz o mesmo post em inglês para buscar ajuda com outros devs, pois pensei que alguém lá fora já deve ter passado pela mesma situação.
Para minha surpresa, o post em português foi removido novamente, enquanto o post em inglês com a mesma questão foi respondido.
Consegui resolver meu problema, mas fiquei com a dúvida: qual seria a diferença entre a mesmo post, sendo apenas diferente o idioma?
Foi meu codigo ? Foi como me expressei? quais os criterios de avaliação para remover um post? e se o post foi removido nao deveria ter um motivo claro ou uma explicação do motivo?
O que vocês acham?
peço desculpas se pelo desabafo, mas fiquei com isso na cabeça e ainda não entendo o motivo entao pensei e publicar aqui o conteudo pra ver se me ajudama enteder o porque?
Como a pergunta em portugues foi removida por já fazer alguns meses do ocorrido vou deixar ela abaixo
imagens do post original
https://ibb.co/6ZcKg3y
https://ibb.co/Sm2J5ST
https://ibb.co/RCrymWD
Estou tentando gerar a resposta para o fluxo do WhatsApp usando a API do WhatsApp Business com o seguinte código
A parte de descriptografia está funcionando corretamente, mas quando tento enviar a resposta, recebo o erro: "Não foi possível descriptografar a resposta recebida do servidor."
Mencionei a documentação aqui, mas ainda estou lutando para encontrar a abordagem correta para gerar e validar a resposta.
Há alguém que tenha experiência com esta API ou possa fornecer orientação sobre como formatar e enviar a resposta corretamente? Quaisquer exemplos ou links para recursos relevantes seriam muito apreciados.
def post(self, request, *args, **kwargs):
try:
dict_data = json.loads(request.body.decode('utf-8'))
encrypted_flow_data_b64 = dict_data['encrypted_flow_data']
encrypted_aes_key_b64 = dict_data['encrypted_aes_key']
initial_vector_b64 = dict_data['initial_vector']
flipped_iv = self.flip_iv(initial_vector_b64.encode('utf-8'))
encrypted_aes_key = b64decode(encrypted_aes_key_b64)
key_private = open('*******.pem', 'rb').read().decode('utf-8')
private_key = load_pem_private_key(key_private.encode('utf-8'), password="*************".encode('utf-8'))
aes_key = private_key.decrypt(encrypted_aes_key, OAEP(mgf=MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None))
aes_key_b64 = b64encode(aes_key).decode('utf-8')
flow_data = b64decode(encrypted_flow_data_b64)
key = b64decode(aes_key_b64)
iv = b64decode(initial_vector_b64)
encrypted_flow_data_body = flow_data[:-16]
encrypted_flow_data_tag = flow_data[-16:]
cipher = Cipher(algorithms.AES(key), modes.GCM(iv,encrypted_flow_data_tag))
decryptor = cipher.decryptor()
decrypted_data = decryptor.update(encrypted_flow_data_body) + decryptor.finalize()
flow_data_request_raw = decrypted_data.decode("utf-8")
hello_world_text = "HELLO WORLD"
response_data = {
"version": "3.0",
"screen": "MY_FIRST_SCREEN",
"data": {
"hello_world_text": hello_world_text
}
}
response_json = json.dumps(response_data)
# Obtendo a chave AES após descriptografar encrypted_aes_key
fb_aes_key = private_key.decrypt(encrypted_aes_key, OAEP(mgf=MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None))
# Usando a chave AES para criptografar a resposta
response_cipher = Cipher(algorithms.AES(fb_aes_key), modes.GCM(iv))
encryptor = response_cipher.encryptor()
encrypted_response = (
encryptor.update(response_json.encode("utf-8")) +
encryptor.finalize() +
encryptor.tag
)
encrypted_response_b64 = b64encode(encrypted_response).decode("utf-8")
# Construct the final response
final_response = {
"encrypted_flow_data": encrypted_response_b64,
"encrypted_aes_key": encrypted_aes_key_b64,
"initial_vector": initial_vector_b64
}
return JsonResponse(final_response, status=200)
except Exception as e:
print(e)
return HttpResponse(status=500, content='ok')
def flip_iv(self, iv):
flipped_bytes = []
for byte in iv:
flipped_byte = byte ^ 0xFF
flipped_bytes.append(flipped_byte)
return bytes(flipped_bytes)
Toda a parte de decodificação está funcionando normalmente mas ao retornar a resposta recebo o erro "Não foi possível descriptografar a resposta recebida do servidor.
"Não consigo encontrar como enviar a resposta correta ou como validá-la. A documentação pode ser encontrada em https://developers.facebook.com/docs/whatsapp/flows/reference/implementingyourflowendpoint#data_exchange_request
Alguém pode me ajudar ou me mostrar um link que eu possa testar?