Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #
- # Automatyczne sprawdzanie nowych ofert na gumtree: v. 0.23 (changelog: http://pastebin.com/gTcuDXyQ )
- # Autor: Feanir
- # Kontakt: [email protected]
- #
- # Wymagania: bash, grep, awk, curl, sed oraz libnotify (do obsługi powiadomień, tylko jeśli włączone)
- #
- # Nowe ogłoszenia przetrzymywane są w plikach new*.dat, gdzie * - numer porządkowy
- #
- # Plik oferty.dat tworzy bazę istniejących ofert
- #
- # W pliku warunki_ofert.dat należy umieścić adresy url do wyszukiwania oferty w gumtree.pl w formacie
- # OPIS|URL
- # Po adresie URL nie można zostawić spacji (ze względu na przeszukiwanie kolejnych stron), ponadto plik powinien zawierać ostatnią linię pustą. Np.
- # Mieszkania na Ochocie|http://www.gumtree.pl/fp-domy-i-mieszkania-do-wynajecia/ochota/c9008l3200013?AdType=2&maxPriceBackend=165000
- #
- #
- # W celu konfiguracji czasu odświeżania ofert zmień poniższą liczbę reprezentującą czas oczekiwania w sekundach (domyślnie 10 minut)
- DELAY="600"
- #
- # W celu ograniczenia maksymalnej liczby pobieranych stron zdefiniuj zmienną MAXPAGE ("" oznacza dowolną liczbę). W tej opcji nie następuje automatyczne czyszczenie oferty.dat z nieistniejących ofert (trzeba użyć opcji -c).
- MAXPAGE=""
- #
- # Do obsługi powiadomień potrzeba libnotify
- # Za włączanie/wyłączenie powiadomień w środowisku graficznym odpowiada zmienna NOTIFICATION (typu bool: 1 - włączone, 0 - wyłączone).
- NOTIFICATION="1"
- #
- # Możliwe jest wyłączenie ogłoszeń sponsorowanych (często niepowiązanych z wyświetlanymi) ceną etc. poprzez ustawienie zmiennej ADS (typu bool: 1 - włączone, 0 - wyłączone)
- ADS="0"
- #
- # Dodatkowe sprawdzenie ofert pod kątem istnienia - z jakichś nieznanych mi powodów skrypt potrafi dać oferty nieistniejące - zmienna MONOLINE (typu bool: 1 - włączone, 0 - wyłączone)
- MONLINE="0"
- #
- # Zmienna ONLYDEEP odpowiada za czyszczenie pliku oferty.dat tylko w wypadku użycia opcji "-D", czyli gruntownego czyszczenia (czasochłonnego sprawdzania, czy dana strona istnieje). Pozwala zmniejszyć do minimum ilość wystąpień powtarzających się, starych ofert kosztem większego rozmiaru pliku oferty.dat. Zmienna jest typu bool: 1 - włączone, 0 - wyłączone. UWAGA: gruntowne czyszczenie dla dużych plików może powodować widoczny ruch na gumtree, w związku z tym i zainteresowanie tamtejszych adminów.
- ONLYDEEP="0"
- #
- # Zakończenie działania skrypty należy wywołać skrótem ctr+c, najlepiej w czasie oczekiwania na kolejne sprawdzenie (lub pytania o usunięcie listy)
- #
- # Czas do kolejnego odświeżenia
- #
- # Jeżeli pojawia się błąd grep w czasie wykonywania skryptu sprawdź, czy w oferty.dat nie ma pustych linii (poza ostatnią). Może to być wynikiem błędu połączenia z internetem w trakcie wykonywania skryptu.
- # Będę wdzięczny za zgłaszanie wszelkich błędów z opisem sytuacji ich powstania :)
- #
- function delta_time
- {
- D2=`date +%j`
- H2=`date +%H`
- M2=`date +%M`
- S2=`date +%S`
- TW=`expr $DELAY - \( 86400 \* \( $D2 - $D \) + 3600 \* \( $H2 - $H \) + 60 \* \( $M2 - $M \) + $S2 - $S \)`
- }
- function advertising
- {
- NOFFTEMP="$NOFFERS"
- NOFFERS=""
- NCOUNT="0"
- if [ "$ADS" = "1" ]; then
- while read OFFTEMP; do
- ADV="${OFFTEMP#*\?}"
- OFFTEMP="${OFFTEMP%%\?*}"
- if [ "$ADV" != "featuredAd=true" ]; then
- if [ "$NCOUNT" = "0" ]; then
- NOFFERS="$OFFTEMP"
- NCOUNT=`expr $NCOUNT + 1`
- else
- NOFFERS=`echo -e "${NOFFERS}\n${OFFTEMP}"`
- fi
- fi
- done <<< "$NOFFTEMP"
- else
- while read OFFTEMP; do
- OFFTEMP="${OFFTEMP%%\?*}"
- if [ "$NCOUNT" = "0" ]; then
- NOFFERS="$OFFTEMP"
- NCOUNT=`expr $NCOUNT + 1`
- else
- NOFFERS=`echo -e "${NOFFERS}\n${OFFTEMP}"`
- fi
- done <<< "$NOFFTEMP"
- fi
- }
- # Pierwsze uruchomienie
- if [ ! -e warunki_ofert.dat ]; then
- echo "========"
- echo "INSTRUKCJA KONFIGURACJI SKRYPTU"
- echo ""
- echo "1."
- echo "Skrypt używa następujących plików do przechowywania danych"
- echo "oferty.dat, news*.dat,"
- echo "gdzie * odpowiada dowolnej liczbie."
- echo "UPEWNIJ SIĘ, że folder, w którym jest skrypt nie zawiera powyższych plików przed kolejnym uruchomieniem"
- echo ""
- read -t 30 -p "Naciśnij ENTER aby kontynuować"
- echo ""
- echo "2."
- echo "Aby umieścić dane warunki wyszukiwania w Gumtree wejdź w odpowiedni link, zaznacz swoje warunki, skopiuj i umieść w pliku:"
- echo "warunki_ofert.dat"
- echo "W formacie:"
- echo "OPIS_KATEGORII|ADRES_URL"
- echo "np"
- echo "Mieszkania na Ochocie|http://www.gumtree.pl/fp-domy-i-mieszkania-do-wynajecia/ochota/c9008l3200013?AdType=2&maxPriceBackend=165000"
- echo ""
- echo "Pamiętaj, aby zostawić ostatnią linię pliku ofert.dat pustą. Upewnij się, że nie zostawiłeś spacji po adresie URL."
- echo ""
- read -t 30 -p "Naciśnij ENTER aby kontynuować"
- echo ""
- echo "4."
- echo "Czas odświeżania ofert możesz zmienić bezpośrednio modyfikując skrypt"
- echo "========"
- echo "" > warunki_ofert.dat
- elif [ "$1" = "-D" ]; then
- echo "================"
- echo "UWAGA: URUCHOMIONO TRYB GRUNTOWNEGO CZYSZCZENIA"
- echo -e "================\n"
- OFFERSDAT=`cat "oferty.dat"`
- LINENR="0"
- LINEC="0"
- ALLLINE=`echo "$OFFERSDAT" | wc -l`
- while read LINKLIST; do
- LINENR=`expr $LINENR + 1`
- LINEC=`expr $LINEC + 1`
- ISTHAT=`curl -s "$LINKLIST"`
- if [ "$ISTHAT" = "" ]; then
- sed -i ${LINENR}d oferty.dat
- LINENR=`expr $LINENR - 1`
- fi
- echo -en "\r \r Sprawdzono linię ${LINEC}/${ALLLINE}."
- done <<< "$OFFERSDAT"
- DIFF=`expr $LINEC - $LINENR`
- echo -e "\n==============="
- echo "Zakończono: usunięto $DIFF nieaktualnych linii"
- else
- # Główna część programu
- while [ 1 ]; do
- clear
- touch oferty.dat
- if [ "$1" != "-c" ]; then
- echo "================"
- echo "NOWE OFERTY:"
- echo "================"
- else
- echo "================"
- echo "URUCHOMIONO TRYB CZYSZCZENIA"
- echo "================"
- fi
- COUNT=0
- ANSWER=""
- NOFFERS=""
- NOFFERS2=""
- NOFFERS3=""
- ALL="0"
- DO="0"
- if [ "$1" = "-c" ]; then
- MAXPAGE=""
- fi
- # Ustalenie aktualnego czasu
- D=`date +%j`
- S=`date +%S`
- M=`date +%M`
- H=`date +%H`
- # Pobieranie linków do wybranych ofert
- while read OFFER; do
- PAGE="1"
- DISCONNECT="0"
- COUNT=`expr $COUNT + 1`
- while [ 1 ]; do
- if [ "$MAXPAGE" != "" ]; then
- if [ "$MAXPAGE" -lt "$PAGE" ]; then
- break
- fi
- fi
- if [ "$NOFFERS" != "" ]; then
- NOFFERS2="$NOFFERS"
- fi
- DESC=${OFFER%%\|*}
- SITE=${OFFER#*\|}
- SEARCH=`echo "$SITE" | grep "?"`
- if [ "$SEARCH" = "" ]; then
- echo -ne "\r \rPobieranie ${DESC} s. ${PAGE}"
- NOFFERS=`curl -s "${SITE}?Page=${PAGE}"|grep adLinkSB| awk '{ print $2}'|awk -F"class" '{ print $1}'|awk -F"\"" '{ print $2}'`
- if [ "$NOFFERS" = "" ]; then
- echo -ne "\r \r Brak dostępu do internetu lub błędnie sformułowany link w pliku warunki_ofert.dat (dla ${DESC})\n"
- DISCONNECT="1"
- DO="1"
- break
- fi
- advertising
- else
- echo -ne "\r \rPobieranie ${DESC} s. ${PAGE}"
- NOFFERS=`curl -s "${SITE}&Page=${PAGE}"|grep adLinkSB| awk '{ print $2}'|awk -F"class" '{ print $1}'|awk -F"\"" '{ print $2}'`
- if [ "$NOFFERS" = "" ]; then
- echo -ne "\r \r Brak dostępu do internetu lub błędnie sformułowany link w pliku warunki_ofert.dat (dla ${DESC})\n"
- DISCONNECT="1"
- DO="1"
- break
- fi
- advertising
- fi
- # Sprawdzanie, czy strona istnieje, czy się powtarza
- if [ "$NOFFERS2" != "" ]; then
- NR=`echo "$NOFFERS" | wc -l`
- TEMP=`echo "$NOFFERS" | sed -n ${NR}p`
- NR=`echo "$NOFFERS2" | wc -l`
- TEMP2=`echo "$NOFFERS2" | sed -n ${NR}p`
- if [ "$TEMP" = "$TEMP2" ]; then
- NOFFERS=""
- NOFFERS2=""
- break
- else
- if [ "$NOFFERS3" = "" ]; then
- NOFFERS3="$NOFFERS"
- else
- NOFFERS3=`echo -e "$NOFFERS3\n$NOFFERS"`
- fi
- fi
- else
- if [ "$NOFFERS3" = "" ]; then
- NOFFERS3="$NOFFERS"
- else
- NOFFERS3=`echo -e "$NOFFERS3\n$NOFFERS"`
- fi
- fi
- # Sprawdzanie, czy dane oferty były już wcześniej w bazie
- while read LINE; do
- ISIT=`cat oferty.dat | grep $LINE`
- if [ "$ISIT" = "" ] && [ "$1" != "-c" ]; then
- if [ "$MONLINE" = "1" ]; then
- ISONLINE=`curl -s "$LINE"`
- if [ "$ISONLINE" != "" ]; then
- echo "$LINE" >> oferty.dat
- echo "$LINE" >> news${COUNT}.dat
- ALL=`expr $ALL + 1`
- fi
- else
- echo "$LINE" >> oferty.dat
- echo "$LINE" >> news${COUNT}.dat
- ALL=`expr $ALL + 1`
- fi
- fi
- done <<< "$NOFFERS"
- PAGE=`expr $PAGE + 1`
- done
- # Wypisanie nowych ofert
- if [ "$1" != "-c" ]; then
- if [ -e "news${COUNT}.dat" ] && [ "$DISCONNECT" = "0" ]; then
- NEWS=`cat news${COUNT}.dat`
- if [ "$NEWS" != "" ]; then
- RING=1
- echo -e "\r \r $DESC"
- echo ""
- echo "$NEWS"
- echo "================"
- else
- echo -e "\r \r Brak ofert dla: $DESC"
- echo "================"
- fi
- elif [ "$DISCONNECT" = "0" ]; then
- echo -e "\r \r Brak ofert dla: $DESC"
- echo "================"
- elif [ -e "news${COUNT}.dat" ]; then
- NEWS=`cat news${COUNT}.dat`
- if [ "$NEWS" != "" ]; then
- RING=1
- echo -e "\n================\nWypisuję zapamiętane oferty dla ${DESC}:\n"
- echo "$NEWS"
- echo -e "================\n"
- fi
- fi
- fi
- done < "warunki_ofert.dat"
- # Wyszukanie ofert już nieistniejących
- if [ "$DO" = "0" ] && [ "$MAXPAGE" = "" ] && [ "$ONLYDEEP" = "0" ]; then
- OFFERSDAT=`cat "oferty.dat"`
- LINENR="0"
- while read LINKLIST; do
- LINENR=`expr $LINENR + 1`
- ISTHAT=`echo "$NOFFERS3" | grep "$LINKLIST"`
- if [ "$ISTHAT" = "" ]; then
- sed -i ${LINENR}d oferty.dat
- LINENR=`expr $LINENR - 1`
- fi
- done <<< "$OFFERSDAT"
- fi
- # Powiadomienie o ofertach i oczekiwanie
- if [ "$RING" = "1" ] && [ "$1" != "-c" ]; then
- if [ "$ALL" -gt "0" ]; then
- if [ "$NOTIFICATION" = "1" ]; then
- notify-send "GUMTREE" "Znaleziono $ALL nowe oferty na gumtree.pl"
- fi
- fi
- while [ "$ANSWER" != "N" ] && [ "$ANSWER" != "T" ]; do
- ANSWER="N"
- delta_time
- if [ "$TW" -le "0" ]; then
- break
- fi
- echo ""
- echo -n "Zapoznałeś się ze wszystkimi ofertami? [T/N] "
- read -t $TW ANSWER
- if [ "$ANSWER" = "T" ]; then
- RING="0"
- rm news*dat
- echo "Wyczyszczono nowości"
- fi
- if [ "$ANSWER" = "N" ]; then
- echo "Nowości pozostaną nieodczytane"
- fi
- done
- echo "Oczekuję na nowe oferty"
- elif [ "$1" = "-c" ]; then
- echo -e "\n Usunięto nieaktualne oferty z oferty.dat"
- break
- else
- echo " Brak nowych ofert, czekam:"
- fi
- delta_time
- while [ "$TW" -gt "0" ]; do
- sleep 1
- delta_time
- echo -en "\r \r $TW s"
- done
- done
- fi
- # Koniec skryptu
Advertisement
Add Comment
Please, Sign In to add comment