Zammad: DMs e menções do Twitter não chegam

Criado em 30 jan. 2019  ·  22Comentários  ·  Fonte: zammad/zammad

Oi,

configuramos a integração com o Twitter de acordo com a documentação e as configurações do canal não apresentam erros. No entanto, nada chega.

Infos:

  • Versão Zammad usada: 2.8.0-1548330940.ad390e9f.stretch
  • Método de instalação (fonte, pacote, ..): Pacote Debian
  • Sistema operacional: Debian stretch
  • Banco de dados + versão: MariaDB

Comportamento esperado:

  • Quando alguém nos menciona ou envia um DM, um tíquete Zammad é criado.

Comportamento real:

  • Quando alguém nos menciona ou envia um DM, nada acontece.

Sim, tenho certeza que isso é um bug e nenhuma solicitação de recurso ou uma questão geral.
Você pode nos ajudar a descobrir quais informações você precisa para depurar?

bug frontend / JS app verified

Comentários muito úteis

Eu esqueci de mencionar: muito obrigado @MrXermon por entrar tão rápido! Sua opinião e a de abelxluck me ajudaram a encontrar a causa raiz no contexto de Zammad. A correção está a caminho 🚂

Todos 22 comentários

Olá @raphaelm. Existe alguma dica em log / production.log (por exemplo, -i twitter)?

Essa é a saída de grep -i twitter /var/log/zammad/production.log , após a remoção do registro de e-mails que recebemos do Twitter.

