/** **/

ITСooky

IT-рецепты съедобные и не очень!

Как я спасал фото из radikal.ru на phpbb форуме!

дата 11.03.2022

Бесплатные фотохостинги хороши в кроткой перспективе, в долгосрочной они или превращаются в хостинги с адульт рекламой или закрываются! Что и случилось с radikal.ru на 15-ом году работы, фан сайты тире форумы живут гораздо дольше(ну если их админит настоящий фанат)! Все равно огромное им спасибо, очень они помогли в ранние годы российского хостинга, сейчас на западном хостинге уже нет проблем с местом или мощностями!

Так имеем форум phpBB с почти 2М записями. Берем комп на Ubuntu(или Windows с WSL теоритически) выкачиваем дамп базы MYSQL форума 3Gb.
Делать все надо было когда Radikal еще работал!

Задача 1: Вытащить ссылки на фото radikal
Логика такая все фотки в постах в тегах [img] [/img] если большие, а если маленькие превью то в тех же тегах только в имени файла на конце буква t
Тэг img иногда записан большими буквами
меняю все маленькие на большие
sed 's/\[img\]/[IMG\]/g
sed 's/\[\/img\]/[\/IMG\]/g'

Первый скрипт для обработки
vi 1.sh
вставляю

#!/bin/bash
IFS=$'IMG\]'
cat mysqldump.sql | sed  's/\[IMG\]/\n/g; s/\[\/IMG\]/\n/g' | grep radikal > 1.txt

запускаю скрипт
bash ./1.sh

Тут я поставил конец строки чтобы был IMG] и он сработал как бы.

Дальше вытаскиваю строки которые начинают с http
cat 1.txt | grep ^http > url1.txt
это сразу дало массу ссылок
но еще вытаскиваю строки которые начинают с
cat 1.txt | grep ^'' > url2.txt
тут надо смотреть, сначала какие строки нам нужны с чего начинают, а потом из них убирать ненужное
для utl2.txt
cat url2.txt | sed "s///g" > url3.txt
cat url3.txt | sed "s/<\/s>//g" > url4.txt

перед тем как использовать эти файлы убираю из них дупликаты
sort ./url1.txt | uniq >> url1f.txt
sort ./url4.txt | uniq >> url4f.txt

остаемся с файлами url1f.txt и url4f.txt

Задача 2: Выкачать по ссылкам фото с radikal
Чуть сложнее чем заголовок. Из ссылок вытащить имя папки, сделать у себя такую же папку, и скачать фото туда.
vi 2.sh
вставляю

#!/bin/bash
IFS=$'\n'
c=0
 for a in $( cat url1f.txt ); 
 do
 link=`echo $a`
 name=`echo $link | awk -F '/' '{print $(NF)}'`
 link2=`echo $a | sed "s/t.jpg/.jpg/g"`
 name2=`echo $link2 | awk -F '/' '{print $(NF)}'`
folder=`echo $link | sed "s/$name//g" | sed "s/http:\/\///g" | sed "s/https:\/\///g"`
folder2=`echo $folder | sed "s/radikal.ru/mywebsite/g"`
let c++
curl --max-time 20 -O $link2
mkdir -p ./$folder2
mv ./$name2 ./$folder2$name
echo $folder "mywebsite.ru/d/mlr/"$folder2 >> url_sql_1.txt 
echo $c > proc1.txt
sleep 0.5
done

запускаю скрипт
bash ./2.sh

ВАЖНО: Если файлов много, как у меня, то эту команду надо запускать в фонов режиме, а то может сеанс порваться, комп вырубится и пр

nohup bash ./2.sh &>/dev/null &

Заметил что превью было только у jpg поэтому все t.jpg меняю на .jpg для выкачивания но для имяни файла оставлю t.jpg — чтобы меньше было менять в постах на форуме

В файл url_sql_1.txt пишутся ссылки и папки

s001.radikal.ru/i193/1001/35/ mywebsite.ru/d/mlr/s001.mywebsite/i193/1001/35/

В файл proc1.txt пишется количество обработанных ссылок, для контроля процесса

Чтобы процесс ускорить запускаю два скрипта, второму даю список ссылок но перевернутый чтобы он качал с конца — все имена файлов меняю чтобы они не перезаписывали друг друга
sort -r url1f.txt >> url1fR.txt

ОСТОРОЖНО: Каждый шаг визуально контролировал, потому что иногда вылезало что-то лишнее. Например не все ссылки на радикал с одним субдоменном были и с двумя это учитывал в отдельном скрипте


ПРОШЛО 60 ЧАСОВ

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

Задача 3: Меняем в базе MySQL старые ссылки на новые
Тут я долгое время заблуждался что смогу в базе с 2 миллионами строк сделать 600 тысяч запросов найти и заменить, остановив форум всего на пару часов, выкачав базу к себе на домашний комп… На хостинге одна такая операция занимает 12 секунд, дома 9 секунд, всего потребовалось бы 10 дней!!!

MySQL не умеет в параллельные запросы совсем…

Уф но вовремя понял что не надо менять всю ссылку, достаточно домен с субдоменом так как у меня сохранились наименования папок с радикала — это сократило количество операций до 200.

Для этого формирую sql запросы скриптом
vi 3.sh
вставляю

#!/bin/bash
IFS=$'\n'
c=0
sort ./url1f.txt | uniq -u > url1fu.txt
for a in $( cat url1fu.txt ); do
let c++
a1=`echo $a | awk '{print $1}'`
b1=`echo $a | awk '{print $2}'`
echo "UPDATE phpbb_posts SET \`post_text\` = replace(post_text, \""$a1"\", \""$b1"\");" >> url1fu.sql
done

запускаю скрипт
bash ./3.sh

получаю файл со строками

UPDATE phpbb_posts SET `post_text` = replace(post_text, "s018.radikal.ru", "mywebsite.ru/d/mlr/s018.mywebsite");

Кладу этот файл на хостинг, иду там в MySQL
mysql -u root -p
выбираю свою базу
use mybase;
и запускаю файл с коммандами
source /home/myname/url1fu.sql;

Все получилось, проверить все равно не проверишь — потому что половина ссылок уже были не рабочии, и еще чуть чуть ссылок потерялось при экспорте!


One Response to “Как я спасал фото из radikal.ru на phpbb форуме!”

  1. Это вот если кто успел отследить, что радикал закрывается…
    Как-то мимо меня прошло, так бы спас

Добавить комментарий

Ваш адрес email не будет опубликован.