Executando verificação de segurança...
0

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?

LINK PARA PERGUNTA RESPONDIDA

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?

5

Sua pergunta aqui é ruim. Então podemos inferir que lá também de ve estar. Mas sua reclamação está acima da média, ela tenta uma solução, em vez de criar mais problema.

Como podemos responder as perguntas que fez sem passar as informações necessárias? Não colocou o contgeúdo que postou lá, não mandou um link para verificarmos, ver o texto e até o motivo do fechamento, o que tem de diferente na versão em inglês, ou até mesmo se é verdade (não acuso ninguém de antemão, mas minha experiência mostra que a maioria das pessoas que dizem que foi fechado em um lugar e respondida em outro, era mentira, mas eu vou cinsiderar que não é o caso aqui).

Mesmo respondida em outro lugar, será que era uma boa resposta? Um dos motivos que se fecha uma pergunta é que não produzir´pa boas respostas, e a pessoa que pergunta não sabe avaliar isso, caso contrário ela não estaria perguntando.

De fato, hoje (não era assim), o SOen não fecha muita coisa. Por isso ele já não tem mais a relevância que tinha no passado. Antes era o lugar para achar excelentes respostas, que ainda estão lá, mas enterradas no meio de muita coisa ruim, o SO perdeu sua função. E de fato, o mundo todo participando tem mais gente querendo dar qualquer resposta lá, mesmo errada. O Sopt todo mundo desistiu . Eu desisti, pode ver meu perfil como era e como é agora: https://pt.stackoverflow.com/users/101/maniero. Não tem perguntas boas mais, não tenho a menor motivação de participar. É função de quem precisa de ajuda fazer uma pergunta que motive alguém experiente parar seu trabalho para ajudar alguém sem ganhar nada com isso (nos últimos tempos nem mesmo um voto ou uma aceitação, um desleixo total das pessoas que perguntam).

E as poucas pessoas que sobraram no SOpt cansaram de pegar na mão para ajudar a pessoa melhorar a sua pergunta, dando apenas instruções genéricas que muitas pessoas não conseguem seguir. Então junta a falta de capacidade de se expressar, de seguir instruções e produzir conteúdo que só interessa a ela, com o cançaso dos que ajudavam, o SOpt está morto. O SOen está na cova, cheio de bichos.

Não faltam exempos de bons posts lá no próprio site.

Como última nota, mesmo sem ver a peergunta não foi removida, foi fechada, ela só é removida se estiver fechada e negativada há muitos dias, pelo próprio sistema. E está fora das regras fazer de novo a mesma pergunta, deve-se editar e corrigir o problema. Mas ninguém lê as regras, então não dá certo, e aí a culpa "passa ser dos outros". E todo fechamaento tem um motivo claro, no passado as pessoas pessoas entendiam, hoje a gente vê que não estão entendendo mais. Assim caminha a humanidade, se já está assim, imagina com a IA como os cérebros vão parando de funcionar.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui no perfil também).

1

Agradeço a disposição em responder

Entendo que muitas duvidas já estao respondidas e provavelmente 80% das perguntas são coisas que todos já responderam mais de um milhão de vezes e isso deve gerar um cansaço extremo( ainda mais por não estar recebendo nada), mas procurar a resposta de algo e não conseguir encontrar acaba por desanimar quando voce esta buscando aprender sobre algo,

vou editar a pergunta e colocar os codigos relevantes

analisando a pergunta onde eu poderia melhorar?

PS: Achei seu github bem interessante, gostaria de recomendações de conteudo se possivel.

3

Os critérios de ambos os sites são parecidos, mas tem uma coisa que muita gente ignora: a escala.

O site em português (SOpt) meio que estagnou (segundo dados de hoje, tem em média 12 perguntas por dia). Já o site em inglês (SOen) recebe mais de 2 mil perguntas por dia. Ou seja, é muito mais fácil administrar o SOpt, então dá a impressão de que ele é mais rígido.

