Feanir

gumtree.pl - nowe oferty

Aug 23rd, 2013
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 11.19 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. # Automatyczne sprawdzanie nowych ofert na gumtree: v. 0.23 (changelog: http://pastebin.com/gTcuDXyQ )
  4. # Autor: Feanir
  5. #
  6. # Wymagania: bash, grep, awk, curl, sed oraz libnotify (do obsługi powiadomień, tylko jeśli włączone)
  7. #
  8. # Nowe ogłoszenia przetrzymywane są w plikach new*.dat, gdzie * - numer porządkowy
  9. #
  10. # Plik oferty.dat tworzy bazę istniejących ofert
  11. #
  12. # W pliku warunki_ofert.dat należy umieścić adresy url do wyszukiwania oferty w gumtree.pl w formacie
  13. # OPIS|URL
  14. # Po adresie URL nie można zostawić spacji (ze względu na przeszukiwanie kolejnych stron), ponadto plik powinien zawierać ostatnią linię pustą. Np.
  15. # Mieszkania na Ochocie|http://www.gumtree.pl/fp-domy-i-mieszkania-do-wynajecia/ochota/c9008l3200013?AdType=2&maxPriceBackend=165000
  16. #
  17. #
  18. # W celu konfiguracji czasu odświeżania ofert zmień poniższą liczbę reprezentującą czas oczekiwania w sekundach (domyślnie 10 minut)
  19. DELAY="600"
  20. #
  21. # 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).
  22. MAXPAGE=""
  23. #
  24. # Do obsługi powiadomień potrzeba libnotify
  25. # Za włączanie/wyłączenie powiadomień w środowisku graficznym odpowiada zmienna NOTIFICATION (typu bool: 1 - włączone, 0 - wyłączone).
  26. NOTIFICATION="1"
  27. #
  28. # 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)
  29. ADS="0"
  30. #
  31. # 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)
  32. MONLINE="0"
  33. #
  34. # 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.
  35. ONLYDEEP="0"
  36. #
  37. # 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)
  38. #
  39. # Czas do kolejnego odświeżenia
  40. #
  41. # 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.
  42. # Będę wdzięczny za zgłaszanie wszelkich błędów z opisem sytuacji ich powstania :)
  43. #
  44. function delta_time
  45. {
  46.     D2=`date +%j`
  47.     H2=`date +%H`
  48.     M2=`date +%M`
  49.     S2=`date +%S`
  50.     TW=`expr $DELAY - \( 86400 \* \( $D2 - $D \) + 3600 \* \( $H2 - $H \) + 60 \* \( $M2 - $M \) + $S2 - $S  \)`
  51. }
  52. function advertising
  53. {
  54. NOFFTEMP="$NOFFERS"
  55. NOFFERS=""
  56. NCOUNT="0"
  57. if [ "$ADS" = "1" ]; then
  58.     while read OFFTEMP; do
  59.         ADV="${OFFTEMP#*\?}"
  60.         OFFTEMP="${OFFTEMP%%\?*}"
  61.         if [ "$ADV" != "featuredAd=true" ]; then
  62.             if [ "$NCOUNT" = "0" ]; then
  63.                 NOFFERS="$OFFTEMP"
  64.                 NCOUNT=`expr $NCOUNT + 1`
  65.             else
  66.                 NOFFERS=`echo -e "${NOFFERS}\n${OFFTEMP}"`
  67.             fi
  68.         fi
  69.     done <<< "$NOFFTEMP"
  70. else
  71.     while read OFFTEMP; do
  72.         OFFTEMP="${OFFTEMP%%\?*}"
  73.         if [ "$NCOUNT" = "0" ]; then
  74.             NOFFERS="$OFFTEMP"
  75.             NCOUNT=`expr $NCOUNT + 1`
  76.         else
  77.             NOFFERS=`echo -e "${NOFFERS}\n${OFFTEMP}"`
  78.         fi
  79.     done <<< "$NOFFTEMP"
  80. fi
  81. }
  82. # Pierwsze uruchomienie
  83. if [ ! -e warunki_ofert.dat ]; then
  84.     echo "========"
  85.     echo "INSTRUKCJA KONFIGURACJI SKRYPTU"
  86.     echo ""
  87.     echo "1."
  88.     echo "Skrypt używa następujących plików do przechowywania danych"
  89.     echo "oferty.dat, news*.dat,"
  90.     echo "gdzie * odpowiada dowolnej liczbie."
  91.     echo "UPEWNIJ SIĘ, że folder, w którym jest skrypt nie zawiera powyższych plików przed kolejnym uruchomieniem"
  92.     echo ""
  93.     read -t 30 -p "Naciśnij ENTER aby kontynuować"
  94.     echo ""
  95.     echo "2."
  96.     echo "Aby umieścić dane warunki wyszukiwania w Gumtree wejdź w odpowiedni link, zaznacz swoje warunki, skopiuj i umieść w pliku:"
  97.     echo "warunki_ofert.dat"
  98.     echo "W formacie:"
  99.     echo "OPIS_KATEGORII|ADRES_URL"
  100.     echo "np"
  101.     echo "Mieszkania na Ochocie|http://www.gumtree.pl/fp-domy-i-mieszkania-do-wynajecia/ochota/c9008l3200013?AdType=2&maxPriceBackend=165000"
  102.     echo ""
  103.     echo "Pamiętaj, aby zostawić ostatnią linię pliku ofert.dat pustą. Upewnij się, że nie zostawiłeś spacji po adresie URL."
  104.     echo ""
  105.     read -t 30 -p "Naciśnij ENTER aby kontynuować"
  106.     echo ""
  107.     echo "4."
  108.     echo "Czas odświeżania ofert możesz zmienić bezpośrednio modyfikując skrypt"
  109.     echo "========"
  110.     echo "" > warunki_ofert.dat
  111. elif [ "$1" = "-D" ]; then
  112.     echo "================"
  113.     echo "UWAGA: URUCHOMIONO TRYB GRUNTOWNEGO CZYSZCZENIA"
  114.     echo -e "================\n"
  115.     OFFERSDAT=`cat "oferty.dat"`
  116.     LINENR="0"
  117.     LINEC="0"
  118.     ALLLINE=`echo "$OFFERSDAT" | wc -l`
  119.     while read LINKLIST; do
  120.         LINENR=`expr $LINENR + 1`
  121.         LINEC=`expr $LINEC + 1`
  122.         ISTHAT=`curl -s "$LINKLIST"`
  123.         if [ "$ISTHAT" = "" ]; then
  124.             sed -i ${LINENR}d oferty.dat
  125.             LINENR=`expr $LINENR - 1`
  126.         fi
  127.         echo -en "\r                                                                         \r Sprawdzono linię ${LINEC}/${ALLLINE}."
  128.     done <<< "$OFFERSDAT"
  129.     DIFF=`expr $LINEC - $LINENR`
  130.     echo -e "\n==============="
  131.     echo "Zakończono: usunięto $DIFF nieaktualnych linii"
  132. else
  133. # Główna część programu
  134. while [ 1 ]; do
  135.     clear
  136.     touch oferty.dat
  137.     if [ "$1" != "-c" ]; then
  138.         echo "================"
  139.         echo "NOWE OFERTY:"
  140.         echo "================"
  141.     else
  142.         echo "================"
  143.         echo "URUCHOMIONO TRYB CZYSZCZENIA"
  144.         echo "================"
  145.     fi
  146.     COUNT=0
  147.     ANSWER=""
  148.     NOFFERS=""
  149.     NOFFERS2=""
  150.     NOFFERS3=""
  151.     ALL="0"
  152.     DO="0"
  153.     if [ "$1" = "-c" ]; then
  154.      MAXPAGE=""
  155.     fi
  156. # Ustalenie aktualnego czasu
  157.     D=`date +%j`
  158.     S=`date +%S`
  159.     M=`date +%M`
  160.     H=`date +%H`
  161. # Pobieranie linków do wybranych ofert
  162.     while read OFFER; do
  163.         PAGE="1"
  164.         DISCONNECT="0"
  165.         COUNT=`expr $COUNT + 1`
  166.         while [ 1 ]; do
  167.             if [ "$MAXPAGE" != "" ]; then
  168.                 if [ "$MAXPAGE" -lt "$PAGE" ]; then
  169.                     break
  170.                 fi
  171.             fi
  172.             if [ "$NOFFERS" != "" ]; then
  173.                 NOFFERS2="$NOFFERS"
  174.             fi
  175.             DESC=${OFFER%%\|*}
  176.             SITE=${OFFER#*\|}
  177.             SEARCH=`echo "$SITE" | grep "?"`
  178.             if [ "$SEARCH" = "" ]; then
  179.                 echo -ne "\r                                                                     \rPobieranie ${DESC} s. ${PAGE}"
  180.                 NOFFERS=`curl -s "${SITE}?Page=${PAGE}"|grep adLinkSB| awk '{ print $2}'|awk -F"class" '{ print $1}'|awk -F"\"" '{ print $2}'`
  181.                 if [ "$NOFFERS" = "" ]; then
  182.                     echo -ne "\r                                                                     \r   Brak dostępu do internetu lub błędnie sformułowany link w pliku warunki_ofert.dat (dla ${DESC})\n"
  183.                     DISCONNECT="1"
  184.                     DO="1"
  185.                     break
  186.                 fi
  187.                 advertising
  188.             else
  189.                 echo -ne "\r                                                                     \rPobieranie ${DESC} s. ${PAGE}"
  190.                 NOFFERS=`curl -s "${SITE}&Page=${PAGE}"|grep adLinkSB| awk '{ print $2}'|awk -F"class" '{ print $1}'|awk -F"\"" '{ print $2}'`
  191.                 if [ "$NOFFERS" = "" ]; then
  192.                     echo -ne "\r                                                                     \r   Brak dostępu do internetu lub błędnie sformułowany link w pliku warunki_ofert.dat (dla ${DESC})\n"
  193.                     DISCONNECT="1"
  194.                     DO="1"
  195.                     break
  196.                 fi
  197.                 advertising
  198.             fi
  199. # Sprawdzanie, czy strona istnieje, czy się powtarza
  200.             if [ "$NOFFERS2" != "" ]; then
  201.                 NR=`echo "$NOFFERS" | wc -l`
  202.                 TEMP=`echo "$NOFFERS" | sed -n ${NR}p`
  203.                 NR=`echo "$NOFFERS2" | wc -l`
  204.                 TEMP2=`echo "$NOFFERS2" | sed -n ${NR}p`
  205.                 if [ "$TEMP" = "$TEMP2" ]; then
  206.                     NOFFERS=""
  207.                     NOFFERS2=""
  208.                     break
  209.                 else
  210.                     if [ "$NOFFERS3" = "" ]; then
  211.                         NOFFERS3="$NOFFERS"
  212.                     else
  213.                         NOFFERS3=`echo -e "$NOFFERS3\n$NOFFERS"`
  214.                     fi
  215.                 fi
  216.             else
  217.                 if [ "$NOFFERS3" = "" ]; then
  218.                     NOFFERS3="$NOFFERS"
  219.                 else
  220.                     NOFFERS3=`echo -e "$NOFFERS3\n$NOFFERS"`
  221.                 fi
  222.             fi
  223. # Sprawdzanie, czy dane oferty były już wcześniej w bazie
  224.             while read LINE; do
  225.                 ISIT=`cat oferty.dat | grep $LINE`
  226.                 if [ "$ISIT" = "" ] && [ "$1" != "-c" ]; then
  227.                     if [ "$MONLINE" = "1" ]; then
  228.                         ISONLINE=`curl -s "$LINE"`
  229.                         if [ "$ISONLINE" != "" ]; then
  230.                             echo "$LINE" >> oferty.dat
  231.                             echo "$LINE" >> news${COUNT}.dat
  232.                             ALL=`expr $ALL + 1`
  233.                         fi
  234.                     else
  235.                     echo "$LINE" >> oferty.dat
  236.                     echo "$LINE" >> news${COUNT}.dat
  237.                     ALL=`expr $ALL + 1`
  238.                     fi
  239.                 fi
  240.             done <<< "$NOFFERS"
  241.             PAGE=`expr $PAGE + 1`
  242.         done
  243. # Wypisanie nowych ofert
  244.         if [ "$1" != "-c" ]; then
  245.         if [ -e "news${COUNT}.dat" ] && [ "$DISCONNECT" = "0" ]; then
  246.             NEWS=`cat news${COUNT}.dat`
  247.             if [ "$NEWS" != "" ]; then
  248.                 RING=1
  249.                 echo -e "\r                                                                                                      \r   $DESC"
  250.                 echo ""
  251.                 echo "$NEWS"
  252.                 echo "================"
  253.             else
  254.                 echo -e "\r                                                                                                      \r   Brak ofert dla: $DESC"
  255.                 echo "================"
  256.             fi
  257.         elif [ "$DISCONNECT" = "0" ]; then
  258.             echo -e "\r                                                                                                      \r   Brak ofert dla: $DESC"
  259.             echo "================"
  260.         elif [  -e "news${COUNT}.dat" ]; then
  261.             NEWS=`cat news${COUNT}.dat`
  262.             if [ "$NEWS" != "" ]; then
  263.                 RING=1
  264.                 echo -e "\n================\nWypisuję zapamiętane oferty dla ${DESC}:\n"
  265.                 echo "$NEWS"
  266.                 echo -e "================\n"
  267.             fi
  268.         fi
  269.         fi
  270.     done < "warunki_ofert.dat"
  271. # Wyszukanie ofert już nieistniejących
  272.     if [ "$DO" = "0" ] && [ "$MAXPAGE" = "" ] && [ "$ONLYDEEP" = "0" ]; then
  273.         OFFERSDAT=`cat "oferty.dat"`
  274.         LINENR="0"
  275.         while read LINKLIST; do
  276.             LINENR=`expr $LINENR + 1`
  277.             ISTHAT=`echo "$NOFFERS3" | grep "$LINKLIST"`
  278.             if [ "$ISTHAT" = "" ]; then
  279.                 sed -i ${LINENR}d oferty.dat
  280.                 LINENR=`expr $LINENR - 1`
  281.             fi
  282.         done <<< "$OFFERSDAT"
  283.     fi
  284. # Powiadomienie o ofertach i oczekiwanie
  285.     if [ "$RING" = "1" ] && [ "$1" != "-c" ]; then
  286.         if [ "$ALL" -gt "0" ]; then
  287.             if [ "$NOTIFICATION" = "1" ]; then
  288.                 notify-send  "GUMTREE" "Znaleziono $ALL nowe oferty na gumtree.pl"
  289.             fi
  290.         fi
  291.         while [ "$ANSWER" != "N" ] && [ "$ANSWER" != "T" ]; do
  292.             ANSWER="N"
  293.             delta_time
  294.             if [ "$TW" -le "0" ]; then
  295.                 break
  296.             fi
  297.             echo ""
  298.             echo -n "Zapoznałeś się ze wszystkimi ofertami? [T/N] "
  299.             read -t $TW ANSWER
  300.             if [ "$ANSWER" = "T" ]; then
  301.                 RING="0"
  302.                 rm news*dat
  303.                 echo "Wyczyszczono nowości"
  304.             fi
  305.             if [ "$ANSWER" = "N" ]; then
  306.                 echo "Nowości pozostaną nieodczytane"
  307.             fi 
  308.         done
  309.             echo "Oczekuję na nowe oferty"
  310.     elif [ "$1" = "-c" ]; then
  311.         echo -e "\n   Usunięto nieaktualne oferty z oferty.dat"
  312.         break
  313.     else
  314.         echo "   Brak nowych ofert, czekam:"
  315.     fi
  316.     delta_time
  317.     while [ "$TW" -gt "0" ]; do
  318.         sleep 1
  319.         delta_time
  320.         echo -en "\r                \r   $TW s"
  321.     done
  322. done
  323. fi
  324. # Koniec skryptu
Advertisement
Add Comment
Please, Sign In to add comment