On 3/5/08, NeCoSi <necosi@???> wrote:
> E' possibile scrivere un codice in javascript che carica un url tipo
> http://sito.com/page.aspx in cui c'è un form, ed inizia a inserire dati
> nel form, fare il submit e prelevare le info dalla pagina di ritorno del
> submit in automatico?
No.
Si chiama Same Origin Policy ed è una misura di sicurezza implementata
in Js ed enforced (anche se in modo differente) a livello di client.
Trovi qualche news qui:
http://en.wikipedia.org/wiki/Same_origin_policy
E' lo stesso meccanismo di "tutela" per cui non puoi aprire un iframe
remoto e leggere del contenuto.
> Ad un certo punto mi son domandato se la tecnologia javascript permette
> questa cosa, o se è solo un abbaglio notturno.
Lo fa in locale e tutto va. Lo metti online e picche. Trovi la
spiegazione lassopra...
> In alternativa sarei costretto a fare un tool che si connette al server
> (socket), faccia una login (kerberos), attraverso il protocollo http
> richieda una pagina, la parsi, compila la form, la submitta, riceve la
> risposta e la riparsa e salva il tutto.
Che è in pratica una cazzata in praticamente ogni linguaggio. Apparte
Kerberos, che non serve ad una mazza e che probabilmente hai messo per
fare figo.
Se devi interagire pesantemente con del Javascript ti consiglio Watir.
Qui sotto ci sono le quattro righe di codice con nui ho inculato il
sistema (scritto col culo) di votazioni Online della campagna di
berlusconi rivotiamo.it.
[Ruby]
require 'rubygems' require 'SafariWatir'
startUrl = "
http://www.rivotiamo.it/"
b = Watir::Safari.new b.speed = :fast
(1..1000).each do |x|
begin
fakeName = rand(500000000).tos(26)
b.goto(startUrl)
b.textfield(:id, "name").set(fakeName)
b.textfield(:id, "surname").set(fakeName)
b.textfield(:id, "cap").set(20000 + rand(400))
fakeName = "#{fakeName}@#{fakeName}.com"
b.textfield(:id, "email").set(fakeName)
b.link(:id, "bsign").click()
rescue
puts " Sh*i happens…"
end
end
[/ruby]
Qui i dettagli:
http://www.lastknight.com/2007/11/20/rivotiamoit-qualche-piccolo-problema/
Se invece devi solamente fare una POST il problema è ancora più semplice:
Per una semplice POST basta una riga di codice
res = Net::HTTP.post_form(URI.parse('http://www.example.com/search.cgi'),
{'q'=>'ruby', 'max'=>'50'})
puts res.body
Altrimenti puoi usare anche la basic authentication
res = Net::HTTP.post_form(URI.parse('http://jack:pass@www.example.com/todo.cgi'),
{'from'=>'2005-01-01',
'to'=>'2005-03-31'})
puts res.body
Oppure farti uno scroscio di pugnette e controllare ogni singolo
aspetto in una volta:
url = URI.parse('http://www.example.com/todo.cgi')
req = Net::HTTP::Post.new(url.path)
req.basic_auth 'jack', 'pass'
req.set_form_data({'from'=>'2005-01-01', 'to'=>'2005-03-31'}, ';')
res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
case res
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
else
res.error!
end
> Fosse disponibile la prima strada, sarebbe davvero figo :)
Non va.
Cope with it.
M.