Миграция из Yahoo! Groups

Многие группы Yahoo затронуты решением Yahoo удалить загруженный контент, и их участники ищут альтернативных провайдеров. Очевидный вариант — groups.io, который обеспечивает полное соответствие функциональности и автоматически мигрирует весь контент группы, но (1) стоит 220 долларов за первый год для выполнения миграции (после этого — бесплатно, если требования к хранилищу составляют менее 1 ГБ), и (2) всё ещё использует ту же ориентированную на электронную почту структуру, что и Yahoo Groups. В другой теме (Yahoo Groups to Discourse migration?) упоминается скрипт миграции, но, насколько я могу судить (хотя пока изучил это не слишком подробно), он переносит только сообщения.

Поскольку изменение в Yahoo, которое вынудит группы перейти на другую платформу, связано с утратой хранилища файлов и фотографий, возникают два вопроса:

  • Существует ли автоматизированный способ перенести загруженный контент из группы Yahoo в экземпляр Discourse?
  • Какие возможности предоставляет Discourse для того, чтобы сделать этот контент доступным/видимым для других пользователей? Единственный вариант, который я вижу, — это когда загруженный пользователем контент размещается в одной или нескольких темах, созданных этим пользователем, вероятно, в отдельных категориях. Для фотографий это было бы достаточно просто; для других документов, загруженных в группу (в основном PDF, некоторые файлы .doc и .xls), похоже, потребуются некоторые изменения конфигурации, но ничего слишком серьёзного. Однако есть ли другой вариант?

Интересно… Я не знал, что Yahoo Groups избавляется от загруженного контента. У меня есть старая группа Yahoo, которую я до сих пор поддерживаю для своего района, и мысль о переносе её на экземпляр Discourse уже давно крутилась в голове — возможно, пришло время.

Самый простой способ миграции, на мой взгляд, — экспортировать список подписчиков в CSV, а затем использовать его для создания базы пользователей в Discourse. Это должно быть довольно просто.

Что касается контента: у вас есть полная история сообщений, отправленных в список, в вашей электронной почте? Если да, то вы можете использовать приложение вроде Thunderbird, чтобы загрузить все сообщения и сохранить их в формате MBOX. Когда у вас это будет, существуют скрипты для импорта. Думаю, эта инструкция вам поможет: Migrate a mailing list to Discourse (mbox, Listserv, Google Groups, etc)

Не уверен насчёт того, что вы описываете как «загруженный контент» — я сам не использовал Yahoo Groups таким образом. Не знаю, какие у вас есть варианты для извлечения этого контента из Yahoo и подготовки его к импорту в Discourse. Возможно, это будет ручной процесс… и, возможно, хорошая возможность навести порядок и избавиться от ненужных вещей.

Но да, Discourse ориентирован на обсуждения, поэтому весь контент находится в темах. Можно настроить темы как вики, чтобы их могли поддерживать участники группы, включая добавление/удаление вложений. Также есть личные сообщения, которые можно использовать для общения с самим собой или с избранным кругом людей — предположительно, там можно хранить некоторый контент. Возможно, вам будет проще посмотреть в сторону другого инструмента с SSO для обмена файлами. В нашем сообществе мы используем WordPress с плагином, который обрабатывает SSO, и это работает очень гладко. Если речь идёт о большом количестве файлов, можно развернуть экземпляр Nextcloud.

Удачи!

Обновление: ого… определённо пришло время переезжать. Они действительно принимают радикальные меры, чтобы ограничить полезность Yahoo Groups, и очень скоро. Уже с 28 октября, через два дня, новый контент больше не будет приниматься! А контент будет удалён 14 декабря.

У меня её нет, хотя я не являюсь администратором ни одного из списков, с которыми работаю. Однако миграция сообщений, похоже, решается с помощью discourse/script/import_scripts/yahoogroup.rb at main · discourse/discourse · GitHub и GitHub - jonbartlett/yahoo-groups-export: Export Yahoo Groups forum to file or database · GitHub. Кроме того, администратор группы сможет экспортировать сообщения группы вместе с адресами электронной почты (что обычный пользователь сделать не может). Хотя это выглядит не совсем как решение в один клик, на данный момент сами сообщения кажутся наименьшей из проблем.

