Ruby Mechanize как засабмитить форму?

Статус
В этой теме нельзя размещать новые ответы.

roddik

Колбаска
Регистрация
26 Янв 2007
Сообщения
346
Реакции
292
Собственно неработающий код:

Код:
Код:
require 'mechanize' 
 
m = WWW::Mechanize.new 
p = m.get('http://art-mobile.com.ua/register.php', 'http://google.com') 
f = p.forms.first 
 
f.submit(f.buttons.last)

вылетает у меня с ошибкой

Код:
Код:
D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/util.rb:42:in `iconv': "Ðåãèñòðàöèÿ"... (Iconv::IllegalSequence) 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/util.rb:42:in `from_native_charset' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:152:in `from_native_charset' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:144:in `block in proc_query' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:143:in `map' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:143:in `proc_query' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:198:in `block in build_query' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:197:in `each' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:197:in `build_query' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:214:in `request_data' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize.rb:401:in `post_form' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize.rb:344:in `submit' 
from D:/ruby/lib/ruby/gems/1.9.1/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:130:in `submit'


По проведенным мной колупаниям стало видно, что ошибка случается при попытке сконвертить value кнопки сабмита в правильную кодировку: windows-1251 <= Ðåãèñòðàöèÿ (UTF-8). Если отключить конвертирование, сниффер показывает составление строки пост запроса из неправильного значения, хотя должно быть "Регистрация" в цп-1251. Сайт выбран случайно, просто было лень с локалхоста забрасивать куда-то форму с русским value кнопки.
ruby -v: ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32]
mechanize: 0.9.3

Спасибо

PS: продолжаю кросспостить: пару дней назад на stackoverflow - ничего
сегодня на багтрекер - ничего
сегодня на руборд - ничего
сегодня на вио гугла - ничего
ппц
 
у меня руби не стоит, но попробуй вот этот код:
Код:
require 'rubygems'
require 'mechanize'

m = WWW::Mechanize.new
p = m.get('http://art-mobile.com.ua/register.php')
f = p.forms.name('inputform').first
f.username = ARGV[0]
f.password = ARGV[1]
 ...
p = m.submit(form)

что касается кодировки то есть два способа
1) шелом (bash)
Код:
#!/usr/bin/env bash
#echo \'"$@"\'
meta=$(head -n20 "$@" | sed s/\>/\>\\n/g | egrep -i "<meta[^>].*>")
if echo $meta |grep -iq "utf" 
then
	cat "$@" |tr -d "\n" && echo -n + >&2 
	exit
elif echo $meta |grep -iq "866" 
then
	cat "$@" | iconv -f cp866 |tr -d "\n" && echo -n + >&2 
	exit
elif echo $meta |grep -iq "1251" 
then
	cat "$@" | iconv -f cp1251 |tr -d "\n" && echo -n + >&2 
	exit
elif echo $meta |grep -iq "1252" 
then
	cat "$@" | iconv -f cp1252 |tr -d "\n" && echo -n + >&2 
	exit
elif echo $meta |grep -iq "koi8" 
then
	cat "$@" | iconv -f koi8r |tr -d "\n" && echo -n + >&2 
	exit
elif echo $meta |grep -iq "8859-1" 
then
	cat "$@" | iconv -f ISO_8859-1 |tr -d "\n" && echo -n + >&2 
	exit
elif echo $meta |grep -iq "8859-5" 
then
	cat "$@" | iconv -f ISO_8859-5 |tr -d "\n" && echo -n + >&2 
	exit
fi

if echo $meta | egrep -qi "<meta[^>].*charset.*>"
then
	echo $meta
else
	echo -n - >&2
fi
2) самим руби используя класс iconv
Код:
ic = Iconv.new('UTF-8','WINDOWS-1251')
convertedstr = ic.iconv(str)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху