Pobieranie stron za pomocą tej metody jest tak proste, że zawsze kiedy jej używam, na mojej twarzy gości uśmiech. Po metodzie open następuje blok, który przetwarza kod źródłowy zwrócony przez serwer sieciowy. Ponieważ chcemy pobrać specyficzny wiersz (definicję słowa), w następnym bloku skrypt dzieli kod źródłowy na wiersze. Jeśli serwis Dictionary.com nie znajdzie danego słowa, wyświetli komunikat No results found. Gdy skrypt w czasie analizowania kodu źródłowego wykryje podany wyraz, ale już nie jego definicję, wyświetli wskazówkę w postaci prośby o sprawdzenie pisowni słowa, a następnie zakończy działanie . Jeżeli jednak definicja jest dostępna, skrypt stara się wyodrębnić ją z kodu źródłowego. Do pobrania jej tekstu służy wyrażenie regularne. Ważną częścią użytego w skrypcie wyrażenia regularnego jest cyfra 1. Witryna Dictionary.com używa jej jako wskaźnika pierwszej definicji, którą program ma pobrać. Użycie w wyrażeniu regularnym nawiasów umożliwia skryptowi pogrupo-wanie określonych fragmentów dowolnego wiersza, które pasują do wyrażenia . Te grupy są zapisywane w zmiennych o nazwach od $1 do $n. Wiersz pod wyra- żeniem regularnym wyświetla definicję. Jeśli program nie znajdzie w kodzie źródłowym ani definicji, ani tekstu No results found, zwróci inny komunikat, który S e r we r y i w y d o b y w a ni e da n yc h 145 informuje użytkownika o tym, że nie można znaleźć wyjaśnienia słowa . Jeśli w czasie przetwarzania definicji pojawią się problemy, program uruchomi blok rescue i poinformuje, jaki błąd wystąpił. Modyfikowanie skryptu Jednym ze sposobów na zmodyfikowanie skryptu jest dodanie obsługi pośrednika między użytkownikiem a żądaniem do serwera sieciowego. Jeśli korzystasz z takiego pośrednika, musisz zastosować to rozwiązanie. Jeżeli interesuje Cię ruch w sieci generowany przez skrypt w języku Ruby, pośrednik pomoże Ci uzyskać dodatkowe informacje. Aby dowiedzieć się, jak je uzyskać, zajrzyj do doku-mentacji biblioteki open-uri. Potrzebna składnia wygląda następująco: open(url, :proxy => "http://127.0.0.1:8080"). Zwykle nie korzystam z pośrednika przy przeglądaniu sieci WWW, jednak jeśli w trakcie tworzenia stron wykryję błędy, często pomocne jest przyjrzenie się ruchowi w sieci. Do diagnozowania problemów używam bezpłatnego sieciowego pośrednika Paros ( http://www.parosproxy.org/). Narzędzie to należy zainstalować lokalnie na własnej maszynie, a następnie można obserwować zgłaszane żądania sieciowe i odbierane odpowiedzi. Dzięki wykorzystaniu przy programowaniu narzędzia Paros zaoszczędziłem sobie wielu godzin diagnozowania. Jestem bardzo przywią- zany do tego pośrednika, jednak istnieje też wiele innych podobnych programów, dlatego warto poszukać czegoś dla siebie. 43. Automatyczne wysyłanie SMS-ów sms.rb Ten skrypt wysyła wiadomość SMS pod podany numer telefonu komórkowego. Ostrzegam przed nadużywaniem tej funkcji, jednak musisz wypróbować ten pro-gram1. Skrypt ma automatyzować korzystanie z witryny, która służy do wysyłania wiadomości SMS. Zamiast pobierać statyczną zawartość strony, skrypt ten auto-matyzuje wypełnianie i przesyłanie formularza. Kod require 'win32ole' ie = WIN32OLE.new('InternetExplorer.Application') ie.navigate("http://toolbar.google.com/send/sms/index.php") ie.visible = true sleep 1 until ie.readyState() == 4 ie.document.all["mobile_user_id"].value ="5712013623" 1 Serwis użyty w tym skrypcie zakończył działalność, jednak za pomocą tej samej techniki możesz przesyłać wiadomości w innych bramkach SMS — przyp. tłum. 146 Rozdział 7 ie.document.all["carrier"].value ="TMOBILE" ie.document.all["subject"].value ="***Ruby rządzi***" ie.document.all.tags("textarea").each do |i| i.value = "Dzięki za dobrą robotę, Matz!" end ie.document.all.send_button.click Uruchamianie kodu Aby uruchomić ten skrypt, wpisz następujące polecenie: ruby sms.rb Dane wyjściowe Ten skrypt nie generuje żadnych danych, jednak jeśli udanie zakończy działanie, telefon o podanym numerze powiadomi Cię o odebraniu wiadomości. W przykładzie użyłem fikcyjnych danych, jednak możesz je zmienić, aby wypróbować program. Jak działa ten skrypt? Jeśli korzystasz z komputera z systemem Windows i nigdy nie używałeś biblioteki win32ole, powinieneś poświęcić trochę czasu na jej opanowanie, ponieważ auto-matyzowanie wykonywania zadań w tym systemie jest ciekawe i daje dużo satysfak-cji. Możesz nie tylko manipulować przeglądarką Internet Explorer, co ilustruje ten skrypt, ale też dowolnym produktem z pakietu Microsoft Office i innymi aplikacjami systemu Windows. UWAGA Dostępnych jest też kilka bibliotek przeznaczonych do automatyzacji witryn. Narzę- dzia te są niezwykle przydatne do testów regresji i jakości aplikacji sieciowych. Jedną z popularnych bibliotek tego typu jest Watir. Szczegółowe informacje na jej temat znajdziesz na stronie http://wtr.rubyforge.org/ . Skrypt tworzy nowy obiekt typu win32ole na podstawie argumentu w postaci uchwytu przeglądarki IE . Uchwyt ten informuje bibliotekę win32ole, którą aplikację ma kontrolować. Przy użyciu wbudowanej w przeglądarkę IE metody navigate skrypt przechodzi pod określony adres URL — http://toolbar.google.com/ send/sms/index.php . Następny wiersz ustawia atrybut okna przeglądarki. Jeśli nie chcesz widzieć, jak skrypt wykonuje swe zadania, możesz użyć w tym wierszu wartości false, a okno przeglądarki będzie działać w tle. Wtedy jego obecność będziesz mógł wykryć tylko na liście zadań. Ponieważ lubię widzieć działanie programu, ustawiłem wspomniany atrybut na true. Aplikacja Internet Explorer pojawi się i zniknie w krótkim czasie, dlatego bacznie przyglądaj się ekranowi. S e r we r y i w y d o b y w a ni e da n yc h 147 Następnie skrypt uruchamia pętlę, która warunkowo wczytuje stronę. Jak pewnie wiesz, strony witryn nie pojawiają się natychmiast. Aby skrypt nie przesłał informacji przedwcześnie, należy „uśpić” program na sekundę, a następnie sprawdzić, czy kod readyState ma właściwą wartość (4) . Przedwczesne działania nigdy nie są korzystne, a w tym przypadku spowodują, że skrypt przestanie działać. Po zakończeniu wczytywania dokumentu przez przeglądarkę IE skrypt może wypełnić odpowiednie pola. Program wykrywa odpowiednie pola na podstawie nazw atrybutów. Jeśli zaj-rzysz do kodu źródłowego witryny, znajdziesz obiekty o nazwach mobile_user_id, carrier, subject i tak dalej. Te informacje służą do określenia, gdzie skrypt ma zapisać poszczególne dane wejściowe . Większość kodu HTML z omawianej
|