Yahoo Groups предоставляли (да, именно предоставляли) место для хранения фотографий (100 ГБ) и других файлов (2 ГБ) для группы. Группы, в которых я состою, используют это для хранения фотографий участников группы и материалов, представляющих интерес для группы, а также для различных других файлов. Всё, что отправлялось приватно между участниками в группе Yahoo, скорее всего, шло через электронную почту, и у Yahoo не было бы никаких записей об этом; я даже не думаю, что миграция такого контента была бы возможна, не говоря уже о том, чтобы быть приоритетной. Но во многих группах там хранится много информации, которую они хотели бы сохранить при миграции.

Возможно. Опять же, есть один (и только один, насколько мне известно) сайт, который, похоже, является готовым решением «из коробки», но он сохраняет старый формат групп Yahoo с лишь незначительными изменениями. Я думаю, что если группе всё равно придётся мигрировать, было бы неплохо перейти на что-то более современное. Discourse по-прежнему отлично работает с электронной почтой (чего не могут многие другие пакеты форумов), что означает, что люди старого закала, подобные мне, привыкшие получать сообщения на почту и отвечать на них по электронной почте, всё ещё могут делать это таким образом. И сэкономить несколько долларов тоже было бы неплохо.

Итак, дальнейшие события. Этот инструмент:

довольно неплохо справляется с пакетной загрузкой содержимого группы — он скачивает все сообщения, файлы, вложения и т. д. Сообщения загружаются в два файла .json каждый: один «сырой» (raw), другой — в формате HTML. Первый выглядит так:

{
    "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: <VHSProducts@...>\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 <MicroTrak@yahoogroups.com>; Mon, 4 Jun 2007 23:12:11 -0400 (EDT)\r\nMessage-ID: <c7d.e5fe91c.33962e8b@...>\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="-----------------------------1181013131"\r\nX-Mailer: 9.0 Security Edition for Windows sub 5365\r\n(snip)"
}

…в то время как второй выглядит так:

{
    "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": []
}

В зависимости от группы таких файлов может быть десятки или даже сотни тысяч. Yahoo, как всегда, скрывает адреса электронной почты от «обычных» пользователей — владельцы групп могут их видеть, возможно, и модераторы, но остальные — нет. Теперь нужно выяснить, есть ли относительно простой способ массово импортировать эти данные в экземпляр Discourse, или же лучше использовать упомянутые выше инструменты.

Этот инструмент также загружает файлы и фотографии, а также опросы, календари и прочее, что мне не особо интересно, но наверняка пригодится другим.

Ещё один момент: более внимательное чтение сообщения от Yahoo показывает, что они не только убирают файлы и фотографии, но и отказываются от архивов сообщений. Это действительно сделает их практически бесполезными для любых целей.

Пожалуйста, перейдите на Discourse.

Нам нужно больше независимых веб-сайтов и меньше людей, полагающихся на крупные монополистические платформы.

Хочу отметить, что я перевёл своё местное сообщество с Yahoo Groups на Discourse несколько лет назад, и мы ни разу не пожалели. Личные штрихи, которые можно добавить к вашему общему ресурсу для общения, стоят того сами по себе, а дополнительные функции — это вишенка на торте.

К сожалению, я не могу поделиться полезным опытом миграции, так как мы просто начали заново, сохранив лишь список рассылки. Почему бы не оставить старый сайт Yahoo Groups в рабочем состоянии и просто добавить ссылку? Сколько вложений вам действительно нужно сохранить? Сосредоточьтесь на самых важных?

Удачи, у вас всё получится!

Это не мое прямое решение, но я склоняюсь к этому. Что касается группы, которая меня больше всего беспокоит, я не ожидаю, что файлы и фотографии станут серьезной проблемой — я уже скачал их все, и их не так много, чтобы вручную переносить их в темы было бы сложно.

Да, потому что мы прямо сейчас наблюдаем один из рисков этого.

Потому что через шесть недель все данные оттуда исчезнут.

Я могу написать импортёр для чтения этих JSON-файлов, но не смогу конкурировать с ценой в 200 долларов. Обычно я беру в 10 раз больше за разработку импортёра и импорт форума среднего размера (несколько сотен тысяч сообщений).

Получается, мне лучше использовать:

а затем:

…когда разберусь, как они работают.

(крупные правки ниже—вторая попытка)

Работаю над процессом импорта сообщений, следуя инструкциям по адресу Migrate from another forum to Discourse. Насколько я понимаю, процесс должен выглядеть так:

  • Настроить среду разработки, используя инструкцию с Install Discourse on Ubuntu or Debian for Development
  • Установить MongoDB на этой системе
  • На этой системе, под тем же непривилегированным пользователем, который запускает Discourse, выполнить git clone скрипта yahoo-group-export
  • Под тем же пользователем выполнить gem install mechanize и gem install mongo. Затем отредактировать файл .config.yaml, указав учётные данные Yahoo и название группы, и запустить ruby bin/yg-export.rb.
  • Выпить чашку (или две) вашего любимого напитка.
  • После завершения работы yg-export, в каталоге Discourse откройте файл script/import_scripts/yahoogroup.rb. Отредактируйте его, указав правильный MONGODB_HOST (localhost).
  • В каталоге discourse выполните bundle exec ruby script/import_scripts/yahoogroup.rb
  • Убедитесь, что импорт прошёл корректно
  • Создайте резервную копию и восстановите её на рабочем сервере

Шаги 2–4 являются предположительными. Но выглядят ли эти шаги правильными? Полагая, что они таковы, я продолжил. Всё прошло успешно до шага 4: yg-export.rb работал около часа, сообщая об успешном завершении для всех операций и сохраняя около 38 тыс. сообщений. База данных syncro присутствует и содержит около 85 МБ данных. На этом этапе я создал снимок виртуальной машины.

Однако у меня возникли проблемы со скриптом импорта. При запуске bundle exec ruby script/import_scripts/yahoogroup.rb я получаю следующее:

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)

Странно, я думал, что уже установил gem mongo. Ну что ж, установлю его ещё раз:

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

Запускаю скрипт импорта снова, результат тот же. Имеет ли значение, если я установлю его на уровне системы?

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.

Всё более и более странно…

Вам нужно добавить gem-файлы в Gemfile и выполнить bundle install, иначе при запуске bundle exec ruby script/import_scripts/yahoogroup.rb gem-файлы не будут найдены.

Это был тот самый недостающий элемент, теперь импорт идет полным ходом. Спасибо!

Редактирование: Хорошо, процесс импорта занял 75 минут, и посты теперь на месте. Отлично. Также были созданы пользователи, о чем я и задавался вопросом. Однако я заметил пару проблем с пользователями:

  • Похоже, что все имена пользователей Yahoo импортировались корректно (я узнаю многие из них по своему членству в списке), но они привязались к неправильным сообщениям. Это происходило последовательно — все сообщения, которые были опубликованы мной, теперь отображаются так, будто их опубликовал один и тот же другой пользователь. Тем не менее, это существенная ошибка, исправление которой вручную было бы крайне утомительным.
  • Все импортированные пользователи заблокированы на следующие 200 лет.

Я подозреваю, что обе эти проблемы проистекают из отсутствия действительных адресов электронной почты в данных, загруженных из Yahoo. Это связано с тем, что я не являюсь администратором группы — это прямо указано как причина второй проблемы, но я не знаю, может ли это также вызвать первую. Что вы думаете?

Если это действительно проблема, у меня появляется направление для поиска, но также возникает потенциальная сложность — я знаю, что у группы есть два действующих модератора, но владелец умер в течение последнего года. Надеюсь, у кого-то есть доступ к этой информации…

Здравствуйте,

Для этого существует новый плагин.

Я экспортировал и импортировал все сообщения Yahoo! из тестовой версии в виде категории с помощью этого скрипта:
https://meta.discourse.org/t/topic-and-category-export-import/38930/38

