?

Log in

No account? Create an account
Этот пост касается только тех, кто хостит фотографии на сервисе… - Them's the breaks
April 13th, 2010
11:47 pm

[Link]

Previous Entry Share Next Entry
Этот пост касается только тех, кто хостит фотографии на сервисе 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: ,

(7 comments | Leave a comment)

Comments
 
[User Picture]
From:patrick_t_jet
Date:April 14th, 2010 11:09 am (UTC)
(Link)
Так, Авис уже морщится, Фотки апдейтят черный список...кто там следующий?:) Apple или Toyota?:)
[User Picture]
From:cold_n_sour
Date:April 14th, 2010 02:12 pm (UTC)
(Link)
ну, apple еще поживет. а с тойотой был же скандал с педалью газа :) я, правда, под него не попал.
[User Picture]
From:planetoberon
Date:April 14th, 2010 01:32 pm (UTC)

титанический труд :)

(Link)
думаецо в LJ есть виндовые скрипты для подобного - перебирался несколько раз на разные имидж сервисов, есть и битые линки.

для себя я решил так (соглашаясь и со всеми недостатками с этим связанным): Зарегистрил на себя доменное имя, запустил дома серверок, фотки выкладываю дома у себя. Часто грузится даже быстрее чем фотки непосредственно проаплоденные в ЖЖ!

когда соберусь с силами, можно будет сделать интеграцию своего севрера с лайтрумом - тогда совсем будет удобно
[User Picture]
From:cold_n_sour
Date:April 14th, 2010 02:11 pm (UTC)

Re: титанический труд :)

(Link)
скрипты для винды есть, я даже пользую один - ljsm, он складывает посты из заданного интервала времени из жж на локальный диск.

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

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

[User Picture]
From:planetoberon
Date:April 14th, 2010 02:51 pm (UTC)

Re: титанический труд :)

(Link)
>тягать посты в реальном времени

Windows Live Writer не смотрел? бесплатная тулза от MS в виде простенького редактора для всяких блогов в т.ч. ЖЖ. Все посты хранятся и редактируются локально в html или визивиге, потом синхронизируются (публикуются в) с журналом. Можно стянуть и старые посты себе на диск и иметь к ним удобный доступ (поиск). Удобная навигация и _проверка_орфографии_ на лету. Из минусов - заморочки со вставкой картинок и ЖЖ-специфичными тегами, но обходится прямым редактированием в html.
(Deleted comment)
[User Picture]
From:cold_n_sour
Date:April 26th, 2010 09:04 pm (UTC)
(Link)
эта?
http://images52.fotki.com/v8/photos/1/12125/141011/IM000199a-vi.jpg

та, что ты показала, ярче :)
Мои фотографии Powered by LiveJournal.com