使用Mechanize和Nokogiri登录网站?

dan*_*mcc 5 screen-scraping login www-mechanize nokogiri

我在使用我们的服务提供商登录表单时遇到了一些困难.其他网站工作正常但由于某种原因我无法通过他们的登录表单.

网站登录是这样的:

<form accept-charset="UTF-8" action="/sessions" class="new_user_session" id="new_user_session" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="kaLEkPesQfeheronzGTdfnVAzpuUiC+VmjVXBu540n8=" /></div>

      <fieldset class="big">

      <div class="form-row">
        <div class="form-label">
        <label for="user_session_email">Email</label>
        </div>
        <div class="form-field">
        <input id="user_session_email" name="user_session[email]" size="30" type="text" />

        </div>

      </div>          

      <div class="form-row">
        <div class="form-label">
        <label for="user_session_password">Password</label>
        </div>
        <div class="form-field">
        <input id="user_session_password" name="user_session[password]" size="30" type="password" />

        </div>

        <div class="form-comment"><p><a href="/password_resets/new" class="link-password-recovery">Forgot your password?</a></p></div>
      </div>

        <div class="form-row optional">
          <div class="form-field">
            <label for="user_session_remember_me"><input name="user_session[remember_me]" type="hidden" value="0" /><input id="user_session_remember_me" name="user_session[remember_me]" type="checkbox" value="1" /> Remember me for 2 weeks</label>
          </div>

        </div>

</fieldset>  
Run Code Online (Sandbox Code Playgroud)

我尝试使用与其他网站相同的代码登录,但它不起作用.

# Create a new mechanize object
agent = Mechanize.new

# Load the dial9 website
page = agent.get("http://webapplication.co.uk")

# Select the first form
form = agent.page.forms.first
form.username = 'username
form.password = 'password'

# Submit the form
page = form.submit form.buttons.first
Run Code Online (Sandbox Code Playgroud)

我还尝试了其他SO 问题/答案中建议的不同登录方式:

email = 'user@domain.com'
password = 'password

# Create a new mechanize object
agent = Mechanize.new

# Load the postmarkapp website
page = agent.get("https://domain.com")

# Select the first form
form = agent.page.forms.first
form.field_with(:email => "user_session_email").value = email
form.field_with(:password => "user_session_password").value = password

# Submit the form
page = form.submit form.buttons.first
Run Code Online (Sandbox Code Playgroud)

使用这种身份验证方法,我在运行rake任务时得到以下输出:

undefined method `email' for [hidden:0x3fef2ab2b994 type: hidden name: utf8 value: ?]:Mechanize::Form::Hidden
Run Code Online (Sandbox Code Playgroud)

仔细检查后,上述错误似乎是由于在表单启动后立即存在一个字段:

<form accept-charset="UTF-8" action="/sessions" class="new_user_session" id="new_user_session" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="kaLEkPesQfeheronzGTdfnVAzpuUiC+VmjVXBu540n8=" /></div>
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?如果是这样,什么?任何指针都表示赞赏!

Joh*_*hat 5

尝试改变

form.field_with(:email => "user_session_email").value = email
form.field_with(:password => "user_session_password").value = password
Run Code Online (Sandbox Code Playgroud)

form.field_with(:name => "user_session[email]").value = email
form.field_with(:name => "user_session[password]").value = password
Run Code Online (Sandbox Code Playgroud)