Тогда возникла проблема с дублирующимися или ошибочными пользователями.
С помощью этого плагина: Merge Users Plugin
вы можете легко объединить пользователей Yahoo с пользователями Discourse.

Теперь у нас осталась только проблема с вложениями из Yahoo.

Это не совсем то, что мне нужно — на этом экземпляре, кроме администратора, есть только пользователи, импортированные из Yahoo. Проблема в том, что к неправильным сообщениям прикреплены неверные имена пользователей: мои сообщения (постоянно, насколько я могу судить) связаны с чужим именем пользователя, а чужие сообщения — с моим.

Теперь мне предоставлен доступ модератора к этой группе, чего достаточно для загрузки сообщений с реальными адресами электронной почты. Я пересоздам (виртуальные машины отлично подходят для этого), повторю импорт и посмотрю, решит ли это проблему.

Привет, хорошо, это не то же самое, что я обнаружил. В моём сообществе ни один из импортированных постов не был связан ни с одним из существующих участников сообщества.
Если я импортировал категорию, как описано в связанной теме, то в списке пользователей у меня появились только дубликаты пользователей (или новые пользователи).

Импортер назначил посты неверным пользователям, но сделал это правильно. Я имею в виду: если посты, которые я писал сам в Yahoo!, были назначены «Хансу», то все мои посты были назначены «Хансу».

У меня в форуме сообщества ID пользователя 1, но это не то же имя, что в форуме Discourse для разработки, который я настроил. Так что моя учётная запись не была перезаписана, но появился другой аккаунт с таким же именем. Однако этот аккаунт связан с неверными постами.

Теперь я использую связанный плагин, чтобы вручную объединить всех пользователей с правильными людьми на моём форуме. Это занимает немного времени, но трудно понять, какой пост принадлежит какому пользователю.

Возможно, у нас разные ситуации — в моём случае нет «существующего сообщества». Вместо этого всё импортируется из группы Y.

Хорошо, у меня есть выгрузка сообщений группы с полными адресами электронной почты. После некоторых проблем с окружением разработки мне снова удалось поработать над импортом. Однако я всё ещё замечаю несколько проблем:

  • Проблема с неправильными именами пользователей, связанными с неправильными сообщениями, сохраняется.
  • Возможно, это (или одна из причин) приводит к тому, что большинство импортируемых пользователей определяется как имеющие недопустимые адреса электронной почты. В базе данных Mongo, сгенерированной скриптом yahoo-export, поле From (из которого скрипт импорта, по-видимому, пытается прочитать адреса электронной почты) для большинства пользователей выглядит так:
Имя Фамилия &lt;user@domain.com&gt;

…что Discourse отвергает как недопустимый адрес электронной почты. В результате большинству пользователей назначается адрес вида 5dc3e1b4f4d821bd7de3ce456eaf26d5@email.invalid — исключения составляют те пользователи, которые отправляли письма без указания полных имен.

  • Импортированные сообщения содержат множество HTML-сущностей, особенно для кавычек, а также знаков больше и меньше.

  • Многие, но не все, импортированные сообщения содержат название группы в строке темы: Re: [SpareOom] какая-то тема. Было бы неплохо их удалить.
    По поводу последних трёх пунктов я wondering, не поможет ли простое поиск/замена по всей базе данных — и если да, то как это сделать, учитывая, что я никогда раньше не работал с MongoDB.

  • Отдельный вопрос — импорт сообщений в назначенную категорию. Комментарии в начале файла yahoogroup.rb говорят, что можно выполнить export CATEGORY_ID=<CATEGORY_ID> перед запуском скрипта для этого, но не указывают, что означает <CATEGORY_ID>. Я пробовал обычное название категории, а также “слаг категории” (они совпадают, за исключением регистра), но в обоих случаях скрипт импорта завершается ошибкой:

         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)

Звучит очень похоже на мой первый импорт mbox. У меня ушло несколько месяцев.

Да, вы, вероятно, сможете исправить некоторые вещи с помощью замен.

Если вы добавите .json в конец URL-адреса категории, вы сможете найти идентификатор категории. Это целое число.

