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.