У меня нет mbox-файлов, и я не знаю способа их получить — Yahoo, конечно, не позволит мне их скачать. Знаете ли вы что-то, что могло бы конвертировать JSON в mbox? Google показывает множество инструментов для обратного преобразования, но я не вижу ничего, что решало бы эту задачу быстро.
Я ожидал, что, поскольку существуют скрипты, специально предназначенные для миграции групп Yahoo, они будут работать, и это был бы самый простой способ выполнить эту задачу. Похоже, мои ожидания были излишне оптимистичны: скрипты «работают» в том смысле, что они мигрируют сообщения, и как-то мигрируют пользователей, но отсутствие большинства адресов электронной почты и присвоение большинства сообщений не тем пользователям — это серьёзная проблема.
Меня расстраивает то, что это должно быть тривиальным исправлением для кого-то, кто действительно кое-что знает о Ruby, но, к сожалению, я не такой человек (я пытаюсь, но времени на всё никогда не хватает). Моя группа достаточно мала, и я, вероятно, смогу исправить всё вручную, если потребуется, но я бы предпочел не делать этого. Более того, я пытаюсь разработать общий метод, который смогут использовать другие владельцы групп Yahoo.
Редактирование: Я, наверное, должен быть рад, что справляюсь с таким объёмом работы на языке, в котором я совершенно не разбираюсь, но всё ещё чувствую, что упускаю что-то важное (что должно быть очевидным). Я попробовал использовать другой метод с библиотекой Mail. Изменённая часть функции import_users выглядит следующим образом:
create_users(profiles.to_a) do |u|
user_id = user_id + 1
# fetch last message for profile to pickup latest user info as this may have changed
user_info = @collection.find("ygData.profile": u["_id"]["profile"]).sort("ygData.msgId": -1).limit(1).to_a[0]
# Store user_id to profile lookup
@user_profile_map.store(user_info["ygData"]["profile"], user_id)
puts "User created: #{user_info["ygData"]["profile"]}"
user_email = Mail::Address.new(HTMLEntities.new.decode(user_info["ygData"]["from"]))
user =
{
id: user_id, # yahoo "userId" sequence appears to have changed mid forum life so generate this
username: user_info["ygData"]["profile"],
name: user_info["ygData"]["authorName"],
email: user_email.address, # mandatory
created_at: Time.now
}
user
end
И это работает! Ну, в основном. Из 302 уникальных пользователей, подсчитанных скриптом, импортировано 289. Они отображаются на странице администратора с правильными именами пользователей, полными именами (если указаны) и адресами электронной почты. Скрипт сообщает, что импортированы все 302 пользователя, и ошибок не обнаружено. Но когда начинается импорт тем, возникает следующая ошибка:
Importing discussions
Topic: 1 / 12232 (0.01%) Subject: Newspapers
Topic: 2 / 12232 (0.02%) Subject: 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)
…что не удивительно, поскольку максимальный идентификатор пользователя равен 290.