mmdm/sim-captcha

一个简单而不错的验证码库

v1.0.2 2020-12-04 12:00 UTC

This package is auto-updated.

Last update: 2024-09-08 20:11:56 UTC


README

验证码库

安装

composer

composer require mmdm/sim-captcha

或者,你可以直接从 GitHub 下载 zip 文件并解压,然后将文件放入你的项目库中,就像使用其他库一样。

只需添加以下行来自动加载文件

require_once 'path_to_library/autoloader.php';

然后你就可以开始了。

如何使用

// to instance a captcha object
$captcha = CaptchaFactory::instance();

// now you have a captcha object then use it
// like this
$captcha_image = $captcha->generate();

// and put it where you want
// like inside a form

// the output will be like
<img src="BASE 64 ENCODED STRING">

可用函数

目前有两个验证码生成器。

  • 传统的文字验证码
  • 和简单的数学验证码,提供 [+, -, *]

你可以从特定的类中获取一个新的实例,如下所示

// traditional captcha
$captcha = new Captcha(ICaptchaLanguage $language);
// simple math captcha
$captcha = new CaptchaSimpleMath(ICaptchaLanguage $language);

上述指定的语言用于生成带有你本地语言单词和数字的验证码。

如果你想为你的本地环境添加语言,你可以实现 ICaptchaLanguage 接口。它有三个你应该实现的功能。

/**
 * Return numbers of language
 *
 * Note: If there is not any number on that language,
 * return empty array
 *
 * @return array
 */
public function numbers(): array;

/**
 * Return small alpha of language
 *
 * Note: If there is not any small alpha on that language,
 * return empty array
 *
 * @return array
 */
public function alphaSmall(): array;

/**
 * Return capital alpha of language
 *
 * Note: If there is not any capital alpha on that language,
 * return empty array
 *
 * @return array
 */
public function alphaCaps(): array;

为了方便,有一个 CaptchaFactory 类可以创建你想要的验证码。只需静态调用 instance 方法。

$captcha = CaptchaFactory::instance();

如果你需要为你的变量提供类型提示,根据你的 IDE,你应该为变量提供类型提示。大多数编辑器应该与 @var 一起使用。

/**
 * @var Captcha $captcha
 */
$captcha = CaptchaFactory::instance();

// now you can access to Captcha class, methods
$captcha->...;

instance(int $type = CaptchaFactory::CAPTCHA, ICaptchaLanguage $language = null)

如你所见,有一个类型变量,你可以指定需要实例化的哪个类。在 CaptchaFactory 常量下,有 CaptchaFactory::CAPTCHACaptchaFactory::CAPTCHA_SIMPLE_MATH 用于类实例化。

第二个参数是验证码的语言。如果你没有指定,它将默认为英语。

注意:请使用常量,因为如果将来数字发生变化,你将会有问题,并且必须重构验证码实例化。

$captcha = CaptchaFactory::instance(CaptchaFactory::CAPTCHA, new Persian());
$captcha->setFont(CaptchaFactory::FONT_IRAN_SANS);

注意:目前有三种语言:[英语,波斯语,阿拉伯语]。

*** 重要提示 *** 任何语言的验证码代码都是从 生成的。如果你有从右到左的语言字母,请通知用户此行为。

常用方法

generate()

此方法将生成验证码

$generated_captcha = $captcha->generate();

verify($input)

此方法用于通过发送用户的值来验证生成的验证码

$is_ok = $captcha->verify($user_input);

setName(string $name = null)

使用此方法,你可以将验证码存储为你指定的名称。例如,如果你想在多个页面上有验证码,并且用户想要使用具有验证码的多个页面,生成的验证码将混合在一起,只有一个页面可以提交,其他页面会说验证码无效!为了解决这个问题,你应该指定生成的验证码的名称以防止这种情况。

默认名称是 captcha

$captcha->setName('contact_us');

getName()

此方法返回验证码名称。

$name = $captcha->getName();

setExpiration(int $expire_time)

你可以使用此方法指定验证码的过期时间

默认过期时间是 600 秒

注意:传递时间(秒)

// set expiration to 2min or 120s
$captcha->setExpiration(120);

getExpiration()

此方法以秒为单位返回验证码的过期时间

$exp_time = $captcha->getExpiration();

文本验证码中的常用方法

它包含 常用方法 的所有方法以及以下方法。

generateBase64Code(string $code = null)

此方法仅返回 base64 图像代码。

$base64_code = $captcha->generateBase64Code();
// or
$base64_code = $captcha->generateBase64Code('mmdm95');

setWidth(int $width)

此方法设置验证码图像的宽度

默认为 200

$captcha->setWidth(300);

getWidth(): int

此方法返回验证码图像的宽度。

$width = $captcha->getWidth();

setHeight(int $height)

此方法设置验证码图像的高度

默认为 50

$captcha->setHeight(70);

getHeight(): int

此方法返回验证码图像的高度。

$height = $captcha->getHeight();

setFont(string $filename)

