Cold'n'Sour (cold_n_sour) wrote,
Cold'n'Sour
cold_n_sour

Этот пост касается только тех, кто хостит фотографии на сервисе fotki.com и публикует их в ЖЖ.



Я уже упоминал о падениях серверов fotki.com и, как следствие, битых линках на фотографии.

Вот их ответ на мою жалобу:

Hello Victor,

We apologize for temporary inconvenience caused by this problem.

Fotki file storage system was designed to provide maximum protection for customer's precious photos. We keep several copies of each image on different servers. On rare occasion, when some hard drive fails, we redirect links to another copy of some particular picture. At this time old links became unavailable.
While we provide nearly 100% protection to files stored on our servers, our programmers are still working on a better solution to avoid broken links in the future.

We would really appreciate your kind understanding in this matter. We will do our best to implement a new URL system till the end of this year.

Please don't hesitate to contact us with any further questions you may have.

Sincerely,
Fotki.com Customer Support


Я тогда проявил понимание и, засучив рукава, перепахал свои старые посты, выявил и устранил все битые линки. И только робко спросил у саппорта, нельзя ли наладить систему оповещения об авариях. На что мне, естественно, было отвечено: "I am afraid this is technically impossible at this time. We will concentrate on getting this issue resolved for good, so no notifications will be needed.
Thanks you for your understanding, we really appreciate that.
"

Разговор этот происходил около месяца назад. Вчера я увидел, что битых линков опять куча. В общем, нужно было либо уходить, либо что-то придумывать самому в плане системы раннего оповещения о битых линках.

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

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

Скриптов, собственно, два. Первый называется "_getposts", и его придется готовить вручную, с помощью текстового редактора.

Вот как выглядит мой:

curl http://cold-n-sour.livejournal.com/?skip=0 | sed 's_http://cold-n-sour.livejournal.com_\
http://cold-n-sour.livejournal.com_g' |grep -E -e "cold-n-sour.livejournal.com\/[0-9]+.html\"" |cut -d"\"" -f1 |uniq 

curl http://cold-n-sour.livejournal.com/?skip=20 | sed 's_http://cold-n-sour.livejournal.com_\
http://cold-n-sour.livejournal.com_g' |grep -E -e "cold-n-sour.livejournal.com\/[0-9]+.html\"" |cut -d"\"" -f1 |uniq 

...
...

curl http://cold-n-sour.livejournal.com/?skip=160 | sed 's_http://cold-n-sour.livejournal.com_\
http://cold-n-sour.livejournal.com_g' |grep -E -e "cold-n-sour.livejournal.com\/[0-9]+.html\"" |cut -d"\"" -f1 |uniq  


Как видим, он состоит их повторяющихся вызовов команды "curl" - по обному на каждую страницу журнала. Отличаются они друг от друга только частью URL "skip=N", где N - количество пропущенных постов. Эта цифра должна быть кратна числу постов на одной странице, заданному в установках ЖЖ. У меня это 20б поэтому и линки, соответственно, "skip=20", "skip=40" ... "skip=160" - на восьмой странице у меня посты кончаются. Я уверен, что можно этот скрипт переписать так, чтобы он принимал имя журнала и число постов на странице и число страниц как параметры, но мне показалось быстрее сделать вручную.

