Сначала поставлена задача: удалить рекомендации в своем блоге на Juick.com, вручную неохота было, решил написать скрипт, в результате получился некоторый аналог DELETEALL, только без удаления подписок, комментов.
Код:
#!/bin/bash
### Удаляет ваши сообщения или рекомендации с Juick.com
# section может быть: blog, recomm
section="blog"
# имя блога, по сути - ваш ник
blog="vasya"
# Jabber account, в котором у вас зарегестрирован juick@juick.com
jname="vasya.pupkin"
jpass="superpassword"
jserv="jabber.ru"
## BEGIN ##
u="http://juick.com/$blog/?show=$section"
tmp_file=tmp_$section.txt
while true
do
# посты со страницы будут удалены, соответственно их место
# займут более старые
lynx -dump "$u" > $tmp_file
# Вычленяем ссылку на следующу страницу
tmp=`cat $tmp_file | grep 'Older ->' | grep '|'`
if [ -z "$tmp" ]; then
next_num=`cat $tmp_file | grep 'Older ->' | awk -F']' '{print $1}' | sed 's| <br/>[||'`
else
next_num=`cat $tmp_file | grep 'Older ->' | awk -F'|' '{print $2}' | awk -F']' '{print $1}' | sed 's| <br/>[||'`
fi
# да, этаким мы сделаем trim, сделайте при помощи sed, будет элегантней (и просто)
next_num=`echo $next_num | awk '{print $1}'`
next_link=`cat $tmp_file | grep "$next_num. http://" | grep "show=$section" | grep 'page=' | awk '{print $2}'`
cat $tmp_file <br/>
| grep '<br/>[[0-9]*<br/>]#[0-9]*,' <br/>
| grep 'now<br/>|ago' <br/>
| awk '{print $1}' <br/>
| sed 's|^<br/>[[0-9]*<br/>]||;s|,$||' <br/>
| while read line
do
post_num=`echo $line | sed 's|^#||'`
action="D"
[ x"$section" = x"recomm" ] && action='!'
echo "Delete/unrecomend post: $line (http://juick.com/$post_num)"
echo "$action $line" | sendxmpp -u $jname -p "$jpass" -j $jserv -s 'bye' juick@juick.com
sleep 10
done
# А вот когда указателя на следующую страницу не будет, тогда выходим
if [ -z "$next_num" ]; then
break;
fi
done
Для чего не спрашивайте, просто стало интересно написать :) Для работы нужно:
- bash
- lynx
- sendxmpp
Счастливые арчеводы могут первые два пункта поставить из репозиториев, а sendxmpp собрать из AUR: http://aur.archlinux.org/packages.php?ID=17929
UPD: спасибо камраду sandr1x , в Ubuntu/Debian работа программы sendxmpp (там кстати её версия указана как 1.18, хотя актуальная - 0.0.8) завершается с ошибкой:
Can't use an undefined value as a HASH reference at /usr/share/perl5/XML/Stream.pm line 1165.
С подобным поведением сталкивались на работе когда настраивали sendxmpp для отправки уведомлений. Решение такое: открываем файл /usr/share/perl5/XML/Stream.pm переходим на строку указанную в ошибке (1165), находим чуть выше ее строку:
delete($self->{SIDS}->{$currsid});
и заменяем на:
delete($self->{SIDS}->{$currsid}) unless $currsid eq $sid;
Примерный патч выглядит так:
--- /usr/share/perl5/XML/Stream.pm.orig 2007-07-10 21:16:47.000000000 +0400
@@ -1160,7 +1160,7 @@
$self->{SOCKETS}->{*STDIN} = $sid;
}
1. delete($self->{SIDS}->{$currsid});
+ delete($self->{SIDS}->{$currsid}) unless $currsid eq $sid;
if (exists($self->GetRoot($sid)->{version}) &&
($self->GetRoot($sid)->{version} ne ""))
Файл принадлежит пакету libxml-stream-perl версии 1.22 в ArchLinux это пакет perl-xml-stream версии 1.23, там данные исправления уже присутствуют, так что если есть возможность - обновляемся, или ставим Arch, правда не задаем глупых вопросов, а то новоявленные арчеводы ex-убунтоиды ими уже на форуме поддостали :)