Migração do Yahoo! Groups

Eu não tenho arquivos mbox e não conheço nenhuma maneira de obtê-los — o Yahoo certamente não me permite baixá-los. Você conhece algo que converta JSON para mbox? O Google mostra várias ferramentas para fazer o caminho inverso, mas não vejo nada que cubra isso rapidamente.

Eu esperava que, como já existiam scripts projetados especificamente para migrar grupos do Yahoo, esses scripts funcionassem de verdade, e que essa fosse a maneira mais direta de realizar essa tarefa. Parece que minha expectativa foi otimista: os scripts “funcionam” no sentido de que migram as mensagens e, de certa forma, migram os usuários, mas perder a maioria dos endereços de e-mail e atribuir a maioria das mensagens ao usuário errado é um problema considerável.

O que me está frustrando é que parece que isso deveria ser uma correção trivial para alguém que realmente entende um pouco de Ruby — mas, infelizmente, não sou essa pessoa (estou tentando, mas nunca há tempo suficiente para tudo). Meu grupo é pequeno o suficiente para que eu possa corrigi-lo manualmente se precisar, mas prefiro não precisar. E, mais importante ainda, estou tentando criar um método geral que outros proprietários de grupos do Yahoo possam usar.

Edição: Acho que deveria estar feliz por estar conseguindo fazer tanto em uma linguagem sobre a qual realmente não sei nada, mas ainda sinto que estou deixando passar algo importante (que deveria ser óbvio). Tentei usar um método diferente com a gem Mail. A parte de import_users que editei está assim:

    create_users(profiles.to_a) do |u|

      user_id = user_id + 1

      # busca a última mensagem do perfil para pegar as informações mais recentes do usuário, pois isso pode ter mudado
      user_info = @collection.find("ygData.profile": u["_id"]["profile"]).sort("ygData.msgId": -1).limit(1).to_a[0]

      # Armazena user_id para consulta de perfil
      @user_profile_map.store(user_info["ygData"]["profile"], user_id)

      puts "Usuário criado: #{user_info["ygData"]["profile"]}"
      
      user_email = Mail::Address.new(HTMLEntities.new.decode(user_info["ygData"]["from"]))

      user =
       {
        id: user_id,  # a sequência "userId" do Yahoo parece ter mudado no meio da vida do fórum, então geramos isso
        username: user_info["ygData"]["profile"],
        name: user_info["ygData"]["authorName"],
        email: user_email.address, # obrigatório
        created_at: Time.now
      }
      user
    end

E funciona! Bem, na maioria das vezes. De 302 usuários distintos contados pelo script, são importados 289. Eles aparecem na página de administração com os nomes de usuário corretos, nomes completos (quando fornecidos) e endereços de e-mail. O script diz que importou todos os 302 e não reporta erros. Mas quando começa a importar os tópicos, recebo o seguinte:

Importando discussões
Tópico: 1 / 12232  (0,01%)  Assunto: Newspapers
Tópico: 2 / 12232  (0,02%)  Assunto: Ents
Traceback (most recent call last):
	8: from script/import_scripts/yahoogroup.rb:168:in `<main>'
	7: from /home/dan/discourse/script/import_scripts/base.rb:47:in `perform'
	6: from script/import_scripts/yahoogroup.rb:40:in `execute'
	5: from script/import_scripts/yahoogroup.rb:101:in `import_discussions'
	4: from script/import_scripts/yahoogroup.rb:101:in `each_with_index'
	3: from script/import_scripts/yahoogroup.rb:101:in `each'
	2: from script/import_scripts/yahoogroup.rb:132:in `block in import_discussions'
	1: from /home/dan/discourse/script/import_scripts/base.rb:535:in `create_post'
/home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-6.0.0/lib/active_record/core.rb:177:in `find': Couldn't find User with 'id'=298 (ActiveRecord::RecordNotFound)

…o que não é surpreendente, já que o maior ID de usuário é 290.

O Discourse teria algum log que indicasse quais usuários não foram criados e o motivo? Onde eles estariam?

Destaquei meu erro. Acontece que a Yahoo permite o download deles, mas é um processo um pouco trabalhoso, e em nenhum lugar é informado que os arquivos obtidos serão no formato mbox. A Yahoo possui uma ferramenta “Baixar meus dados”. Acesse-a, faça login, envie uma solicitação e aguarde até receber a notificação deles (levou cerca de uma semana para mim). Eles enviarão um e-mail com uma URL; ao acessá-la, você poderá baixar um arquivo .zip que parece conter a maior parte do conteúdo de todos os grupos dos quais você é membro (as fotos parecem estar ausentes). Um tanto surpreendentemente, os arquivos .mbox contêm endereços de e-mail completos, mesmo para grupos dos quais você não é moderador.

Portanto, @gerhard, parece que fui precipitado ao descartar sua sugestão — peço desculpas.

Edição: Sim, o processo de conversão para .mbox parece funcionar muito melhor. Algumas mensagens estão sendo ignoradas (cerca de 100, por exemplo, devido à ausência de data), mas quase todas as 38 mil mensagens foram incluídas, todos os usuários também (e uma verificação aleatória indica que todos estão associados às postagens corretas), todos com os endereços de e-mail corretos. Não é perfeito para manter os tópicos agrupados (o outro script também não o era), mas está funcionando bastante bem. E, como bônus, é um método mais simples de documentar do que o que eu vinha tentando fazer. A única desvantagem que vejo até agora é o atraso para que a Yahoo torne seus dados disponíveis para download.

Uau! Isso é bastante estranho. Imagino que eles considerem que, se você já esteve na lista, já possui os endereços de e-mail.

Isso é uma boa notícia — acabei de fazer o download e parece que tenho um arquivo bastante abrangente de mensagens do meu grupo do Yahoo que gostaria de preservar, em formato mbox, prático e portátil. Ótimo!