Утилита curl достает с сервера заданный документ, который затем нужно распарсить, чтобы вытащить из него список адресов постов, для чего используются последовательно вызова утилит "sed", "grep", "cut" и "uniq".
(!!!) Обратите внимание, что возврат строки в середине каждой команды (после "livejournal.com_\") - не ошибка форматирования, а совсем наоборот.

Результатом работы скрипта "_getposts" является список адресов всех постов на восьми страницах моего ЖЖ, и выглядит результат примерно так:

http://cold-n-sour.livejournal.com/677.html
http://cold-n-sour.livejournal.com/52837.html
http://cold-n-sour.livejournal.com/52532.html
http://cold-n-sour.livejournal.com/52247.html
http://cold-n-sour.livejournal.com/52050.html
...
...


Теперь эти посты надо посмотреть на предмет наличия картинок, вытащить линки на те их них, что хостятся на фотки.ком, и попробовать по этим линкам пойти. Причем желательно не тащить каждую картинку целиком, а просто убедиться, что она по этому адресу есть. Этим всем занимается второй скрипт, который информативно называется "runme". Вот его содержимое:


./_getposts >ljposts.txt

awk '/^http.*([0-9])+.html/ {print "echo echo " $0 "\ncurl " $0 "?usescheme=lynx| sed \047s/src=\"/\\\n/g\047 !!!
| sed \047s/.jpg/.jpg\\\n/g\047 | sed \047s/.png/.png\\\n/g\047 | awk \047/\^http:\\\/\\\/images[0-9]+\.fotki\.com/!!!
 {print \"curl -fr 0-10 \" $0 \";echo\"}\047"}' ljposts.txt >getpics.txt

chmod a+x getpics.txt

./getpics.txt >checkpics.txt

chmod a+x checkpics.txt

./checkpics.txt >checkpics.result.txt 2>&1

grep -a -E -e "error|html" checkpics.result.txt >checkpics.result0.txt


Первая строка этого скрипта - просто вызов описанного ранее "_getposts" и помещение результатов в файл "ljposts.txt"

Вторая строка - самая премудрость. Красные восклицательные знаки в ней поставлены на месте вынужденных переносов для удобства чтения - их нужно убрать при копировании, так, чтобы от слова "awk" до слова "getpics.txt" была одна строка. Она берет список постов и готовит другой скрипт, который будет искать в каждом из них картинки с расширением jpg или png (но только те, которые хостятся на фотки.ком). Сам скрипт сохраняется в файле "getpics.txt". Для каждого поста в getpics.txt генерируются две команды (в примере ниже "XXXX" - это номер поста:

echo echo http://cold-n-sour.livejournal.com/XXXX.html
curl http://cold-n-sour.livejournal.com/XXXX.html?usescheme=lynx| sed 's/src="/\
/g' | sed 's/.jpg/.jpg\
/g' | sed 's/.png/.png\
/g' | awk '/^http:\/\/images[0-9]+.fotki.com/ {print "curl -fr 0-10 " $0 ";echo"}'


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

Четвертая строка запускает "getpics.txt" на выполнение и сохраняет результаты в файле "checkpics.txt". При этом происходит чтение всех постов в ЖЖ, и процесс этот самый продолжительный - несколько минут.

Посде этого файл "checkpics.txt" выглядит примерно так:

echo http://cold-n-sour.livejournal.com/52050.html
curl -fr 0-10 http://images41.fotki.com/v195/photos/1/12125/141011/IMG_4960-vi.jpg;echo
echo http://cold-n-sour.livejournal.com/51844.html
curl -fr 0-10 http://images20.fotki.com/v527/photos/1/12125/5422762/IMG_4914-vi.jpg;echo
echo http://cold-n-sour.livejournal.com/51482.html
echo http://cold-n-sour.livejournal.com/51297.html
curl -fr 0-10 http://images18.fotki.com/v457/photos/1/12125/5422762/screen20100323at5_33_58PM-vi.jpg;echo
echo http://cold-n-sour.livejournal.com/48382.html
curl -fr 0-10 http://images41.fotki.com/v195/photos/5/12125/8361739/IMG_3425-vi.jpg;echo
curl -fr 0-10 http://images44.fotki.com/v1535/photos/5/12125/8361739/IMG_3398-vi.jpg;echo
curl -fr 0-10 http://images54.fotki.com/v239/photos/5/12125/8361739/IMG_3379-vi.jpg;echo


Для каждого поста есть строка, которая начинается с "echo". Затем от ноля до нескольких строк, начинающихся с "curl -fr 0-10 ..." - по одной строке для каждой картинки в посте. Прелесть этой команды в том, что втащены с сервера будут только первые десять байт картинки, если она есть, а если нет, будет возвращена ошибка.

Дальше, собственно, уже все - файл "checkpics.txt" делается исполняемым и запускается на выполнение, а результаты кладутся в "checkpics.result.txt", причем туда же сливаются и ошибки.

Последний шаг - вырезание ненужного и вывод адресов постов и ошибок в финальный файл "checkpics.result0.txt", который имеет такой вид:

...
http://cold-n-sour.livejournal.com/44455.html
http://cold-n-sour.livejournal.com/43297.html
http://cold-n-sour.livejournal.com/43112.html
http://cold-n-sour.livejournal.com/42543.html
curl: (22) The requested URL returned error: 404
http://cold-n-sour.livejournal.com/42291.html
curl: (22) The requested URL returned error: 404
http://cold-n-sour.livejournal.com/42155.html
http://cold-n-sour.livejournal.com/41803.html
curl: (22) The requested URL returned error: 404
curl: (22) The requested URL returned error: 404
http://cold-n-sour.livejournal.com/41719.html
curl: (22) The requested URL returned error: 404
curl: (22) The requested URL returned error: 404
curl: (22) The requested URL returned error: 404
...


Легко видеть, что бытые линки есть в постах 42543, 42291, 41803 и 41719.

Буду гонять и исправлять. Сегодня поправил 56 линков из 478 - 12% битых линков за месяц.

Для того, чтобы проверить свой журнал нужно:
1) приготовить самому "_getpics" по описанной методике
2) скопировать отсюда "runme", не забыв убрать переносы строк в местах, где восклицательные знаки.
3) сделать оба эти файла исполняемыми
4) запустить на выполнение "runme"
5) читать "checkpics.result0.txt"

У меня весь процесс занимает порядка 4-6 минут.

Надо уходить от них, на самом деле, но лениво же... Да и жалко - там тэги, которые пропадут...
Tags: fotki.com, сын ошибок трудных
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 6 comments