BashBash "скрипт-автоинформатор".

Bash «скрипт-автоинформатор» для новых проектов по freelance.
Работает только с одним сайтом- free-lance.ru.
В скрипт заносятся нужные переменные для доступа к сайту, для того чтобы не брать все новые проекты, а только те — которые попадают под ваш фильтр и ставится на исполнение в cron с заданным периодом- в результате мы имеем оповещение о новых проектах методом указанным в функции notify() (специально вынесенно в отдельную функция- для удобства изменения способов оповещения)- в данном случае по почте. Логика работы простая- при первом запуске ничего не происходит, а записываются id самых последних платных и бесплатных проектов, при последующих запусках — парсится главная страница и если id у проекта выше чем записанный ранее- значит проект новый- даем оповещение.
Обращаю внимание, что локально сохраняются ваши cookies, для того, чтобы не авторизироваться каждый раз. Описание проекта берется с главной страницы- тоисть урезано. Думаю будет полезен как пример.
Сам скрипт:
#!/bin/bash
TMP=''
COOKIES="$TMP/freelance.cookies"
INDEX="$TMP/index.html"
LOGIN=''
PASSWORD=''
USER_AGENT='Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
#Отображать pro проекты
PRO='1'
TO_MAIL=''

[ ! -f "$TMP/id_old" ] && touch "$TMP/id_old"
[ ! -f "$TMP/id_pay_old" ] && touch "$TMP/id_pay_old"
ID_OLD="`cat $TMP/id_old`"
ID_PAY_OLD="`cat $TMP/id_pay_old`"
#Нужно если хотим корректного отображения кирилицы
#при запихивании скрипта в cron
export LANG=ru_RU.utf8

#Берем страницу с проектами
get_url() {
#Максимум 5 попыток залогиниться
log_count=$((log_count+1))
[ "$log_count" -gt "5" ] && notify "Проблемы со входом на сайт" "Проблемы со входом" && exit 1
curl -A "$USER_AGENT" -b "$COOKIES" -c "$COOKIES" -s -N  http://www.free-lance.ru/ > "$INDEX"2
login="`sed -n "/$LOGIN/p" "$INDEX"2`"
#Проверяем залогинены ли мы
if [ -z "$login" ]
then
curl -A "$USER_AGENT" -c "$COOKIES" http://www.free-lance.ru/ 1>/dev/null
curl -A "$USER_AGENT" -b "$COOKIES" -c "$COOKIES" -L -s --data "action=login&login=$LOGIN&passwd=$PASSWORD" http://www.free-lance.ru/ 1>/dev/null
#Качаем страницу по новой
get_url
fi
}

#Функция для определения первого бесплатного проекта
#признак платности - prj-payed
#$1- строка "описывающая проект, $2- номер проекта
pay (){
echo "$1"|grep -q prj-payed && first="`sed -n '/project-item/p' "$INDEX"|sed -n "$2"p`" || return
pay_array "$1"
pay "$first" $(($2+1))
}

#Функция для нахождения новых платных проектов
#$1- id проекта
pay_array() {
#Самый первый платный проект за этот запуск скрипта
[ -z "$id_pay"  ] && first_id_pay="1"
id_pay="`echo "$1"|sed 's/[^0-9]//g'`"
[ "$first_id_pay" == "1" ] && echo "$id_pay" > "$TMP/id_pay_old" && first_id_pay="2"
#Первичный запуск- нечего делать.
[ -z "$ID_PAY_OLD"  ] && return
[ "$id_pay" -gt "$ID_PAY_OLD" ] && info "$id_pay"
}

#Функция для нахождения заголовка и тела новосьти о работе
#$1- id проекта
info() {
pro_test="`sed -n "/<a\ n.*$1/,/<a\ .*$1/p" "$INDEX"|sed -n '/PRO/p'`"
[ -n "$pro_test" ] && [ "$PRO" == "0" ] && return
title="`sed  -n "/<a\ n.*pid=$1.>/,/<\/p>/p" "$INDEX"|sed 's/\(<[^>]\+>\|&[a-z]\+;\?\)//g'|sed -n 's/ *//;2p'`"
body="`sed  -n "/<a\ n.*pid=$1.>/,/<\/p>/p" "$INDEX"|sed 's/\(<[^>]\+>\|&[a-z]\+;\?\)//g'|sed -n 's/ *//;$p'`"
notify "$title\n$body\nhttp://www.free-lance.ru/projects/?pid=$1\n\n" "$title"
}

#Функция для различных способов оповещения
#$1- тело сообщения, $2- тема 
notify() {
# Костыль  для темы письма
subject="=?utf-8?B?`echo $2|base64 -w0`?="
##########################################
echo -e "$1"|mail -s "$subject" "$TO_MAIL" 2>/dev/null
}

#Логинимся на сайте и берем нашу страницу с отфильтрованными проектам
get_url
iconv -c -f cp1251 -t utf-8 "$INDEX"2 -o "$INDEX"
#Первый проект на сранице
first="`sed -n '/project-item/p' "$INDEX"|sed -n 1p`"
#Определение первого бесплатного проекта
pay "$first" 2
#Id самого первого бесплатного проекта за этот запуск скрипта
id="`echo "$first"|sed 's/[^0-9]//g'`" && echo "$id" > "$TMP/id_old" && [ -z "$ID_PAY_OLD"  ] && echo "$id" > "$TMP/id_pay_old"
#Первичный запуск- нечего делать или нет новых проектов
[ -z "$ID_OLD"  ] || [ "$id" == "$ID_OLD" ] && exit 0
#Нахождение новых бесплатных проектов
for i in `sed -n "/$id/,/.\*/p" "$INDEX"|sed -n '/project-item/p'|sed 's/[^0-9]//g'`
do
[ "$i" -gt "$ID_OLD" ] && info "$i" || exit 0
done

PS: это ни в коем случае не реклама, если кто-то считает иначе- топик уберу.
PS2: Есть некоторые косяки в отображении проектов, только я понять не могу- это вызвано использование команды mail(в mane упоминается избегать кучи пробелов для параметра "-s") или проблема с моим почтовым клиентом, но в целом скрипт работает.

Update 12.06.11: Немного поправил regexp для убирания html-форматирования.
  • +4
  • CraDem
  • 10 июня 2011, 22:33

Комментарии (4)

… сохраняються… тоесть… нивкоем ...


Исправь, пожалуйста — глаза режет.

если кто-то считает иначе- топик уберу


С таким подходом остаётся только сесть и ничего не делать.
Исправил.
да- есть у меня косяк с орфографией, кста- лучше в личку, по поводу подхода ничего не делать, ну-ну…
Мне даже приятно, что вы, «уважаемый некто», специально зарегистрировались здесь(или зарегили мульта), чтобы оставить мне коментарий.
Нет, я зарегистрировался совсем для другого. А подход у тебя странный, всегда найдутся недовольные твоим постом, навстречу всем идти не получится. Так что забей и пиши, что считаешь нужным.
Ну тогда спасибо за коментарий и как говорится «Добро пожаловать!»
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.