Professional Documents
Culture Documents
Praktyczne skrypty,
ktre rozwi
trudne problemy
Autor: Steve Pugh
Tumaczenie: Tomasz Walczak, Marek Kowalcze
ISBN: 978-83-246-2254-2
Tytu oryginau: Wicked Cool Ruby Scripts:
Useful Scripts that Solve Difficult Problems
Format: 170x230, stron: 232
Poznaj przyjemno pracy z jzykiem Ruby!
Jak manipulowa acuchami znakw?
Jak edytowa zbiory zdj i wydobywa informacje z fotografii?
Jak zmienia uprawnienia i modyfikowa konta uytkownikw?
Spis treci
PRZEDMOWA ........................................................................................... 15
PODZIKOWANIA ................................................................................... 17
WPROWADZENIE ..................................................................................... 19
Odjazdowe skrypty w jzyku Ruby ........................................................................................20
Musisz zna podstawy jzyka Ruby ........................................................................................20
Dokumentacja ........................................................................................................................20
Struktura ksiki i zastosowane podejcie .............................................................................21
Witryna WWW ......................................................................................................................23
1.
NARZDZIA DO UYTKU OGLNEGO .................................................... 25
1. Wyszukiwanie zmodyfikowanych plikw ...........................................................................25
Kod ...............................................................................................................................26
Uruchamianie kodu ......................................................................................................27
Dane wyjciowe ...........................................................................................................27
Jak dziaa ten skrypt? ....................................................................................................28
Modyfikowanie skryptu ................................................................................................29
2. Szyfrowanie pliku ...............................................................................................................30
Kod ...............................................................................................................................30
Uruchamianie kodu ......................................................................................................30
Dane wyjciowe ...........................................................................................................31
Jak dziaa ten skrypt? ....................................................................................................31
Modyfikowanie skryptu ................................................................................................32
3. Odszyfrowywanie pliku ......................................................................................................32
Kod ...............................................................................................................................32
Uruchamianie kodu ......................................................................................................33
Wyniki ..........................................................................................................................33
Jak dziaa ten skrypt? ....................................................................................................33
Spis treci
Spis treci
Spis treci
Spis treci
Spis treci
Spis treci
11
Spis treci
Spis treci
13
7
Serwery
i wydobywanie danych
MOCN STRON JZYKA RUBY JEST MOLIWO UYCIA GO DO ZAUTOMATYZOWANIA INTERAKCJI Z ZASOBAMI SIECI WWW. TEN ROZDZIA
ZAWIERA KRTKIE OMWIENIE PROCESU PRZETWARZANIA STRON
42. Definicje
define.rb
Kod
require "open-uri"
unless ARGV[0]
puts "Musisz poda definiowane sowo."
puts "Sposb uycia: ruby define.rb <definiowane sowo>"
exit
end
word = ARGV[0].strip
url = "http://dictionary.reference.com/browse/#{word}"
begin
open(url) do |source|
source.each_line do |x|
if x =~ /No results found/
puts "\nDefinicji nie znaleziono - sprawd pisowni."
exit
end
if x =~ /(1\.)<\/td> <td>(.*)<\/td/
puts "\n#{$1} #{$2}"
exit
end
end
puts "Niestety, nie mona znale definicji."
end
rescue => e
puts "Wystpi bd sprbuj ponownie."
puts e
end
Uruchamianie kodu
Uruchom skrypt przez wpisanie nastpujcej instrukcji:
ruby define.rb definiowane_sowo
Chciaem znale definicj sowa Ruby. Niestety, pierwsze zwrcone objanienie nie brzmiao najbardziej odjazdowy jzyka programowania.
144
Rozdzia 7
Dane wyjciowe
Skrypt wywietla definicj podanego sowa. Jeli nie mona jej znale, program
prosi uytkownika o sprawdzenie pisowni. Moliwe, e podany wyraz w ogle nie
istnieje.
1.a red variety of corundum, used as a gem.
145
Modyfikowanie skryptu
Jednym ze sposobw na zmodyfikowanie skryptu jest dodanie obsugi porednika midzy uytkownikiem a daniem do serwera sieciowego. Jeli korzystasz
z takiego porednika, musisz zastosowa to rozwizanie. Jeeli interesuje Ci
ruch w sieci generowany przez skrypt w jzyku Ruby, porednik pomoe Ci
uzyska dodatkowe informacje. Aby dowiedzie si, jak je uzyska, zajrzyj do dokumentacji biblioteki open-uri. Potrzebna skadnia wyglda nastpujco: open(url,
:proxy => "http://127.0.0.1:8080"). Zwykle nie korzystam z porednika przy
przegldaniu sieci WWW, jednak jeli w trakcie tworzenia stron wykryj bdy,
czsto pomocne jest przyjrzenie si ruchowi w sieci.
Do diagnozowania problemw uywam bezpatnego sieciowego porednika
Paros (http://www.parosproxy.org/). Narzdzie to naley zainstalowa lokalnie na
wasnej maszynie, a nastpnie mona obserwowa zgaszane dania sieciowe
i odbierane odpowiedzi. Dziki wykorzystaniu przy programowaniu narzdzia
Paros zaoszczdziem sobie wielu godzin diagnozowania. Jestem bardzo przywizany do tego porednika, jednak istnieje te wiele innych podobnych programw,
dlatego warto poszuka czego dla siebie.
Ten skrypt wysya wiadomo SMS pod podany numer telefonu komrkowego.
Ostrzegam przed naduywaniem tej funkcji, jednak musisz wyprbowa ten program1. Skrypt ma automatyzowa korzystanie z witryny, ktra suy do wysyania
wiadomoci SMS. Zamiast pobiera statyczn zawarto strony, skrypt ten automatyzuje wypenianie i przesyanie 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 uyty w tym skrypcie zakoczy dziaalno, jednak za pomoc tej samej techniki moesz przesya
wiadomoci w innych bramkach SMS przyp. tum.
146
Rozdzia 7
ie.document.all["carrier"].value ="TMOBILE"
ie.document.all["subject"].value ="***Ruby rzdzi***"
ie.document.all.tags("textarea").each do |i|
i.value = "Dziki za dobr robot, Matz!"
end
ie.document.all.send_button.click
Uruchamianie kodu
Aby uruchomi ten skrypt, wpisz nastpujce polecenie:
ruby sms.rb
Dane wyjciowe
Ten skrypt nie generuje adnych danych, jednak jeli udanie zakoczy dziaanie,
telefon o podanym numerze powiadomi Ci o odebraniu wiadomoci. W przykadzie uyem fikcyjnych danych, jednak moesz je zmieni, aby wyprbowa
program.
Dostpnych jest te kilka bibliotek przeznaczonych do automatyzacji witryn. Narzdzia te s niezwykle przydatne do testw regresji i jakoci aplikacji sieciowych.
Jedn z popularnych bibliotek tego typu jest Watir. Szczegowe informacje na jej
temat znajdziesz na stronie http://wtr.rubyforge.org/.
Skrypt tworzy nowy obiekt typu win32ole na podstawie argumentu w postaci
uchwytu przegldarki IE . Uchwyt ten informuje bibliotek win32ole, ktr
aplikacj ma kontrolowa. Przy uyciu wbudowanej w przegldark IE metody
navigate skrypt przechodzi pod okrelony adres URL http://toolbar.google.com/
send/sms/index.php . Nastpny wiersz ustawia atrybut okna przegldarki. Jeli
nie chcesz widzie, jak skrypt wykonuje swe zadania, moesz uy w tym wierszu
wartoci false, a okno przegldarki bdzie dziaa w tle. Wtedy jego obecno
bdziesz mg wykry tylko na licie zada. Poniewa lubi widzie dziaanie
programu, ustawiem wspomniany atrybut na true. Aplikacja Internet Explorer
pojawi si i zniknie w krtkim czasie, dlatego bacznie przygldaj si ekranowi.
147
Wydobywanie odnonikw ze stron WWW ma wiele zastosowa. Mona to zrobi podobnie jak w przypadku innych zada na wiele sposobw. W rozdziale 2. zobaczye skrypt do sprawdzania poprawnoci odnonikw w witrynie.
Z uwagi na konieczno walidacji odsyaczy program ten wymaga wikszej liczby
wierszy kodu ni skrypt, ktry musi tylko wydoby wszystkie odnoniki. Nie
zamierzam tworzy tu robota sieciowego, jednak opisz kilka jego podstawowych
komponentw. Pierwszy z nich to mechanizm wydobywania odnonikw.
Kod
require 'mechanize'
unless ARGV[0]
puts "Musisz poda adres witryny."
puts "Sposb uycia: ruby linkScrape.rb <przetwarzany adres URL>"
exit
end
agent = WWW::Mechanize.new
agent.set_proxy('localhost',8080)
148
Rozdzia 7
begin
page = agent.get(ARGV[0].strip)
page.links.each do |l|
if l.href.split("")[0] =='/'
puts "#{ARGV[0]}#{l.href}"
else
puts l.href
end
end
rescue => e
puts "Wystpi bd."
puts e
retry
end
Uruchamianie kodu
W celu uruchomienia skryptu wpisz nastpujce polecenie:
ruby linkScrape.rb http://przetwarzany_adres_url.com/
Dane wyjciowe
Skrypt wywietla list wszystkich odnonikw znalezionych na stronie o podanym adresie URL. Ja wydobyem odsyacze ze strony http://www.nostarch.com/
main_menu.htm.
index.htm
catalog.htm
wheretobuy.htm
about.htm
jobs.htm
media.htm
http://www.nostarch.com/blog/
http://ww6.aitsafe.com/cf/
review.cfm?userid=8948354
abs_bsd2.htm
openbsd.htm
freebsdserver.htm
debian.htm
howlinuxworks.htm
appliance.htm
lcbk2.htm
lme.htm
nongeeks.htm
lps.htm
interactive.htm
gimp.htm
inkscape.htm
js2.htm
eblender.htm
oophp.htm
wpdr.htm
webbots.htm
google.htm
growingsoftware.htm
rootkits.htm
hacking2.htm
voip.htm
firewalls.htm
securityvisualization.htm
silence.htm
stcb4.htm
scsi2.htm cisco.htm
cablemodem.htm
149
mug.htm
ubuntu_3.htm
imap.htm
pf.htm
postfix.htm
webmin.htm
endingspam.htm
cluster.htm
nagios.htm
nagios_2e.htm
pgp.htm
packet.htm
tcpip.htm
assembly.htm
debugging.htm
qt4.htm
vb2005.htm
vsdotnet.htm
codecraft.htm
hownotc.htm
idapro.htm
mugperl.htm
gnome.htm
plg.htm
ruby.htm
vbexpress.htm
wcj.htm
wcps.htm
wcphp.htm
wcruby.htm
wcss.htm
greatcode.htm
greatcode2.htm
wpc.htm
xbox.htm
insidemachine.htm
nero7.htm
wireless.htm
creative.htm
ebaypg.htm
ebapsg.htm
geekgoddess.htm
wikipedia.htm
indtb.htm
sayno.htm
networkknowhow.htm
sharing.htm
apple2.htm
newmac.htm
cult_mac.htm
ipod.htm
art_of_raw.htm
firstlego.htm
flego.htm
legotrains.htm
sato.htm
nxt.htm
nxtonekit.htm
zoo.htm
legobuilder.htm
nxtig.htm
vlego.htm
mg_databases.htm
mg_statistics.htm
eli.htm
index.htm
Rozdzia 7
ktrego uywam. Jeli nie chcesz korzysta z narzdzia tego rodzaju, usu ten wiersz
kodu. Nastpnie skrypt uywa metody get obiektu agent do pobrania zawartoci
strony . Ciekaw cech biblioteki mechanize jest automatyczne kategoryzowanie
pobranych informacji. Wyszukiwanie specyficznych elementw strony za pomoc
tej biblioteki znacznie uatwia ycie programistom jzyka Ruby.
W zmiennej page znajduje si tablica links. Dziki bibliotece mechanize odnoniki s ju przetworzone. Podobnie jak przy korzystaniu z kadej innej tablicy
mona uy metody each do przejcia po wszystkich elementach tablicy links.
Pamitaj, e elementy link zawieraj nie tylko adres URL kadego odnonika, ale
te inne atrybuty zdefiniowane w kodzie rdowym. Tu potrzebny jest tylko
atrybut href, aby skrypt mg wywietli go w konsoli . Jeli chcesz wydoby
informacje z duej witryny, powiniene zapisa dane w pliku, ale wybr podejcia
naley do Ciebie. Po wywietleniu odnonikw skrypt koczy dziaanie.
Modyfikowanie skryptu
Istnieje kilka innych ciekawych narzdzi sieciowych, ktre przetwarzaj strony
w podobny sposb. S to na przykad Hpricot (http://wiki.github.com/why/hpricot/)
i Rubyful Soup (http://www.crummy.com/software/RubyfulSoup/). Wyprbuj je,
aby znale narzdzie dostosowane do wasnych potrzeb.
Ten skrypt wydobywa kady rysunek ze strony o adresie URL podanym przez
uytkownika. Pobierane pliki graficzne obejmuj obrazki znajdujce si na serwerze danej strony, a take rysunki doczane z innych serwerw sieciowych.
Kod
require "open-uri"
require "pathname"
unless ARGV[0]
puts "Musisz poda adres URL, aby wydoby rysunki."
puts "Sposb uycia: ruby imageScrape.rb <przetwarzany adres URL>"
exit
end
url = ARGV[0].strip
begin
open(url, "User-Agent" => "Mozilla/4.0 (compatible; MSIE 5.5; Windows
98)")
do |source|
source.each_line do |x|
if x =~ /<img src="(.+.[jpeg|gif])"\s+/
name = $1.split('"').first
151
Uruchamianie kodu
Uruchom skrypt przez wpisanie poniszej instrukcji:
ruby imageScrape.rb http://przetwarzany_adres_url.com/
Dane wyjciowe
Ten skrypt pobiera wszystkie rysunki znalezione na stronie o podanym adresie
URL. Ja wczyem przetwarzanie strony http://www.ruby-lang.org/ i pobraem
dwa obrazki: logo.gif (logo jzyka Ruby) i download.gif (rysunek-odnonik, ktry
pozwala pobra jzyk Ruby).
Rozdzia 7
i zapisania go w pliku (jego nazw zawiera zmienna copy) . Ten proces naley
powtrzy dla kadego rysunku znalezionego w dokumencie. Efekt tych operacji
skrypt zapisuje w katalogu, w ktrym zosta uruchomiony.
Modyfikowanie skryptu
Moesz uy gotowego parsera kodu HTML, takiego jak mechanize, Hpricot lub
Rubyful Soup. Te narzdzia dziaaj jeszcze dokadniej ni wyraenie regularne
zastosowane w skrypcie. Ponadto moesz zapisa rysunki w takiej samej strukturze
katalogw, w jakiej znajdoway si na serwerze sieciowym. Istnieje wiele rnych
moliwoci, a ten skrypt to dobry punkt wyjcia.
Kod
require 'rio'
require 'open-uri'
require 'uri'
unless ARGV[0] and ARGV[1]
puts "Musisz okreli operacj i adres URL."
puts "Sposb uycia: scrape.rb [strona|rysunki|linki] <przetwarzany
adres URL>"
exit
end
case ARGV[0]
when "strona"
rio(ARGV[1]) > rio("#{URI.parse(ARGV[1].strip).host}.html")
exit
when "rysunki"
begin
open(url, "User-Agent" => "Mozilla/4.0 (compatible; MSIE 5.5;
Windows 98)") do |source|
source.each_line do |x|
153
if x =~ /<img src="(.+.[jpeg|gif])"\s+/
name = $1.split('"').first
name = url + name if Pathname.new(name).absolute?
copy = name.split('/').last
File.open(copy, 'wb') do |f|
f.write(open(name).read)
end
end
end
end
rescue => e
puts "Wystpi bd sprbuj ponownie."
puts e
end
exit
when "linki"
links = File.open("links.txt","w+b")
begin
open(ARGV[1], "User-Agent" => "Mozilla/4.0 (compatible; MSIE 5.5;
Windows 98)") do |source|
links.puts URI.extract(source, ['http', 'https'])
end
rescue => e
puts "Wystpi bd sprbuj ponownie."
puts e
end
links.close
exit
else
puts "Podae nieprawidow instrukcj sprbuj ponownie."
puts "Sposb uycia: scrape.rb [strona|rysunki|linki] <przetwarzany
adres URL>"
exit
end
Uruchamianie kodu
Aby uruchomi skrypt, wpisz nastpujce polecenie:
ruby scrape.rb [strona|rysunki|linki] http://przetwarzany_adres_url.com/
Dane wyjciowe
Dane wyjciowe skryptu s rne w zalenoci od wybranej instrukcji. Moesz
zapozna si z przykadem z poprzedniego programu.
154
Rozdzia 7
Kod
require 'socket'
require 'digest/sha1'
begin
print "Uruchamianie klienta..."
client = TCPSocket.new('localhost', 8887)
puts "nawizano poczenie!\n\n"
temp = ""
5.times do
temp << client.gets
end
puts "Otrzymano 1024-bitowy klucz publiczny RSA!\n\n"
public_key = OpenSSL::PKey::RSA.new(temp)
155
Uruchamianie kodu
Aby wczy skrypt, wpisz nastpujc instrukcj:
ruby RSA_client.rb
Dane wyjciowe
Poniej znajduj si dane wyjciowe, wywietlane po udanym nawizaniu poczenia i przesaniu polecenia.
Uruchamianie klienta...nawizano poczenie!
Otrzymano 1024-bitowy klucz publiczny RSA!
Przesyanie polecenia...wysane!
156
Rozdzia 7
Po zapoznaniu si z klientem i jego kodem pora przyjrze si serwerowi. Przyjmuje on dane, sprawdza, czy kod SHA1 jest poprawny, odszyfrowuje informacje
i wykonuje polecenie z przesanego acucha znakw.
Kod
require 'openssl'
require 'socket'
require 'digest/sha1'
priv_key = OpenSSL::PKey::RSA.new(1024)
pub_key = priv_key.public_key
host = ARGV[0] || 'localhost'
port = (ARGV[1] || 8887).to_i
server = TCPServer.new(host, port)
157
Uruchamianie kodu
W celu uruchomienia skryptu wpisz ponisze polecenie:
158
Rozdzia 7
ruby RSA_server.rb
Dane wyjciowe
Poniej znajduj si dane wyjciowe, wywietlane po udanym nawizaniu poczenia i przesaniu polecenia.
Nawizano poczenie...trwa wysyanie klucza publicznego.
-----BEGIN RSA PUBLIC KEY----MIGJAoGBAMe12IJIyVULS/OLlHeekhZNyh2YhuGfJSwEozw2Z6GfaRjZg7s0cwqb
B/Z+MMUPIjCmiH38pkKzh5GhA8zcRSWEFtssa8HcyIowA5ftZM27/6diYz9kNueI
NO2kvlkqwU5KUOKnLISJnrZAlTbJMqio24dn3PNm27kgae8+KdrHAgMBAAE=
-----END RSA PUBLIC KEY----Przesano klucz publiczny trwa oczekiwanie na dane...
Otrzymano dane...
Potwierdzono integralno komunikatu...
Wykonywanie polecenia dla systemu Windows: "C:\Program Files\Windows Media
Player\mplayer2.exe" ruby.mp3
159
160
Rozdzia 7