No SOen o volume é tão grande que o pessoal não dá conta de revisar tudo, e muita coisa passa batida. Mas não se engane, aqueles que têm suas perguntas fechadas/negativadas no SOen reclamam do mesmo jeito - se vc acompanhar o Meta SO e também o Meta geral da rede, vai ver que sempre têm reclamações parecidas, tanto de fechamentos quanto de "falta de explicação".

Os sites em inglês são tão rígidos ou até mais que o SOpt, mas a escala destes acaba mascarando um pouco a situação. Como a maioria "escapa", têm se a falsa impressão de que é menos rígido. Não é, os critérios são similares, mas devido às diferenças de tamanho, a chance de "sair ileso" é maior no SOen.


Dito isso, por participar há muito tempo do SOpt, e de ter participado há mais tempo ainda no SOen (apaguei minha conta lá, mas ainda acompanho o site em modo read-only), posso dizer que na maioria das vezes comentar não adianta nada. O que mais costumar acontecer é a pessoa ignorar ou não entender as instruções para melhorar. Ou então discordar do que foi explicado, alguns se revoltam e até xingam quem comentou (sem perceber que na verdade essas pessoas estão tentando ajudar), e em raros casos tem até perseguição em outros sites (a pessoa descobre redes sociais de quem comentou pra xingar e ameaçar lá, etc). Infelizmente chegou num ponto que muita gente (muita mesmo) desistiu de comentar, porque são raríssimas as vezes em que é de fato efetivo.

Sem contar que há amplo material de ajuda no site (a própria Central de Ajuda e o Meta de cada site), justamente pra não precisar depender de ninguém comentando em cada post de cada usuário.

Concordo que não é o ideal, poderia ser melhor, mas é a situação em que o SO chegou. Eu já falei pra algumas pessoas que acho inclusive que o ideal era alguém criar outro site, pra acolher as perguntas que o SO não aceita. Afinal - e digo isso sem ironia - se tem tanta gente insatisfeita com o Stack Overflow, não vai ser difícil atrair usuários pra esse novo site.

1

mas este e o ponto você nao ter a resposta que espera acaba desmotivando a utilizar a ferramenta, hoje eu posso dizer que a maioria das respostas que obtenho pra resolver meu problema acaba sendo em foruns ou em grupos no whatsapp ou discord onde voce encontra pessoas que acabam por conseguir te ajudar

1

Concordo que desmotiva. Mas se a pergunta não está dentro do escopo do site, será que ela deveria ser respondida?

Ou as pessoas se esforçam pra seguir os critérios (que reconheço que são complicados), ou mudam-se esses critérios.

O primeiro ponto já vi por experiência própria que não dá, a esmagadora maioria as pessoas perguntam de qualquer jeito e só querem que alguém resolva o problema delas (mesmo que seja com alguma gambiarra horrenda).

Quanto a mudar o critério, já sugeriram várias vezes (tanto no site em português quanto em inglês), mas até a empresa dona do site é relutante em fazer grandes mudanças (pelo menos no discurso oficial, pois no fundo eles sabem que se mudar esse discurso, aí a qualidade cai de vez e o site perde seu valor).

No fim cai no que eu disse: não é o ideal, mas é a situação que chegamos. Já deu o que tinha que dar, acho mais fácil alguém criar outro site. Aí pode-se ter algo "limpo" desde o início, sem os "vícios" do SO. De novo, dada a quantidade de gente que reclama do SO, não acho que será difícil atrair usuários pra esse novo - e ainda hipotético - site.

1

Poderia publicar o link para sua pergunta removida no Stack Overflow em Português? Eu estou olhando seu perfil no Stack Overflow em Português e só consigo ver duas perguntas em aberto.

1
1

Com o link nós podemos acessar a pergunta e o histórico de publicação e assim o orientar no caso de um pedido de revisão. Mas adianto:

1- pedidos de revisão de fechamento ou revisão de exclusão devem ser exclusivamente pedidos no site https://pt.meta.stackoverflow.com/

2- pedidos de revisão de fechamento ou revisão de exclusão são decididos pela comunidade através de votação de usuários detentores de privilégios de restauração e reabertura de publicações. Veja a lista completa dos privilégios que podem ser obtidos no Stack Overflow em Português https://pt.stackoverflow.com/help/privileges