Migração do Yahoo! Groups

Muitos grupos do Yahoo estão sendo afetados pela decisão da empresa de eliminar conteúdo carregado e estão buscando provedores alternativos. O mais óbvio é o groups.io, que oferece paridade de recursos e migra automaticamente todo o conteúdo do grupo, mas (1) custa US$ 220 no primeiro ano para realizar a migração (depois disso, é gratuito se os requisitos de armazenamento forem < 1 GB) e (2) ainda utiliza o mesmo formato centrado em e-mail do Yahoo Groups. Vi mencionado em outro tópico (Yahoo Groups to Discourse migration?) que existe um script de migração, mas, pelo que pude ver (admito que pouco até agora), ele migra apenas as mensagens.

Como a mudança no Yahoo que levará os grupos a migrar é a perda do armazenamento de arquivos e fotos, isso deixa duas perguntas:

  • Existe uma maneira automatizada de mover conteúdo carregado de um grupo do Yahoo para uma instância do Discourse?
  • Quais são as opções no Discourse para tornar esse conteúdo disponível/visível para outros usuários? A única que estou vendo seria que o conteúdo carregado por um usuário fosse inserido em um ou mais tópicos criados por esse usuário, provavelmente em categorias distintas. Para fotos, isso seria bastante direto; para outros documentos carregados no grupo (principalmente PDFs, alguns arquivos .doc e .xls), parece que seria necessário algumas alterações de configuração, mas nada muito grave. Mas existe outra opção?

Interessante… Eu não sabia que o Yahoo Groups estava se livrando do conteúdo enviado. Tenho um antigo grupo do Yahoo que ainda mantenho para o meu bairro e tem ficado na minha mente migrá-lo para uma instância do Discourse… talvez esteja na hora.

A maneira mais fácil de migrar, na minha opinião, seria exportar a lista de assinantes para CSV e, em seguida, usá-la para criar sua base de usuários no Discourse — isso deve ser bastante direto.

Quanto ao conteúdo, você tem um histórico completo das mensagens enviadas para a lista no seu e-mail? Se sim, você pode usar um aplicativo como o Thunderbird para baixar todas as mensagens e salvá-las em formato MBOX. Uma vez que você tenha isso, existem scripts para importação. Acredito que esta receita possa ajudá-lo: Migrate a mailing list to Discourse (mbox, Listserv, Google Groups, etc)

Não tenho certeza sobre o que você descreve como conteúdo enviado — eu mesmo não usei o Yahoo Groups dessa maneira. Não sei quais são suas opções para retirar esses arquivos do Yahoo e prepará-los para o Discourse. Pode ser um processo manual… e talvez uma boa oportunidade para se organizar e descartar o que não é mais necessário.

Mas, sim, o Discourse é orientado para discussões, então todo o conteúdo está em tópicos. É possível configurar tópicos como wikis para que possam ser mantidos por um grupo, incluindo a adição/remoção de anexos. Também existem mensagens pessoais que podem ser usadas para conversar consigo mesmo ou com uma seleção escolhida de outras pessoas, onde, imagino, as pessoas possam manter algum conteúdo. Pode ser mais fácil para você procurar outra ferramenta com SSO para compartilhamento de arquivos. Na minha comunidade, usamos o WordPress, que possui um plugin que gerencia o SSO, funcionando de forma bastante integrada. Se você está falando de muitos arquivos, pode configurar uma instância do Nextcloud.

Divirta-se!

Atualização: uau… certamente parece que é hora de mudar. Eles estão realmente tomando medidas drásticas para limitar a utilidade dos grupos do Yahoo, muito em breve. Sem novo conteúdo a partir de 28 de outubro, em dois dias! E o conteúdo será removido em 14 de dezembro.

Não tenho, embora eu não seja administrador de nenhuma das listas com as quais estou lidando. Mas a migração das mensagens parece ser abordada por discourse/script/import_scripts/yahoogroup.rb at main · discourse/discourse · GitHub e GitHub - jonbartlett/yahoo-groups-export: Export Yahoo Groups forum to file or database · GitHub. Além disso, um administrador do grupo poderia exportar as mensagens do grupo com os endereços de e-mail anexados (o que um usuário comum não pode fazer). Embora não pareça ser algo extremamente simples de executar, as mensagens parecem ser a menor das preocupações neste momento.

