Gem Mechanize 怎样才能让 agent 存活到下一次提交?

chancedoor · 2013年05月23日 · 最后由 ChanceDoor 回复于 2013年05月23日 · 3051 次阅读
search_result.image_with(:id=>'Image1') do |img|
          dest=Rails.root.to_s+"/app/assets/images"
          img.fetch.save dest+"//0.gif"
end

现在的问题是 怎么才能把页面保存住?输入验证码后提交,怎么才能让 agent 还是提交前的那个页面 到底要怎样才能让 agent 存活到下一次提交呢!

我的需求是这样一个流程: 填写表单->提交->是否返回验证码错误提示 是->抓取验证码并返回验证码图片以及输入框->填写验证码->提交

所以用户那里就是填写表单->验证码错误->填写验证码->成功

======================================================

可能有人也会遇到这个问题,我把我的解决放在这里吧。 就是把 cookies 里面的 sessionid 记录并赋给第二次提交验证码时生成的这个 agent,这样就对应上次 agent 里获取的验证码了。

File::delete(file_name, ...) → integer Deletes the named files, returning the number of names passed as arguments. Raises an exception on any error. See also Dir::rmdir.

#1 楼 @boboism 好吧 先这样解决 但是并发的情况下会不会出问题啊?

同一个文件应该不会在执行过程出现两次吧?而且建议用 hash 值作为文件名会比较好,虽然会慢点。

#3 楼 @boboism 事实上是做抓取验证码 然后显示 那个验证码还不能用 src 直接获取 只能存下来了 可是还得保证每个用户获取的是他自己的验证码而不是别人的

给点思路吧~~~

你都写到同一个.rb 文件里面, 在填写验证码的那一行,用 aaaaa = gets 执行到那里的时候会停下来等你输入,输入完毕后继续执行 这样 agent 就是同一个了

#6 楼 @ywencn 额。。不明白啊 那是不是要在 controller 里控制 views 了?因为要把抓到的验证码显示出来

难道我要写程序自动分析验证码吗??

神呐!搞定了。。不过本帖的问题并没解决

主要要把 session 的 cookie 和相关表单 token 保存下来。供下次请求调用。

我的思路是把 cookie jar 导出为文本,再 base64 存成页面表单的一个元素. 验证的时候,控制层通过 params 拿到 cookie jar 的 base64 的值,把 cookie jar 解析出来,Mechanize 装载 coookie jar,之前再提交请求。

当然你也可以直接放到 session 里面,但这样会导致单个用户只能请求单个验证码。

之前的一个小项目示例:https://github.com/mangege/hncsd/blob/old_sinatra_version/lib/agent.rb

#10 楼 @cxh116 thanks! 不过我的情景不太一样 我已经先用锁定 sessionID 的方法解决了,但是到线上环境会不会出问题还有待观察

需要 登录 后方可回复, 如果你还没有账号请 注册新账号