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

Тема в разделе "Другие языки", создана пользователем roddik, 25 авг 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
    Собственно неработающий код:

    Код:
    Код:
    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 - ничего
    сегодня на багтрекер - ничего
    сегодня на руборд - ничего
    сегодня на вио гугла - ничего
    ппц
     
  2. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    731
    Симпатии:
    421
    у меня руби не стоит, но попробуй вот этот код:
    Код:
    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)
    
     
  3. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    285
Статус темы:
Закрыта.