O Yahoo Groups fornecia (bem, fornecia) espaço de armazenamento para fotos (100 GB) e outros arquivos (2 GB) para o grupo. Os grupos dos quais faço parte usavam isso para fotos dos membros do grupo e itens de interesse para o grupo, além de vários outros arquivos. Qualquer coisa que fosse enviada privadamente entre os membros em um grupo do Yahoo provavelmente teria sido enviada como um e-mail, e o Yahoo não teria nenhum registro disso; eu não acharia que migrar isso seria possível, muito menos uma prioridade. Mas há muitas informações armazenadas lá em muitos grupos, que eles desejariam preservar em uma migração.

Pode ser. Novamente, há um (e apenas um, que eu saiba) site que parece ser uma substituição pronta para uso, mas ele mantém o formato antigo dos grupos do Yahoo com apenas pequenas alterações. Estou pensando que, se um grupo precisa migrar de qualquer forma, seria bom migrar para algo mais moderno, e o Discourse ainda funciona muito bem com e-mail (o que muitos outros pacotes de fórum não fazem), o que significa que as pessoas mais tradicionais, como eu, que estão acostumadas a receber o e-mail entregue e responder por e-mail, ainda podem fazer isso. E economizar alguns dólares também seria bom.

Então, novos desenvolvimentos. Esta ferramenta:

parece funcionar muito bem no download em massa do conteúdo de um grupo—ela baixa todas as mensagens, arquivos, anexos, etc. As mensagens são baixadas em dois arquivos .json cada, um “cru” e o outro em HTML. O primeiro se parece com:

{
    "userId": 185744666,
    "authorName": "vhsproducts@aol.com",
    "from": "vhsproducts@...",
    "profile": "vhsproducts",
    "replyTo": "LIST",
    "senderId": "fc-T6L4xNaFRDleu_7gutRzgA_WWujKXanij68LOf7iz0WXh-BolDsmiqlo19adwRPTjwe0FpCYycg",
    "spamInfo": {
        "isSpam": false,
        "reason": "0"
    },
    "subject": "Re: [MicroTrak] Mint-Trak300 completed",
    "postDate": "1181013131",
    "msgId": 4,
    "canDelete": false,
    "contentTrasformed": false,
    "systemMessage": false,
    "headers": {
        "messageIdInHeader": "PGM3ZC5lNWZlOTFjLjMzOTYyZThiQGFvbC5jb20+"
    },
    "prevInTopic": 3,
    "nextInTopic": 6,
    "prevInTime": 3,
    "nextInTime": 5,
    "topicId": 3,
    "numMessagesInTopic": 4,
    "msgSnippet": "Outstanding work! I see you have the first gen of the Micro-Trak ( although we still sell them for people with TT3 SMT s) How long will a 9 volt run your GPS? ",
    "rawEmail": "Return-Path: &lt;VHSProducts@...&gt;\r\nX-Sender: VHSProducts@...\r\nX-Apparently-To: MicroTrak@yahoogroups.com\r\nReceived: (qmail 18487 invoked from network); 5 Jun 2007 03:13:19 -0000\r\nReceived: from unknown (66.218.67.36)\n  by m50.grp.scd.yahoo.com with QMQP; 5 Jun 2007 03:13:19 -0000\r\nReceived: from unknown (HELO imo-m23.mx.aol.com) (64.12.137.4)\n  by mta10.grp.scd.yahoo.com with SMTP; 5 Jun 2007 03:13:19 -0000\r\nReceived: from VHSProducts@...\n\tby imo-m23.mx.aol.com (mail_out_v38_r9.2.) id r.c7d.e5fe91c (29679)\n\t for &lt;MicroTrak@yahoogroups.com&gt;; Mon, 4 Jun 2007 23:12:11 -0400 (EDT)\r\nMessage-ID: &lt;c7d.e5fe91c.33962e8b@...&gt;\r\nDate: Mon, 4 Jun 2007 23:12:11 EDT\r\nTo: MicroTrak@yahoogroups.com\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative; boundary=&quot;-----------------------------1181013131&quot;\r\nX-Mailer: 9.0 Security Edition for Windows sub 5365\r\n(snip)"
}

…enquanto o último se parece com:

