Gem RuCaptcha 2.0.0 验证码 Gem 发布,不需要依赖 ImageMagick 啦!

huacnlee · 发布于 2017年1月22日 · 最后由 wangping 回复于 2017年2月06日 · 1685 次阅读
2

早些时候,我发布了 RuCaptcha 用于解决各类项目验证码问题的 Gem。

https://ruby-china.org/topics/27832

其目的是为了解决大家在使用验证码 Gem 的过程中遇到的三方库依赖问题。但使用一段时间以后发现,仍然还有许多人在安装 ImageMagick 的时候遇到各类奇怪的问题(尤其是 CentOS 手动安装的)。

我曾经想过用一个 Go 里面的库来编译成二进制搞到 RuCaptcha 里面调用,这样就完全没有依赖了。但尝试以后发现不行,Go 编译出来的文件过大。

于是我尝试寻找存 C 实现的,终于找到了一个:

http://brokestream.com/captcha.html

于是引入到 RuCaptcha 替换之前 ImageMagick 的方式。这回彻底完美了,不需要额外安装其它东西啦。

老用户升级注意

配置信息去掉了几个,注意处理,详见: CHANGELOG,使用方式不变。

使用

Gemfile

gem 'rucaptcha'

修改路由 config/routes.rb

Rails.application.routes.draw do
  mount RuCaptcha::Engine => "/rucaptcha"
end

在需要的 Controller 增加 verify_rucaptcha?

class AccountController < ApplicationController
  def create
    @user = User.new(params[:user])
    if verify_rucaptcha?(@user) && @user.save
      redirect_to root_path, notice: 'Sign up successed.'
    else
      render 'account/new'
    end
  end
end

View 增加验证码:

<form>
  ...
  <div class="form-group">
    <%= rucaptcha_input_tag(class: 'form-control', placeholder: '输入验证码) %>
    <%= rucaptcha_image_tag(alt: '验证码,点击刷新') %>
  </div>
  ...
</form>

新的验证码效果

项目地址

https://github.com/huacnlee/rucaptcha

共收到 17 条回复
2 huacnlee 完美的 Ruby 图形验证码 Gem - RuCaptcha 中提及了此贴 1月22日 10:39
8

看起来不错!

5767

这个得赞

68

Congratulations! My compliments to you.

6829

很好,很强大

1105

很实用,下次可以考虑将现在的验证码替换掉了。

11314

正在用,赞一个~

15999

手动赞

96

@huacnlee 提了个issue, 请跟进.

23224

400行代码就实现了这个功能 好棒好棒 不过我推断所有可能出现的验证码里面一定不会出现字母 e和g 因为代码里面有这么一行,没细看其他的逻辑 扩展的C代码里面

static const char *letters="abcdafahijklmnopqrstuvwxyz";

这是有意为之还是有何特殊的作用?

2

#10楼 @helapu 因为哪个字体的 e g 容易看错

2

#10楼 @helapu 核心那段 C 也不是我写的,我只是找到个好方案,适当封装了一下,便于使用

23224

#12楼 @huacnlee 我知道是使用的一个C实现 只是好奇

96

@huacnlee
在单元测试里面进行打桩的时候报没有找到any_instance这个方法。
rails 5.0.0
ruby 2.3.1
rucaptcha 2.0.0
请问这个如何解决? 使用的是minitest的语法。

ERROR["test_create_user_via_posting_params_to_users", UsersControllerTest, 1.5036229289999028]
 test_create_user_via_posting_params_to_users#UsersControllerTest (1.50s)
NoMethodError:         NoMethodError: undefined method `any_instance' for ActionController::Base:Class
            test/controllers/users_controller_test.rb:132:in `block in <class:UsersControllerTest>'

Updated

测试了一下,这个问题和Minitest有关。 现在minitest没有any_instance这个方法,新的minitest通过一个扩展来提供stub_any_instance方法。https://github.com/codeodor/minitest-stub_any_instance

在使用上改成

test "create user via posting params to users" do
  # 绕过rucaptcha验证码判断
  ActionController::Base.stub_any_instance(:verify_rucaptcha?, true) do
    assert_difference 'User.count', 1 do
      post users_url, params: { user: { name: 'testnewuser', email: 'testnewuser@tt.t', password: '111111' } }
    end
  end
end

如此可以正常进行单元测试

2

#14楼 @leiz_me 需要 mocha

96

#15楼 @huacnlee 是的,已经找到一个别的方式来处理。使用minitest扩展可以解决单元测试问题。

13554

感谢 @huacnlee , Node.js 版本在此 https://github.com/trekjs/captcha🍻 😀 😋

9861

赞一个~

1956 klaus01 test 中提及了此贴 2月07日 17:18
2 huacnlee Rails 有比较好的验证码插件么? 中提及了此贴 2月14日 10:16
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册