Вам нужно посмотреть, какой идентификатор использует создатель пользователя, и что используется функцией публикации для поиска пользователей. Или, возможно, они просто не совпадают.

При просмотре файла yahoogroup.rb становится очевидно, что он ожидает, что поле From в сообщении будет содержать только адрес электронной почты без имени. Поскольку большинство пользователей настраивают свои почтовые клиенты для отправки имени вместе с адресом (например,

Фред Флинтстоун <fred@flintstone.com>

), это является проблемой №1. Небольшой поиск в Google подсказывает, что эту задачу можно решить с помощью библиотеки Mail, что позволит изменить соответствующую строку в скрипте импорта следующим образом:

        email: Mail::ToField.new(user_info["ygData"]["from"]), # обязательно

…что позволит извлечь только адрес электронной почты. Однако, как отмечалось выше, угловые скобки хранятся в виде HTML-сущностей, что ломает этот метод. Дополнительный поиск в Google указывает на существование библиотеки HTMLEntities, которая должна справиться с этой задачей, что подтолкнуло меня к следующей попытке:

        email: Mail::ToField.new(HTMLEntities.new.decode(user_info["ygData"]["from"])), # обязательно

Но это завершается ошибкой из-за отсутствия метода downcase.

Редактирование: Я попытался обойти эту проблему, выбрав другой путь; я видел множество предложений по использованию Nokogiri. Но, несмотря на его полезность, найденные мной рекомендации не декодировали сущности угловых скобок, что было (и остается) моей самой насущной потребностью. Поэтому я снова вернулся к HTMLEntities. Я добавил require 'mail' и require 'htmlentities' в начало скрипта импорта Yahoo и изменил строку 75 (которая была строкой 73 до добавления require-ов), чтобы она выглядела как указано выше. Я все еще получаю ошибку, но то, что я упустил ранее, заключается в том, что скрипт действительно корректно парсит и импортирует одного пользователя перед тем, как завершиться с ошибкой:

dan@ubuntu:~/discourse$ bundle exec ruby script/import_scripts/yahoogroup.rb
Загрузка существующих групп...
Загрузка существующих пользователей...
Загрузка существующих категорий...
Загрузка существующих постов...
Загрузка существующих тем...
(пропуск)
подключение к базе данных....

Импорт из MongoDB....

Импорт пользователей
Пользователь создан: 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)

(адрес электронной почты в этом выводе замаскирован, но в исходной базе данных он хранится с полным именем и сущностями для угловых скобок — таким образом, похоже, что мои изменения в скрипте имели именно тот желаемый эффект). Это немного сбивает меня с толку, так как я понимал, что метод downcase должен быть доступен по умолчанию.

Редактирование 2: Ну, пользователь парсится, но фактически не импортируется в экземпляр Discourse.

Всё ещё не могу разобраться с почтой, но решил пока отложить это и посмотреть, смогу ли применить HTMLEntities к заголовку темы и тексту сообщения. В скрипте yahoogroup.rb я изменил строку 110 так:

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

…а строку 116 так:

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

(номера строк увеличены на 2 по сравнению с оригиналом из-за добавленных мной двух строк requires, о которых я упоминал выше). Всё сработало идеально. Вывод в терминале не изменился (это было бы на строке 105, которую я заметил только после запуска), но заголовки тем и текст в импортированном экземпляре теперь чистые и аккуратные.

Похоже, этот метод отлично справляется с очисткой заголовков тем и тел сообщений, но не работает для адресов электронной почты. Есть какие-то идеи, на что стоит обратить внимание в этом случае? Я пока в тупике.

Возможно, будет проще использовать Migrate a mailing list to Discourse (mbox, Listserv, Google Groups, etc) для импорта данных из Yahoo Groups. Это можно сделать либо с помощью файлов mbox, либо, возможно, преобразовав упомянутые вами JSON-файлы в отдельные файлы MSG, содержащие исходный текст писем.

Скрипт импорта mbox обрабатывает как файлы mbox, так и письма, хранящиеся в отдельных файлах, и, возможно, уже решил все проблемы, с которыми вы сейчас сталкиваетесь.