{
    "userId": 185744666,
    "authorName": "vhsproducts@aol.com",
    "from": "vhsproducts@...",
    "profile": "vhsproducts",
    "replyTo": "LIST",
    "senderId": "oChpSVZSELyeHvFRyDX_nG5dfpdVZTLBKFMDvOg33fSsrDk5l-zpPohl42rhz6OhM9tFfSjAxxGsRg",
    "spamInfo": {
        "isSpam": false,
        "reason": "0"
    },
    "subject": "Re: [MicroTrak] Mint-Trak300 completed",
    "postDate": "1181013131",
    "msgId": 4,
    "canDelete": false,
    "contentTrasformed": false,
    "systemMessage": false,
    "headers": {
        "messageIdInHeader": "PGM3ZC5lNWZlOTFjLjMzOTYyZThiQGFvbC5jb20+"
    },
    "prevInTopic": 3,
    "nextInTopic": 6,
    "prevInTime": 3,
    "nextInTime": 5,
    "topicId": 3,
    "numMessagesInTopic": 4,
    "msgSnippet": "Outstanding work! I see you have the first gen of the Micro-Trak ( although we still sell them for people with TT3 SMT s) How long will a 9 volt run your GPS? ",
    "messageBody": "<div id=\"ygrps-yiv-810547383\">\n<html><head>\n \n</head> \n\n<font id=\"ygrps-yiv-810547383role_document\"\n face=\"Arial\" color=\"#000000\" size=\"2\">\n<div>Outstanding work! I see you have the first gen of the Micro-Trak ( although \nwe still sell them for people with TT3 SMT&#39;s) How long will a 9 volt run your \nGPS?</div>\n(snip)",
    "specialLinks": []
}

Dependendo do grupo, pode haver dezenas ou até centenas de milhares desses arquivos. O Yahoo, sendo o Yahoo, mascara os endereços de e-mail para usuários “comuns”—os donos do grupo podem vê-los, e talvez os moderadores, mas o resto não pode. Agora, vamos ver se há uma maneira relativamente direta de importar tudo isso em massa para uma instância do Discourse, ou se seria melhor usar as ferramentas que mencionei acima.

Arquivos e fotos também são baixados por essa ferramenta, junto com enquetes, calendários e outras coisas das quais eu realmente não me importo, mas sem dúvida outros se importariam.

Outro ponto—uma leitura mais cuidadosa da mensagem do Yahoo indica que não apenas eles estão se livrando de arquivos e fotos, mas também estão eliminando os arquivos de mensagens. Isso realmente vai torná-los inúteis para qualquer finalidade.

Por favor, migre para o Discourse.

Precisamos de mais sites independentes e de menos pessoas dependendo das grandes plataformas monopolistas.

Apenas para dizer que migrei minha comunidade local de um Yahoo Group para o Discourse anos atrás e nunca mais nos arrependemos. Os toques pessoais que você pode adicionar ao seu recurso de comunicação compartilhada já valem a pena por si só, mas os recursos adicionais são o ponto alto.

Infelizmente, não posso oferecer uma experiência útil sobre a migração, pois simplesmente começamos do zero, exceto pela lista de e-mails. Por que não deixar o site antigo do Yahoo Group no ar e fornecer um link? Quantos anexos você realmente precisa manter? Foque nos mais importantes?

Boa sorte, você vai se dar bem!

Não é uma decisão minha diretamente, mas tenho inclinações nessa direção. E, para o grupo que mais me preocupa, não espero que os arquivos/fotos sejam um grande problema — agora os tenho todos baixados, e como são poucos, transferi-los manualmente para os tópicos não deve ser um grande obstáculo.

Sim, porque estamos vendo agora um dos riscos disso.

Porque em seis semanas todos os dados desaparecerão de lá.

Posso criar um importador para ler esses arquivos JSON, mas não consigo competir com $200. Normalmente cobro 10 vezes esse valor para desenvolver um importador e migrar um fórum de tamanho moderado (algumas centenas de milhares de posts).

Então, parece que seria melhor eu usar:

seguido por:

…assim que eu entender como eles funcionam.

(Edições principais abaixo–segunda tentativa)

Trabalhando no processo de importação de mensagens, usando as instruções em Migrate from another forum to Discourse. Pelo que entendi, o processo deve ser assim:

  • Configurar o ambiente de desenvolvimento usando Install Discourse on Ubuntu or Debian for Development
  • Instalar o MongoDB nesse sistema
  • Nesse sistema, como o mesmo usuário não privilegiado que está executando o Discourse, fazer git clone do script yahoo-group-export
  • Como o mesmo usuário, executar gem install mechanize; gem install mongo. Em seguida, editar .config.yaml para fornecer as credenciais do Yahoo e o nome do grupo, e rodar ruby bin/yg-export.rb.
  • Tomar uma xícara (ou duas) da sua bebida preferida.
  • Assim que o yg-export terminar, no diretório do Discourse, dê uma olhada em script/import_scripts/yahoogroup.rb. Edite-o para apontar para o MONGODB_HOST correto (localhost).
  • No diretório do discourse, execute bundle exec ruby script/import_scripts/yahoogroup.rb
  • Verifique se foi importado corretamente
  • Faça backup e restaure em um servidor ao vivo

Os passos 2 a 4 são inferidos. Mas isso parece ser o caminho certo a seguir? Acreditando que eram, prossegui. Tudo funcionou bem até o passo 4–o yg-export.rb rodou por cerca de uma hora, relatando SUCESSO para tudo e salvando ~38k mensagens. O banco de dados syncro está presente com ~85MB de dados nele. Nesse ponto, fiz um snapshot da VM.

Estou tendo problemas com o script de importação, no entanto. Quando executo bundle exec ruby script/import_scripts/yahoogroup.rb, recebo isso:

dan@ubuntu:~/discourse$ bundle exec ruby script/import_scripts/yahoogroup.rb
Traceback (most recent call last):
script/import_scripts/yahoogroup.rb: Bootsnap::LoadPathCache::FallbackScan
        7: from script/import_scripts/yahoogroup.rb:4:in `<main>'
        6: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/kernel.rb:23:in `require'
        5: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:26:in `require'
        4: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:40:in `rescue in require'
        3: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi'
        2: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/loaded_features_index.rb:89:in `register'
        1: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi'
/home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require': cannot load such file -- mongo (LoadError)

Estranho, pensei que já tivesse instalado o gem mongo. Bom, vou fazer de novo:

dan@ubuntu:~/discourse$ gem install mongo
Successfully installed mongo-2.10.2
Parsing documentation for mongo-2.10.2
Done installing documentation for mongo after 4 seconds
1 gem installed

Rodo o script de importação novamente, mesmo resultado. Importa se eu instalá-lo no nível do sistema?

dan@ubuntu:~/discourse$ sudo apt install ruby-mongo
[sudo] password for dan: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
ruby-mongo is already the newest version (2.5.1-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Mais curioso ainda…

Você precisa adicionar as gems ao Gemfile e executar bundle install, caso contrário, ao rodar bundle exec ruby script/import_scripts/yahoogroup.rb, as gems não serão encontradas.

Essa era a peça que faltava; agora a importação está correndo tranquilamente. Obrigado!

Edição: OK, o processo de importação rodou por 75 minutos e as postagens já estão lá. Excelente. Ele também criou usuários, o que eu estava me perguntando. No entanto, estou vendo alguns problemas com os usuários:

  • Parece que todos os nomes de usuários do Yahoo foram importados corretamente (reconheço muitos deles por minha participação na lista), mas foram associados às mensagens erradas. Isso aconteceu de forma consistente: todas as mensagens que eu publiquei agora aparecem como tendo sido publicadas pelo mesmo outro usuário. Ainda assim, é um erro significativo que seria um grande trabalho corrigir manualmente.
  • Todos os usuários importados estão suspensos pelos próximos 200 anos.

Suspeito que ambos os problemas decorram da falta de endereços de e-mail válidos nos dados baixados do Yahoo, o que ocorre porque eu não sou administrador do grupo. Isso é explicitamente citado como a causa do segundo problema, mas não sei se também causaria o primeiro. O que vocês acham?

Se for esse o problema, isso me dá algo para investigar, mas também traz um potencial problema: sei que há dois moderadores vivos para o grupo, mas o proprietário faleceu no último ano. Espero que alguém tenha acesso a essas informações…

Olá,

Existe um novo plugin para isso.

Exportei e importei todas as mensagens do Yahoo! de uma versão de desenvolvimento como uma categoria usando este script:
https://meta.discourse.org/t/topic-and-category-export-import/38930/38

Agora surgiu o problema com usuários duplicados ou incorretos.
Com este Plugin: Merge Users Plugin
Você pode mesclar facilmente os usuários do Yahoo com os usuários do Discourse.

E agora só restou o problema com os anexos do Yahoo.

Isso não faz exatamente o que eu preciso — os únicos usuários presentes nesta instância, além do usuário administrador, são os usuários importados do Yahoo. O problema é que o nome de usuário errado está associado às postagens erradas — minhas postagens estão conectadas (consistentemente, pelo que pude verificar) ao nome de usuário de outra pessoa, e as postagens de outra pessoa estão conectadas às minhas.

Agora recebi acesso de moderador a este grupo, o que é suficiente para baixar mensagens com endereços de e-mail reais anexados. Vou reconstruir (VMs são ótimas para isso), refazer a importação e ver se isso resolve o problema.

Ei, tudo bem, isso não é a mesma coisa que eu descobri. Na minha comunidade, nada dos posts importados estava conectado a nenhum dos membros existentes da comunidade.
Se eu importei a categoria conforme descrito no tópico vinculado, então eu tinha apenas usuários duplicados (ou alguém novo) na lista de usuários.

O importador atribuiu os posts ao usuário errado, mas fez isso da maneira correta. Quero dizer, se os posts que eu escrevi no Yahoo! foram atribuídos a “Hans”, então todos os meus posts foram atribuídos a “Hans”.

Eu tenho o ID de usuário 1 na minha comunidade do fórum, mas esse não é o mesmo nome do fórum Discourse para desenvolvimento que configurei. Então, minha conta não foi sobrescrita, mas havia outra conta com o mesmo nome. No entanto, essa conta está vinculada aos posts errados.

Agora, estou usando o plugin vinculado para mesclar todos os usuários separadamente à pessoa correta no meu fórum. Não leva muito tempo, mas é difícil descobrir qual post pertence a qual usuário.

Nós provavelmente estamos em situações diferentes — no meu caso, não há nenhuma “comunidade existente”. Em vez disso, tudo está sendo importado do grupo Y.

OK, tenho o download das mensagens do grupo, incluindo os endereços de e-mail completos. Após alguns problemas com o ambiente de desenvolvimento, consegui retomar o trabalho na importação. Ainda estou percebendo alguns problemas:

  • O problema de nomes de usuário incorretos serem vinculados a postagens erradas persiste.
  • Possivelmente como causa (ou “uma das causas”) do acima, a maioria dos usuários sendo importados é identificada como tendo endereços de e-mail inválidos. No banco de dados Mongo gerado pelo script yahoo-export, o campo From (do qual o script de importação parece estar tentando ler os endereços de e-mail) aparece para a maioria dos usuários assim:
Primeiro Último &lt;usuario@dominio.com&gt;

…o que o Discourse rejeita como endereço de e-mail inválido. Como resultado, a maioria dos usuários recebe um endereço de e-mail como 5dc3e1b4f4d821bd7de3ce456eaf26d5@email.invalid — as exceções parecem ser os usuários que enviaram e-mails sem seus nomes completos.

  • As mensagens importadas contêm várias entidades HTML, especialmente para aspas e sinais de maior que e menor que.

  • Muitas, mas definitivamente não todas, das mensagens importadas têm um nome de grupo na linha de assunto: Re: [SpareOom] algum assunto. Seria bom remover isso.
    Para os últimos três pontos, estou me perguntando se uma simples operação de localizar/substituir em todo o banco de dados resolveria — e, se sim, como proceder, considerando que nunca trabalhei com MongoDB antes.

  • Um assunto separado é importar as mensagens em uma categoria designada. Os comentários no topo de yahoogroup.rb dizem que você pode executar export CATEGORY_ID=<ID_DA_CATEGORIA> antes de rodar o script para fazer isso, mas não indicam a que se refere <ID_DA_CATEGORIA>. Tentei o nome regular da categoria, bem como o “slug da categoria” (ambos são iguais, exceto pela capitalização), mas em ambos os casos o script de importação falha com:

         1: from /home/dan/discourse/lib/topic_creator.rb:36:in `create'
