ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

一分钟学会使用PHP生成网页验证码:TaoToken统一Key接入与本地调试配置

一分钟学会使用PHP生成网页验证码:TaoToken统一Key接入与本地调试配置 1. 为什么本地调试 PHP 验证码总卡在环境上PHP 生成网页验证码这件事代码本身其实很短真正让人头疼的是本地跑不起来。你可能遇到过这几种情况页面直接输出一堆乱码而不是图片、GD 库没开导致imagecreate()报错、字体文件路径不对让imagettftext()画不出字、Session 没启动导致校验永远失败。这些问题在本地开发环境里特别集中因为每个人的 PHP 版本、扩展开关、目录结构都不一样。这篇内容面向的是本地开发与联调场景目标很明确给你一份可以直接复制的 PHP 验证码生成脚本配好 GD 库再把表单展示和提交校验串起来最后用 TaoToken 的统一 Key 通道接入 AI 辅助调试让报错定位和参数调整快一点。验证码本身是防机器人刷表单的常见手段适合刚接触 PHP 表单安全、或者需要在本地快速搭一个可运行 demo 的人。下面按「先跑通生成、再跑通校验、最后接 AI 调试」的顺序来每一步都有完整代码和验证动作。2. TaoToken 前置统一 Key 与本地调试通道TaoToken 在这里的角色是给本地开发提供一个统一的模型调用入口。你不需要在本地维护多套不同模型的 Key也不用改代码里的 base_url 去适配不同服务一个统一 Key 就能走 API 通道。对于验证码这种「生成脚本 表单校验 偶尔需要 AI 帮忙看报错」的场景它的价值在于调试阶段遇到 GD 库报错、字体路径问题、Session 不生效时可以把错误信息丢给模型对话快速定位而不是反复搜零散答案。接入前你需要准备两样东西一个统一 Key以及确认本地 PHP 环境。Key 在控制台的 API Keys 页面创建地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。创建后复制保存后面写进配置文件。如果你更习惯在编辑器里直接对话调试可以走 Coding Plan适合长期编码和 Agent 场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。只想先验证模型通不通用模型对话页面最快https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。注意本地调试用的 Key 不要硬编码进会提交到版本库的文件里建议单独放一个不进 git 的配置文件或者用环境变量读取。3. 可复制配置GD 库开启与验证码脚本3.1 确认 GD 库已开启验证码依赖 GD 扩展先确认它是否可用。在项目根目录建一个check_gd.php?php if (extension_loaded(gd)) { $info gd_info(); echo GD 已开启\n; echo PNG 支持: . ($info[PNG Support] ? 是 : 否) . \n; echo FreeType 支持: . ($info[FreeType Support] ? 是 : 否) . \n; } else { echo GD 未开启请检查 php.ini\n; }命令行执行php check_gd.php或者浏览器访问这个文件。如果显示未开启打开php.ini找到;extensiongd这一行去掉前面的分号。Windows 下通常是extensiongd2或extensiongdLinux 下可能是extensiongd.so。改完重启 PHP 服务或 Web 服务器。FreeType 支持很关键因为imagettftext()画字依赖它如果 FreeType 显示否验证码上的字符就画不出来。3.2 验证码生成脚本 authcode.php下面这份脚本在原始思路基础上做了整理加了字体路径容错和更清晰的干扰逻辑。新建authcode.php?php session_start(); header(Content-type: image/png); $width 120; $height 40; $img imagecreate($width, $height); $gray imagecolorallocate($img, 230, 230, 230); $black imagecolorallocate($img, 0, 0, 0); $red imagecolorallocate($img, 200, 30, 30); imagefill($img, 0, 0, $gray); // 干扰像素 for ($i 0; $i 500; $i) { $c imagecolorallocate($img, rand(80, 220), rand(80, 220), rand(80, 220)); imagesetpixel($img, rand(0, $width), rand(0, $height), $c); } // 干扰线段 for ($i 0; $i 6; $i) { imageline($img, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), $black); } // 生成 4 位验证串 $chars 0123456789abcdefghijklmnopqrstuvwxyz; $code ; for ($i 0; $i 4; $i) { $code . substr($chars, rand(0, strlen($chars) - 1), 1); } // 字体路径优先用项目内字体找不到再退回系统字体 $fontFile __DIR__ . /arial.ttf; if (!file_exists($fontFile)) { $fontFile /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf; } imagettftext($img, 20, 0, 15, 30, $red, $fontFile, $code); imagepng($img); imagedestroy($img); $_SESSION[authcode] $code;几个关键点说明。session_start()必须在任何输出之前调用否则 Session 写不进去后面校验一定失败。header(Content-type: image/png)告诉浏览器这是图片而不是 HTML。字体路径用__DIR__拼相对路径比写死绝对路径更稳。如果本地没有arial.ttf脚本会自动退回 DejaVu 字体Linux 上一般都有。Windows 下你可以把C:\Windows\Fonts\arial.ttf复制到项目目录或者直接改$fontFile指向系统字体。3.3 表单页面与校验逻辑新建form.php负责展示验证码图片和提交?php session_start(); ? !DOCTYPE html html headmeta charsetutf-8title验证码测试/title/head body form actionverify.php methodpost label验证码/label input typetext nameauthcode maxlength4 img srcauthcode.php alt验证码 onclickthis.srcauthcode.php?Math.random() br button typesubmit提交/button /form /body /html图片上的onclick让用户点一下就能刷新验证码Math.random()是为了绕过浏览器缓存否则刷新可能还是旧图。新建verify.php做校验?php session_start(); $input isset($_POST[authcode]) ? trim($_POST[authcode]) : ; if (empty($_SESSION[authcode])) { echo Session 中没有验证码请先访问表单页面; exit; } if (strcasecmp($input, $_SESSION[authcode]) 0) { echo 验证通过; unset($_SESSION[authcode]); // 一次性使用防止重放 } else { echo 验证码输入错误; }这里用strcasecmp做不区分大小写比较因为用户可能输入大写。校验通过后立刻unset保证一个验证码只能用一次。3.4 TaoToken settings.json 骨架如果你用支持配置文件读取的编辑器或 Agent 工具可以建一个settings.json骨架把统一 Key 和 API 地址放进去{ provider: taotoken, api_base: https://taotoken.net/api, api_key: 你的统一Key, model: claude-sonnet, timeout: 30, debug: true }api_base用 https://taotoken.net/api 不要加多余路径。debug打开后能看到请求和响应细节方便排查。这个文件建议加入.gitignore避免 Key 泄露。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言调用示例PHP 用 cURL 就能发请求。4. 验证请求与成功结果4.1 验证验证码生成启动本地 PHP 服务在项目目录执行php -S localhost:8000浏览器访问http://localhost:8000/form.php。你应该看到一张 120x40 的灰色图片上面有 4 位红色字符背景有彩色噪点和黑色线段。点击图片能刷新出新字符。如果看到的是乱码文字而不是图片说明header之前有输出检查authcode.php里?php前有没有空格或空行。4.2 验证校验流程在输入框里输入图片上的字符点提交。正确时显示「验证通过」错误时显示「验证码输入错误」。故意输错一次再输对确认逻辑正常。如果一直提示 Session 中没有验证码说明session_start()没生效或者 Session 保存路径不可写。4.3 验证 TaoToken 通道用 cURL 发一个最小请求确认 Key 和地址可用curl -X POST https://taotoken.net/api/v1/messages \ -H Content-Type: application/json \ -H x-api-key: 你的统一Key \ -d { model: claude-sonnet, max_tokens: 100, messages: [{role: user, content: 用一句话说明 PHP GD 库的作用}] }返回里有正常文本内容说明通道通了。之后调试验证码报错时可以把错误信息作为 prompt 发过去让它帮你判断是扩展问题还是路径问题。5. 本篇常见错排查5.1 图片显示为乱码或空白最常见的原因是header(Content-type: image/png)之前有输出。检查authcode.php文件开头有没有 BOM 头、空格、空行。用编辑器把文件编码改成「UTF-8 无 BOM」。另一个原因是imagepng()之前有echo或var_dump把调试输出删掉。5.2 imagettftext 报错或画不出字报错信息通常是Could not find/open font。这说明$fontFile路径不对。用file_exists($fontFile)先判断或者打印出实际路径确认。Linux 下 DejaVu 字体一般在/usr/share/fonts/truetype/dejavu/Windows 下用C:/Windows/Fonts/arial.ttf注意用正斜杠或双反斜杠。如果 FreeType 没开imagettftext会直接失败回到 3.1 确认扩展。5.3 校验永远失败先确认session_start()在两个文件里都调用了且都在输出之前。然后检查 Session 保存路径是否可写用session_save_path()打印出来看看。还有一种情况是浏览器禁用了 CookieSession ID 传不过去本地调试一般不会遇到但如果用了无痕模式加严格隐私设置可能触发。最后确认比较时没有多余空格用trim()处理输入。5.4 验证码图片被缓存用户点刷新还是旧图是因为浏览器缓存了authcode.php。在图片 URL 后面加随机参数比如authcode.php?t时间戳或者在authcode.php里加header(Cache-Control: no-store)。表单页面里已经用了Math.random()如果还不行就换成Date.now()。5.5 TaoToken 请求返回 401 或 403先确认 Key 有没有复制完整前后有没有空格。然后确认请求头字段名是否正确不同接口可能用x-api-key或Authorization: Bearer。接入文档里有对应说明。如果返回 404检查api_base是不是写成了https://taotoken.net/api/带多余斜杠或者路径拼错。本地调试时把debug打开看完整请求体。6. 把验证码和 AI 调试串起来的下一步验证码跑通之后你可以把它嵌进真实的登录或注册表单里注意校验通过后要销毁 Session 里的验证码防止重放。如果要做更复杂的图形验证码比如算术题、滑块思路是一样的生成阶段把答案存 Session校验阶段比对。本地联调时遇到 GD 库、字体、Session 的问题用 TaoToken 的模型对话快速问一下比翻文档快。需要长期在编辑器里做 PHP 项目调试和 Agent 辅助的走 Coding Plan 更顺手只是偶尔验证模型响应的用模型对话页面就够。Key 管理和接入细节都在 API Keys 和接入文档里按需取用。
返回列表