I, [2019-01-30T12:43:16.877706 #5931-47137720567500]  INFO -- : Started POST "/api/v1/external_credentials/twitter/app_verify" for 2a02:…:23b0 at 2019-01-30 12:43:16 +0100
I, [2019-01-30T12:43:16.882895 #5931-47137720567500]  INFO -- :   Parameters: {"consumer_key"=>"…", "consumer_secret"=>"…", "oauth_token"=>"…", "oauth_token_secret"=>"…", "env"=>"…", "provider"=>"twitter"}
I, [2019-01-30T12:43:18.081499 #5931-47137720546680]  INFO -- : Started GET "/api/v1/channels_twitter_webhook?crc_token=…&nonce=…" for … at 2019-01-30 12:43:18 +0100
I, [2019-01-30T12:43:18.085266 #5931-47137720546680]  INFO -- : Processing by ChannelsTwitterController#webhook_verify as HTML
I, [2019-01-30T12:43:18.982109 #5931-70307650490460]  INFO -- :   Parameters: {"name"=>"twitter", "credentials"=>{"consumer_key"=>"…", "consumer_secret"=>"…", "oauth_token"=>"22133603-…", "oauth_token_secret"=>"…", "env"=>"zammad", "controller"=>"external_credentials", "action"=>"app_verify", "provider"=>"twitter", "webhook_id"=>"…"}, "id"=>"c-0"}
I, [2019-01-30T12:43:19.337857 #5931-70307339885820]  INFO -- : Started GET "/api/v1/channels_twitter?_=1548750017521" for 2a02:…:23b0 at 2019-01-30 12:43:19 +0100
I, [2019-01-30T12:43:19.344139 #5931-70307339885820]  INFO -- : Processing by ChannelsTwitterController#index as JSON
I, [2019-01-30T12:43:22.154145 #5931-47137720546680]  INFO -- : Started GET "/api/v1/external_credentials/twitter/link_account" for 2a02:…:23b0 at 2019-01-30 12:43:22 +0100
I, [2019-01-30T12:43:22.165744 #5931-47137720546680]  INFO -- :   Parameters: {"provider"=>"twitter"}
I, [2019-01-30T12:43:22.345333 #5931-47137720546680]  INFO -- : Redirected to https://api.twitter.com/oauth/authorize?oauth_token=…
I, [2019-01-30T12:43:41.122898 #5931-70307339885820]  INFO -- : Started GET "/api/v1/channels_twitter?_=1548848605494" for 2a02:…:23b0 at 2019-01-30 12:43:41 +0100
I, [2019-01-30T12:43:41.129583 #5931-70307339885820]  INFO -- : Processing by ChannelsTwitterController#index as JSON
I, [2019-01-30T12:43:42.183169 #5931-70307650490460]  INFO -- : Started GET "/api/v1/external_credentials/twitter/link_account" for 2a02:…:23b0 at 2019-01-30 12:43:42 +0100
I, [2019-01-30T12:43:42.190428 #5931-70307650490460]  INFO -- :   Parameters: {"provider"=>"twitter"}
I, [2019-01-30T12:43:42.722202 #5931-70307650490460]  INFO -- : Redirected to https://api.twitter.com/oauth/authorize?oauth_token=--…
I, [2019-01-30T12:43:45.737308 #5931-70307339871840]  INFO -- : Started GET "/api/v1/external_credentials/twitter/callback?oauth_token=--…&oauth_verifier=…" for 2a02:…:23b0 at 2019-01-30 12:43:45 +0100
I, [2019-01-30T12:43:45.744095 #5931-70307339871840]  INFO -- :   Parameters: {"oauth_token"=>"--…", "oauth_verifier"=>"…", "provider"=>"twitter"}
I, [2019-01-30T12:43:47.400984 #5931-70307339871840]  INFO -- : Redirected to https://support.rami.io/#channels/twitter/8
I, [2019-01-30T12:43:48.717842 #5931-70307339885820]  INFO -- : Started GET "/api/v1/channels_twitter?_=1548848627791" for 2a02:…:23b0 at 2019-01-30 12:43:48 +0100
I, [2019-01-30T12:43:48.723376 #5931-70307339885820]  INFO -- : Processing by ChannelsTwitterController#index as JSON
I, [2019-01-30T12:44:11.587083 #5931-70307339871840]  INFO -- : Started POST "/api/v1/channels_twitter/8" for 2a02:…:23b0 at 2019-01-30 12:44:11 +0100
I, [2019-01-30T12:44:11.597494 #5931-70307339871840]  INFO -- : Processing by ChannelsTwitterController#update as JSON
I, [2019-01-30T12:44:11.597694 #5931-70307339871840]  INFO -- :   Parameters: {"area"=>"Twitter::Account", "options"=>{"adapter"=>"twitter", "user"=>{"id"=>…, "screen_name"=>"pretixeu", "name"=>"pretix"}, "auth"=>{"external_credential_id"=>1, "oauth_token"=>"…", "oauth_token_secret"=>"…", "consumer_key"=>"…", "consumer_secret"=>"…"}, "sync"=>{"webhook_id"=>"", "track_retweets"=>false, "mentions"=>{"group_id"=>"9"}, "direct_messages"=>{"group_id"=>"9"}, "search"=>[]}}, "group_id"=>nil, "active"=>true, "id"=>"8"}
I, [2019-01-30T12:44:12.005019 #5931-47137720546680]  INFO -- : Started GET "/api/v1/channels_twitter?_=1548848627807" for 2a02:…:23b0 at 2019-01-30 12:44:12 +0100
I, [2019-01-30T12:44:12.010727 #5931-47137720546680]  INFO -- : Processing by ChannelsTwitterController#index as JSON
I, [2019-01-30T12:44:20.436356 #5931-70307374877540]  INFO -- : Started GET "/api/v1/external_credentials/twitter/link_account" for 2a02:…:23b0 at 2019-01-30 12:44:20 +0100
I, [2019-01-30T12:44:20.441759 #5931-70307374877540]  INFO -- :   Parameters: {"provider"=>"twitter"}
I, [2019-01-30T12:44:20.776232 #5931-70307374877540]  INFO -- : Redirected to https://api.twitter.com/oauth/authorize?oauth_token=…
I, [2019-01-30T12:44:23.329907 #5931-70307339885820]  INFO -- : Started GET "/api/v1/external_credentials/twitter/callback?oauth_token=…&oauth_verifier=…" for 2a02:…:23b0 at 2019-01-30 12:44:23 +0100
I, [2019-01-30T12:44:23.335028 #5931-70307339885820]  INFO -- :   Parameters: {"oauth_token"=>"…", "oauth_verifier"=>"…", "provider"=>"twitter"}
I, [2019-01-30T12:44:24.963013 #5931-70307339885820]  INFO -- : Redirected to https://support.rami.io/#channels/twitter/8
I, [2019-01-30T12:44:26.218570 #5931-47137720546680]  INFO -- : Started GET "/api/v1/channels_twitter?_=1548848665152" for 2a02:…:23b0 at 2019-01-30 12:44:26 +0100
I, [2019-01-30T12:44:26.226071 #5931-47137720546680]  INFO -- : Processing by ChannelsTwitterController#index as JSON
I, [2019-01-30T12:44:28.066560 #5931-47137720546680]  INFO -- : Started POST "/api/v1/channels_twitter/8" for 2a02:…:23b0 at 2019-01-30 12:44:28 +0100
I, [2019-01-30T12:44:28.076235 #5931-47137720546680]  INFO -- : Processing by ChannelsTwitterController#update as JSON
I, [2019-01-30T12:44:28.076351 #5931-47137720546680]  INFO -- :   Parameters: {"area"=>"Twitter::Account", "options"=>{"adapter"=>"twitter", "user"=>{"id"=>4362252801, "screen_name"=>"pretixeu", "name"=>"pretix"}, "auth"=>{"external_credential_id"=>1, "oauth_token"=>"…", "oauth_token_secret"=>"…", "consumer_key"=>"…", "consumer_secret"=>"…"}, "sync"=>{"webhook_id"=>"", "track_retweets"=>false, "mentions"=>{"group_id"=>"9"}, "direct_messages"=>{"group_id"=>"9"}, "search"=>[]}, "subscribed_to_webhook_id"=>"…"}, "group_id"=>nil, "active"=>true, "id"=>"8"}
I, [2019-01-30T12:44:28.742588 #5931-70307339885820]  INFO -- : Started GET "/api/v1/channels_twitter?_=1548848665162" for 2a02:…:23b0 at 2019-01-30 12:44:28 +0100
I, [2019-01-30T12:44:28.752236 #5931-70307339885820]  INFO -- : Processing by ChannelsTwitterController#index as JSON
I, [2019-01-30T12:48:46.835649 #5931-70307339885820]  INFO -- : Started GET "/api/v1/channels_twitter?_=1548848665187" for 2a02:…:23b0 at 2019-01-30 12:48:46 +0100
I, [2019-01-30T12:48:46.843058 #5931-70307339885820]  INFO -- : Processing by ChannelsTwitterController#index as JSON
I, [2019-01-30T12:43:18.081499 #5931-47137720546680]  INFO -- : Started GET "/api/v1/channels_twitter_webhook?crc_token=…&nonce=…" for … at 2019-01-30 12:43:18 +0100
I, [2019-01-30T12:43:18.085266 #5931-47137720546680]  INFO -- : Processing by ChannelsTwitterController#webhook_verify as HTML
I, [2019-01-30T12:43:18.982109 #5931-70307650490460]  INFO -- :   Parameters: {"name"=>"twitter", "credentials"=>{"consumer_key"=>"…", "consumer_secret"=>"…", "oauth_token"=>"22133603-…", "oauth_token_secret"=>"…", "env"=>"zammad", "controller"=>"external_credentials", "action"=>"app_verify", "provider"=>"twitter", "webhook_id"=>"…"}, "id"=>"c-0"}

Vejo uma chamada de verificação do Twitter para verificar seu web hook. Mas não vejo chamadas http do Twitter para o seu webhook.

- => Parece que o Twitter não está enviando mensagens para o seu webhook. Você tem um host https, certo? Talvez algo errado com o seu certificado SSL? Algum outro erro em log / production.log que esteja relacionado ao Twitter?

Encontramos o mesmo problema em nossa instância, executando a versão atual.

Mesmo aqui, encontrei algo que pode ajudar?
Esse canal não existe para o ID de usuário '1090618064528424961'!

I, [2019-01-31T12:53:22.891153 #1-70353379302120]  INFO -- : Started POST "/api/v1/channels_twitter_webhook" for ::ffff:172.21.0.10 at 2019-01-31 12:53:22 +0000
I, [2019-01-31T12:53:22.896366 #1-70353379302120]  INFO -- : Processing by ChannelsTwitterController#webhook_incoming as HTML
I, [2019-01-31T12:53:22.896571 #1-70353379302120]  INFO -- :   Parameters: {" some data removed "}
E, [2019-01-31T12:53:22.960167 #1-70353379302120] ERROR -- : No such channel for user id '1090618064528424961'! (Exceptions::UnprocessableEntity)
/opt/zammad/app/controllers/channels_twitter_controller.rb:32:in 'validate_webhook_signature!'

@nicolaswurtz Isso está relacionado ao problema da comunidade, ainda não encontramos a causa, seria ótimo se pudéssemos manter a discussão sobre isso fora deste rastreador. :-)

@raphaelm Por favor, dê feedback ao Martin, especialmente sobre a questão SSL.

@rixx Exatamente o mesmo problema que @raphaelm ? Forneça arquivos de log.

@martini

- => Parece que o Twitter não está enviando mensagens para o seu webhook. Você tem um host https, certo?

sim.

Talvez algo errado com o seu certificado SSL?

Não que eu consiga pensar em: https://www.ssllabs.com/ssltest/analyze.html?d=support.rami.io&latest

Algum outro erro em log / production.log que esteja relacionado ao Twitter?

Não consigo encontrar nenhum.

O Twitter fornece alguma ferramenta para depurar webhooks? Não consegui encontrar nada.

Eu acho que este é realmente o mesmo problema - @raphaelm você poderia adicionar -A 1 ao seu comando grep para ver uma linha depois? O erro não contém a palavra "twitter", acho que veremos a mesma linha que eu vi.

E, [2019-01-31T12:53:22.960167 #1-70353379302120] ERROR -- : No such channel for user [...]

Não, não é o mesmo problema. "Não existe tal canal para o usuário" não aparece no log e já verifiquei se os IDs de usuário correspondem

Ok, então podemos ter dois problemas diferentes aqui @martini

Pequena atualização sobre o problema.
Aprendemos que isso só ocorre se o ID do usuário for muito longo.
Isso foi encontrado por um usuário da comunidade "abelxluck".

A postagem pode ser encontrada aqui: https://community.zammad.org/t/dont-receive-twitter-dms-railsserver-error/1799/34

Alguma atualização ou correção entretanto?

Ei @schiederme - infelizmente ainda não há atualizações. Como @MrGeneration descrito anteriormente, houve algumas pesquisas na comunidade indicando que o ID armazenado pode estar errado. Eu escrevi um pequeno script para comparar o ID armazenado com o ID que recebemos da API do Twitter para cada canal do Twitter. Ele também imprimirá o ID para que você possa / deve verificar se este é o ID real da sua conta. Feedback seja bem-vindo!

    Channel.where(area: 'Twitter::Account').each do |channel|
      client = Twitter::REST::Client.new do |config|
        config.consumer_key        = channel.options['auth']['consumer_key']
        config.consumer_secret     = channel.options['auth']['consumer_secret']
        config.access_token        = channel.options['auth']['oauth_token']
        config.access_token_secret = channel.options['auth']['oauth_token_secret']
      end

      if channel.options['user']['id'] != client.user.id
        puts "ATTENTION: Found ID mismatch. Local ID '#{channel.options['user']['id']}' doesn't match with received remote ID '#{client.user.id}'."
      else
        puts "Local ID '#{channel.options['user']['id']}' matches with received remote ID. Please double check if this is the ID of your twitter account (via e.g. https://tweeterid.com)."
      end
    end

A saída é semelhante a esta:
Local ID '785412523193425920' matches with received remote ID. Please double check if this is the ID of your twitter account (via e.g. https://tweeterid.com).

Você pode executá-lo criando um arquivo chamado debug_issue.rb em seu diretório Zammad (normalmente /opt/zammad ). Em seguida, execute o arquivo do diretório Zammad via zammad run rails r debug_issue.rb ou rails r debug_issue.rb como usuário zammad, dependendo da fonte de instalação (pacote / fonte). Depois de terminar, você pode / deve excluir o arquivo debug_issue.rb .

Eu tentei o script com minha conta ( @ level66network no Twitter) e minha instalação do Zammad também, e parece que os IDs realmente não correspondem na instalação.

ATTENTION: Found ID mismatch. Local ID '1170020461641642000' doesn't match with received remote ID '1170020461641641990'.

Em meus logs, também encontro o seguinte problema acionado pelo webhook.

No such channel for user id '1170020461641641990'! (Exceptions::UnprocessableEntity)

Uau! É realmente isso! Descobrimos que o ID é enviado corretamente do backend (Ruby) para o frontend (JavaScript), o que quebra o número porque não consegue lidar com esses inteiros grandes corretamente, como "abelxluck" descobriu aqui .

Portanto, o erro ocorre quando você abre um canal do Twitter para editá-lo e depois salvar suas alterações. Após este ponto, você não poderá mais receber mensagens diretas do Twitter.

Você pode consertar seus canais quebrados executando o comando:

Channel.where(area: 'Twitter::Account').each do |channel|

  client = Twitter::REST::Client.new do |config|
    config.consumer_key        = channel.options['auth']['consumer_key']
    config.consumer_secret     = channel.options['auth']['consumer_secret']
    config.access_token        = channel.options['auth']['oauth_token']
    config.access_token_secret = channel.options['auth']['oauth_token_secret']
  end

  channel.options['user']['id'] = client.user.id

  channel.save!
end

Por meio do console de trilhos Zammad .

No entanto, isso só funcionará até que você salve / edite seu canal do Twitter por meio da interface de administrador novamente. Estamos trabalhando em uma solução sustentável para isso.

@rlue - você pode assumir o comando a partir daqui? Precisamos converter o ID em uma string e armazená-lo dessa forma. Meu script de hot fix pode ser o ponto de partida para a migração necessária. Além disso, precisamos alterar o código que inicialmente busca e armazena o ID como um inteiro . Além disso, precisamos encontrar os outros lugares que usam o ID e nos certificar de que lidam com a versão da string de maneira adequada.

Eu esqueci de mencionar: muito obrigado @MrXermon por entrar tão rápido! Sua opinião e a de abelxluck me ajudaram a encontrar a causa raiz no contexto de Zammad. A correção está a caminho 🚂

Obrigado @thorsteneckel , o trabalho em torno funciona!

Obrigado @thorsteneckel por criar a solução alternativa! Também funciona com o meu sistema! <3

Além disso, precisamos encontrar os outros lugares que usam o ID e nos certificar de que lidam com a versão da string de maneira adequada.

@thorsteneckel , é seguro assumir que

$ grep "\['user'\]\['id'\]"

deve encontrar todas as instâncias que estamos procurando?

Eu sugiro cavar para 'Twitter::Account' . Esse é o identificador para todos os canais do Twitter, que têm id armazenado no atributo options .

Corrigido com o commit acima. Será lançado com Zammad 3.2 que chegará em breve (1-2 semanas).

Esta página foi útil?
0 / 5 - 0 avaliações