/home/dan/discourse/lib/topic_creator.rb:115:in `setup_topic_params': category (Discourse::InvalidParameters)

Isso soa muito parecido com minha primeira importação de mbox. Levei alguns meses.

Sim, você provavelmente pode corrigir algumas coisas com algumas substituições.

Se você adicionar .json ao final de uma URL de categoria, poderá encontrar o ID da categoria. É um número inteiro.

Você precisará verificar qual identificador o criador do usuário está usando e o que a função de postagem está usando para encontrar os usuários. Ou talvez eles simplesmente não coincidam.

Ao examinar o yahoogroup.rb, fica claro que ele espera que o campo From da mensagem seja um endereço de e-mail simples. Como a maioria dos usuários configura seus clientes de e-mail para enviar também o nome (por exemplo,

Fred Flintstone <fred@flintstone.com>

), esse é o problema nº 1. Uma rápida pesquisa no Google sugere que isso pode ser resolvido usando a gem Mail, o que alteraria a linha no script de importação para:

        email: Mail::ToField.new(user_info["ygData"]["from"]), # obrigatório

…o que extrairia apenas o endereço de e-mail. Mas, como mencionado acima, os colchetes angulares são armazenados como entidades HTML, o que quebra esse método. Mais pesquisas indicam que existe uma gem HTMLEntities que resolveria isso, levando-me a tentar o seguinte:

        email: Mail::ToField.new(HTMLEntities.new.decode(user_info["ygData"]["from"])), # obrigatório

Mas isso falha devido à falta do método downcase.

Edição: Tentei evitar isso seguindo outro caminho; vi muitas sugestões sobre Nokogiri. Mas, por mais útil que seja, as sugestões que encontrei não decodificavam as entidades de colchetes angulares, o que era (e ainda é) minha necessidade mais imediata. Então, voltei para a gem HTMLEntities. Adicionei require 'mail' e require 'htmlentities' ao topo do script de importação do Yahoo e alterei a linha 75 (que era a linha 73 antes de adicionar os requires) para ler conforme acima. Ainda estou recebendo um erro, mas o que eu havia ignorado anteriormente é que ele realmente analisa e importa um usuário antes de falhar:

dan@ubuntu:~/discourse$ bundle exec ruby script/import_scripts/yahoogroup.rb
Carregando grupos existentes...
Carregando usuários existentes...
Carregando categorias existentes...
Carregando posts existentes...
Carregando tópicos existentes...
(snip)
conectado ao banco de dados....

Importando do Mongodb....

Importando usuários
Usuário criado: user@host.tld
Traceback (most recent call last):
        8: from script/import_scripts/yahoogroup.rb:163:in `<main>'
        7: from /home/dan/discourse/script/import_scripts/base.rb:47:in `perform'
        6: from script/import_scripts/yahoogroup.rb:39:in `execute'
        5: from script/import_scripts/yahoogroup.rb:58:in `import_users'
        4: from /home/dan/discourse/script/import_scripts/base.rb:247:in `create_users'
        3: from /home/dan/discourse/script/import_scripts/base.rb:247:in `each'
        2: from /home/dan/discourse/script/import_scripts/base.rb:259:in `block in create_users'
        1: from /home/dan/discourse/script/import_scripts/base.rb:290:in `create_user'
/home/dan/discourse/script/import_scripts/base.rb:385:in `find_existing_user': undefined method `downcase' for #<Mail::ToField:0x00005575597e63b8> (NoMethodError)