您可以指定验证码的字体。只需发送字体的文件名作为参数即可。默认情况下,该库包含三种字体:

  • 英语 -> Menlo-Regular,
  • 波斯语 -> IRANSansWeb,
  • 阿拉伯语 -> Lateef-Regular,

这些字体的文件名在 CaptchaFactory 类中是常量: CaptchaFactory::FONT_MENLOCaptchaFactory::FONT_LATEEFCaptchaFactory::FONT_IRAN_SANS

或者如果您有其他字体要使用,只需发送文件名作为参数。

$captcha->setFont($path_to_your_font_filename);

getFont()

此方法返回字体的文件名字符串

$font_filename = $captcha->getFont();

setFontSize(int $size)

您可以指定验证码的字体大小。

默认为 20

$captcha->setFontSize(25);

getFontSize(): int

此方法返回验证码的字体大小

$font_size = $captcha->getFontSize();

setImgAttributes(array $attributes)

由于生成方法的结果是一个图像(验证码文本),设置属性是一个问题。使用此方法您可以设置验证码图像的属性。

$captcha->setImgAttributes([
    'style' => 'display: block',
    'class' => 'img-rounded',
    'id' => 'captchaImage',
    'alt' => 'captcha image',
    ...
]);

getImgAttributes(): array

此方法返回验证码图像属性作为数组

$attributes = $captcha->getImgAttributes();

// output will be something like this
[
    'style' => 'display: block',
    'class' => 'img-rounded',
    'id' => 'captchaImage',
    'alt' => 'captcha image',
    ...
]

getImgAttributesString(): string

此方法返回验证码图像属性作为字符串

$attributes_string = $captcha->getImgAttributesString();

// output will be something like this
style="display: block" class="img-rounded" id="captchaImage" alt="captcha image" ...

addNoise(bool $answer)

如果您需要在验证码上添加噪声,请将此方法的参数发送为 true。

默认为 true

$captcha->addNoise(false);

useEnglishNumbersToVerify(bool $answer)

如果您的用户输入验证码字符作为输入,则可能有效但不是有效的!这是因为用户以不同于区域设置的另一种语言输入数字。例如,阿拉伯数字,用户将它们作为英语输入,它们可能相等但同时也不同。您可以通过将此方法的参数发送为 true 来防止这种情况,并将所有数字从指定语言转换为英语,然后验证输入的代码。

默认为 false

注意:在使用 verify 方法之前使用此方法。

注意:在使用 verify 方法之前,请小心并指定语言,以防止出现不必要的操作。

$captcha->useEnglishNumbersToVerify(true);

验证码

它具有 文本验证码的通用方法 的所有方法以及以下方法。

generate(string $code = null)

此方法生成一个验证码代码。您还可以设置自己的代码作为验证码。

$captcha_image = $captcha->generate();
// or 
$captcha_image = $captcha->generate('mmdm95');

setLength(int $length): Captcha

使用此方法您可以设置生成验证码的长度

默认为 6

$captcha->setLength(8);

getLength(): int

获取用于代码生成的验证码字符的长度

$length = $caotcha->getLength();

setDifficulty(int $difficulty): Captcha

验证码代码有三个难度级别 [简单、中等、困难],可以使用 CaptchaFactory 下的常量传递给此方法

  1. CaptchaFactory::DIFFICULTY_EASY
  2. CaptchaFactory::DIFFICULTY_NORMAL
  3. CaptchaFactory::DIFFICULTY_HARD

简单使验证码代码仅是数字。

中等使验证码代码是数字和大写字母。

困难使验证码代码是数字、大写字母和小写字母。

默认为 CaptchaFactory::DIFFICULTY_NORMAL

注意:所有数字和字母均从指定语言使用

注意:由于 CaptchaFactory::DIFFICULTY_NORMAL 使用大写字母,因此它是 CASE-Insensitive。

$captcha->setDifficulty(CaptchaFactory::DIFFICULTY_HARD);

getDifficulty(): int

获取验证码难度

$difficulty = $captcha->getDifficulty();

CaptchaSimpleMath

它具有 文本验证码的通用方法 的所有方法以及以下方法。

setNumbersCount(int $count): CaptchaSimpleMath

您可以指定应该参与多少个数字。它应该是一个介于 2 和 5(含)之间的数字。

默认为 2

$captcha->setNumbersCount(3);

getNumbersCount(): int

此方法返回参与验证码的数字数量

$count = $captcha->getNumbersCount();

useMultiplyOperands(): CaptchaSimpleMath

默认情况下,运算符为 [+, -],如果您需要乘法,只需在生成验证码之前调用此方法。

$captcha->useMultiplyOperands();

如何在页面中生成多个验证码

由于页面缓存,您不能在一个请求中用验证码对象生成验证码,因此您应该使用 AJAX。

在测试文件夹中您可以看到此用法的示例。验证码将从开始通过 AJAX 生成。

index.php 是其基本页面,而 captcha.php 是每次提供验证码的页面。

如果您不熟悉ajax的创建或没有使用如jQuery这样的库来创建ajax请求,请查看index.php中的script部分。

注意:如果您将验证码存储在特定的名称下,请小心,并在ajax请求中发送验证码的名称。

许可证

在MIT许可证下。