(o endereço de e-mail nesta saída foi mascarado, mas está no banco de dados de origem com o nome completo e as entidades dos colchetes angulares — então parece que minhas alterações no script tiveram exatamente o efeito desejado). Isso me deixou um pouco confuso, pois eu entendia que o downcase deveria estar disponível por padrão.

Edição 2: Bem, ele analisa o usuário, mas não importa realmente o usuário na instância do Discourse.

A questão do e-mail ainda me deixa confuso, mas decidi deixar isso de lado por enquanto e ver se conseguia aplicar HTMLEntítulos ao título do tópico e ao texto da mensagem. No script yahoogroup.rb, alterei a linha 110 para:

        topic_title = HTMLEntities.new.decode(topic_post["ygData"]["subject"])

…e a linha 116 para:

        raw: HTMLEntities.new.decode(topic_post["ygData"]["messageBody"]),

(ambos os números de linha estão +2 em relação ao script original, devido à adição das duas linhas requires que mencionei acima). Funcionou perfeitamente. A saída do terminal não mudou (isso teria sido na linha 105, que só notei depois de iniciar a execução), mas os títulos dos tópicos e o texto na instância importada estão bem limpos.

Então, esse método parece estar funcionando perfeitamente na limpeza dos títulos dos tópicos e dos corpos das mensagens, mas não está funcionando para os endereços de e-mail. Alguma ideia do que eu deveria procurar nesse aspecto? Estou meio travado aí.

Pode ser mais fácil usar Migrate a mailing list to Discourse (mbox, Listserv, Google Groups, etc) para importar dados do Yahoo Groups. Seja usando arquivos mbox ou talvez convertendo os arquivos JSON que você mencionou em arquivos MSG individuais contendo o texto bruto do e-mail.

O script de importação mbox lida com arquivos mbox, bem como com e-mails armazenados em arquivos individuais, e pode já ter resolvido todos os problemas que você está enfrentando agora.