{"_id":"@aetherlib/g-captcha","_rev":"5-e28ab94f6ea34302b9870464aa7c6e12","name":"@aetherlib/g-captcha","dist-tags":{"latest":"1.2.0"},"versions":{"0.0.1":{"name":"@aetherlib/g-captcha","version":"0.0.1","keywords":["captcha","react","go-captcha"],"license":"MIT","_id":"@aetherlib/g-captcha@0.0.1","maintainers":[{"name":"gongziyue2021","email":"565870260@qq.com"}],"homepage":"https://github.com/yuegongzi/simple-captcha#readme","bugs":{"url":"https://github.com/yuegongzi/simple-captcha/issues"},"dist":{"shasum":"bc47394860c46fe2570ecc2a2e7780fd7804ccf7","tarball":"https://registry.npmjs.org/@aetherlib/g-captcha/-/g-captcha-0.0.1.tgz","fileCount":134,"integrity":"sha512-JH0e+GTmCXXb7NnN81qcyNua4HQ6LmIdUxQ1dDbaZx8aqR26nJHEZNF7nmOckRkgviJIr0vJcuEOeyRvALPUPw==","signatures":[{"sig":"MEUCIQC7jEQG8oRMSgp6nshljdxCFLo4i6eIunKPNWhANVWjlQIga37n3xdV5bg+wAN3qXamGZ5k5NwgtmUs318Ff17K5Ns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":276984},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","core-js","core-js-pure","esbuild","yorkie"]},"module":"dist/index.js","authors":{"name":"yuegongzi","email":"yanganfu2012@gmail.com"},"gitHead":"167ae1a30a053c8c358c56b69598476f1b6d1fdf","private":false,"scripts":{"test":"umi-test","build":"father build","start":"dumi dev","deploy":"npm run docs:build && npm run docs:deploy","prettier":"prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"","docs:build":"dumi build","docs:deploy":"gh-pages -d docs-dist","test:coverage":"umi-test --coverage"},"typings":"dist/index.d.ts","_npmUser":{"name":"gongziyue2021","email":"565870260@qq.com"},"repository":{"url":"git+https://github.com/yuegongzi/simple-captcha.git","type":"git"},"_npmVersion":"10.9.4","description":"go-captcha集成版","directories":{},"_nodeVersion":"22.21.0","dependencies":{"axios":"^1.7.9","react":"19.0.0","crypto-js":"4.2.0","react-dom":"19.0.0","classnames":"2.5.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"dumi":"2.4.17","husky":"9.1.7","father":"4.5.1","yorkie":"2.0.0","gh-pages":"6.2.0","prettier":"3.4.2","lint-staged":"15.2.11","@types/react":"19.0.1","@umijs/fabric":"4.0.1","@types/crypto-js":"4.2.2","@types/react-dom":"19.0.1"},"_npmOperationalInternal":{"tmp":"tmp/g-captcha_0.0.1_1776159520987_0.9259830899180914","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@aetherlib/g-captcha","version":"1.0.0","keywords":["captcha","react","go-captcha"],"license":"MIT","_id":"@aetherlib/g-captcha@1.0.0","maintainers":[{"name":"gongziyue2021","email":"565870260@qq.com"}],"homepage":"https://github.com/yuegongzi/simple-captcha#readme","bugs":{"url":"https://github.com/yuegongzi/simple-captcha/issues"},"dist":{"shasum":"a5271f0ac698641974443a296b8ae94b610712d9","tarball":"https://registry.npmjs.org/@aetherlib/g-captcha/-/g-captcha-1.0.0.tgz","fileCount":66,"integrity":"sha512-zAZjLpUIj5z2tX+rXMLTVG/Ty/kAXtUHRjfDLBfF/mQppgi/FOT29FUJIcyL3kNhbKJ5HH/Rv94Zwur1FATjsA==","signatures":[{"sig":"MEUCIQDGLpnpFzdoQd0rBWcYrGfzck/4H0Z0JroBP96YN4RniQIgMp5qcJ9u79DqFyMUPZ47CfLw9CtBtvscS0LhuQGstH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168149},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","core-js","core-js-pure","esbuild","yorkie"]},"module":"dist/index.js","authors":{"name":"yuegongzi","email":"yanganfu2012@gmail.com"},"gitHead":"2ed3b97b4e78d9863c39da9f88f96d4440bc4017","private":false,"scripts":{"test":"umi-test","build":"father build","start":"dumi dev","deploy":"npm run docs:build && npm run docs:deploy","prettier":"prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"","docs:build":"dumi build","docs:deploy":"gh-pages -d docs-dist","test:coverage":"umi-test --coverage"},"typings":"dist/index.d.ts","_npmUser":{"name":"gongziyue2021","email":"565870260@qq.com"},"repository":{"url":"git+https://github.com/yuegongzi/simple-captcha.git","type":"git"},"_npmVersion":"10.9.4","description":"go-captcha集成版","directories":{},"_nodeVersion":"22.21.0","dependencies":{"axios":"^1.7.9"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"dumi":"2.4.17","husky":"9.1.7","father":"4.5.1","yorkie":"2.0.0","gh-pages":"6.2.0","prettier":"3.4.2","lint-staged":"15.2.11","@types/react":"19.0.1","@umijs/fabric":"4.0.1","@types/crypto-js":"4.2.2","@types/react-dom":"19.0.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/g-captcha_1.0.0_1776161100889_0.40452317879702204","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aetherlib/g-captcha","version":"1.0.1","keywords":["captcha","react","go-captcha"],"license":"MIT","_id":"@aetherlib/g-captcha@1.0.1","maintainers":[{"name":"gongziyue2021","email":"565870260@qq.com"}],"homepage":"https://github.com/yuegongzi/simple-captcha#readme","bugs":{"url":"https://github.com/yuegongzi/simple-captcha/issues"},"dist":{"shasum":"18b5813ccab7f6bb79bb43a01530ab32b9c79990","tarball":"https://registry.npmjs.org/@aetherlib/g-captcha/-/g-captcha-1.0.1.tgz","fileCount":67,"integrity":"sha512-1JoREXkQCYUjNftWW0jzS98k8YiyVXSIb/GPdDiNF+e7XaaJTZnDVBq5Ky26Mdpn38gAtFgfqXN3qWETlrgd5w==","signatures":[{"sig":"MEUCIHNG/s3/Zvvdt+wfe0Aqj4FqVo884f+VhZMw1+1DPPNFAiEAwGjL9vDNBCZ8kEUaY8fpFDUWYg03zTJnT7/Tbo/BsEs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178600},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","core-js","core-js-pure","esbuild","yorkie"]},"module":"dist/index.js","authors":{"name":"yuegongzi","email":"yanganfu2012@gmail.com"},"gitHead":"8ff93ba9a5841b1bb298cb2962ce8d4d0e911132","private":false,"scripts":{"test":"umi-test","build":"father build","start":"dumi dev","deploy":"npm run docs:build && npm run docs:deploy","prettier":"prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"","docs:build":"dumi build","docs:deploy":"gh-pages -d docs-dist","test:coverage":"umi-test --coverage"},"typings":"dist/index.d.ts","_npmUser":{"name":"gongziyue2021","email":"565870260@qq.com"},"repository":{"url":"git+https://github.com/yuegongzi/simple-captcha.git","type":"git"},"_npmVersion":"10.9.4","description":"go-captcha集成版","directories":{},"_nodeVersion":"22.21.0","dependencies":{"axios":"^1.7.9"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"dumi":"2.4.17","husky":"9.1.7","father":"4.5.1","yorkie":"2.0.0","gh-pages":"6.2.0","prettier":"3.4.2","lint-staged":"15.2.11","@types/react":"19.0.1","@umijs/fabric":"4.0.1","@types/crypto-js":"4.2.2","@types/react-dom":"19.0.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/g-captcha_1.0.1_1776173708750_0.6078911271058183","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aetherlib/g-captcha","version":"1.1.0","keywords":["captcha","react","go-captcha"],"license":"MIT","_id":"@aetherlib/g-captcha@1.1.0","maintainers":[{"name":"gongziyue2021","email":"565870260@qq.com"}],"homepage":"https://github.com/Pixel-Chase/simple-captcha#readme","bugs":{"url":"https://github.com/Pixel-Chase/simple-captcha/issues"},"dist":{"shasum":"173d51b8f5b36b579a9652c20583d2678e2c67fe","tarball":"https://registry.npmjs.org/@aetherlib/g-captcha/-/g-captcha-1.1.0.tgz","fileCount":80,"integrity":"sha512-wX0/cas7OSjRbxaMFWOJdydDYP71UbyQ28MDkxTOK0X8OjzuEcvHP/687Rh9y+mWpoG7qKoamP3nHgzTF2Zvkg==","signatures":[{"sig":"MEUCIQDOf+/BGOdZVjcUz+cRapvPr+8ttalLeXJNdSqxieYq3AIgE0le+6FE2+RnudUMU7olpXDyKxoLM+ciiiYrZFrC/r8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183405},"main":"dist/index.js","pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","core-js","core-js-pure","esbuild","yorkie"]},"module":"dist/index.js","authors":{"name":"Pixel Chase","email":"yanganfu2012@gmail.com"},"gitHead":"99555818dd1aa4462a970c99419c2170c110dffc","private":false,"scripts":{"test":"umi-test","build":"father build","start":"dumi dev","deploy":"npm run docs:build && npm run docs:deploy","prettier":"prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"","docs:build":"dumi build","docs:deploy":"gh-pages -d docs-dist","test:coverage":"umi-test --coverage"},"typings":"dist/index.d.ts","_npmUser":{"name":"gongziyue2021","email":"565870260@qq.com"},"repository":{"url":"git+ssh://git@github.com/Pixel-Chase/simple-captcha.git","type":"git"},"_npmVersion":"11.15.0","description":"go-captcha集成版","directories":{},"_nodeVersion":"22.21.0","dependencies":{"axios":"^1.7.9"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"dumi":"2.4.17","husky":"9.1.7","father":"4.5.1","yorkie":"2.0.0","gh-pages":"6.2.0","prettier":"3.4.2","lint-staged":"15.2.11","@types/react":"19.0.1","@umijs/fabric":"4.0.1","@types/crypto-js":"4.2.2","@types/react-dom":"19.0.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/g-captcha_1.1.0_1779699609045_0.35155471396980253","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"private":false,"name":"@aetherlib/g-captcha","description":"go-captcha集成版","keywords":["captcha","react","go-captcha"],"version":"1.2.0","authors":{"name":"Pixel Chase","email":"yanganfu2012@gmail.com"},"repository":{"type":"git","url":"git+ssh://git@github.com/Pixel-Chase/simple-captcha.git"},"license":"MIT","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"start":"dumi dev","docs:build":"dumi build","docs:deploy":"gh-pages -d docs-dist","build":"father build","deploy":"npm run docs:build && npm run docs:deploy","prettier":"prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"","test":"umi-test","test:coverage":"umi-test --coverage"},"main":"dist/index.js","module":"dist/index.js","typings":"dist/index.d.ts","dependencies":{"axios":"^1.7.9"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"devDependencies":{"@types/crypto-js":"4.2.2","@types/react":"19.0.1","@types/react-dom":"19.0.1","@umijs/fabric":"4.0.1","dumi":"2.4.17","father":"4.5.1","gh-pages":"6.2.0","husky":"9.1.7","lint-staged":"15.2.11","prettier":"3.4.2","yorkie":"2.0.0"},"pnpm":{"onlyBuiltDependencies":["@parcel/watcher","@swc/core","core-js","core-js-pure","esbuild","yorkie"]},"gitHead":"803695812f1d43b3328e5d4d6b045d704f61fa61","_id":"@aetherlib/g-captcha@1.2.0","bugs":{"url":"https://github.com/Pixel-Chase/simple-captcha/issues"},"homepage":"https://github.com/Pixel-Chase/simple-captcha#readme","_nodeVersion":"22.21.0","_npmVersion":"11.15.0","dist":{"integrity":"sha512-d2D81R3fhehk5P2wmWDI9lr+9eJm40w2dMtdCUXI0+clc04kR625GqEEmtdGi0o3Ury8Ssfg3M3mIx3pmMgcdw==","shasum":"76c4b6101dbde2278968029a17fd2a313355a22c","tarball":"https://registry.npmjs.org/@aetherlib/g-captcha/-/g-captcha-1.2.0.tgz","fileCount":59,"unpackedSize":175959,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCRXn+894KldJvK+OSOqcfoOy2mltI5WDR4nlGxjEIFSAIgK7n5sXVpmx1AlWlvkZhOnFRAsQ1xTY/c6rOlNTk+WJk="}]},"_npmUser":{"name":"gongziyue2021","email":"565870260@qq.com"},"directories":{},"maintainers":[{"name":"gongziyue2021","email":"565870260@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/g-captcha_1.2.0_1786439357159_0.3882736629443482"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T09:38:40.877Z","modified":"2026-08-11T09:09:17.487Z","0.0.1":"2026-04-14T09:38:41.121Z","1.0.0":"2026-04-14T10:05:01.034Z","1.0.1":"2026-04-14T13:35:08.875Z","1.1.0":"2026-05-25T09:00:09.181Z","1.2.0":"2026-08-11T09:09:17.297Z"},"bugs":{"url":"https://github.com/Pixel-Chase/simple-captcha/issues"},"license":"MIT","homepage":"https://github.com/Pixel-Chase/simple-captcha#readme","keywords":["captcha","react","go-captcha"],"repository":{"type":"git","url":"git+ssh://git@github.com/Pixel-Chase/simple-captcha.git"},"description":"go-captcha集成版","maintainers":[{"name":"gongziyue2021","email":"565870260@qq.com"}],"readme":"## @aetherlib/g-captcha\n\n采用 go-captcha 的 React SDK 封装，提供组件模式与 Hook 模式两种接入方式。\n\n> 本版本要求 `react@19` 与 `react-dom@19`。\n\n## 推荐用法\n\n全局配置通过 `CaptchaProvider` 注入，单次验证由 `Captcha` 或 `useCaptcha().verify()` 触发。\n\n```jsx\nimport { useRef } from 'react';\nimport { Captcha, CaptchaProvider, useCaptcha } from '@aetherlib/g-captcha';\n\nexport default () => {\n  const ref = useRef();\n  const { verify, holder } = useCaptcha();\n\n  return (\n    <CaptchaProvider\n      api={{ basePath: 'http://127.0.0.1:3321' }}\n      locale={{ buttonText: '点击验证' }}\n      theme={{ primaryColor: '#111827', borderRadius: 12 }}\n    >\n      {holder}\n\n      <Captcha ref={ref} type=\"auto\" onSuccess={(data) => console.log(data)}>\n        <button onClick={() => ref.current?.verify()}>组件模式</button>\n      </Captcha>\n\n      <button\n        onClick={async () => {\n          const data = await verify({ type: 'slide-text' });\n          console.log(data);\n        }}\n      >\n        Hook 模式\n      </button>\n    </CaptchaProvider>\n  );\n};\n```\n\n## CaptchaProvider\n\n| 属性 | 说明 | 类型 | 默认值 |\n|---|---|---|---|\n| api | 全局接口配置 | `ApiConfig` | - |\n| locale | 全局多语言文案 | `LocaleTexts` | - |\n| theme | 全局主题变量 | `ThemeTokens` | - |\n| zIndex | 弹层层级 | `number` | `9999` |\n\n`ApiConfig` 支持以下配置：\n\n| 属性 | 说明 | 类型 | 默认值 |\n|---|---|---|---|\n| basePath | 验证码后端服务地址 | `string` | `''` |\n| prefix | API 路径前缀，需与后端 `API_PREFIX` 一致 | `string` | `/api/v1` |\n\n后端使用自定义前缀时，可配置为 `api={{ basePath: 'http://foo.com', prefix: '/captcha/api' }}`。使用 `/` 或空字符串可将请求直接挂载到 `/captchas`。\n\n## Captcha\n\n| 属性 | 说明 | 类型 | 默认值 |\n|---|---|---|---|\n| onFail | 校验失败回调 | `(msg: string) => void` | - |\n| onSuccess | 校验成功回调 | `(data: any) => void` | - |\n| onCancel | 用户主动关闭回调 | `() => void` | - |\n| maxRetryCount | 单次验证最多允许的校验失败次数，达到后才触发 `onFail` | `number` | `5` |\n| type | 验证码类型，支持 `auto`、`click-text`、`click-shape`、`slide-text`、`slide-region`、`rotate` | `CaptchaType` | `auto` |\n| api | 当前实例的接口配置覆盖 | `ApiConfig` | - |\n| locale | 当前实例的文案覆盖 | `LocaleTexts` | - |\n| theme | 当前实例的主题覆盖 | `ThemeTokens` | - |\n| config | 当前实例的验证码配置 | `CaptchaConfig` | - |\n| className | 容器类名 | `string` | - |\n| style | 容器样式 | `CSSProperties` | - |\n\n## useCaptcha\n\n`useCaptcha()` 不再接收初始化参数，返回：\n\n| 字段 | 说明 | 类型 |\n|---|---|---|\n| verify | 按次触发验证码，可覆盖当前调用的 `type/config/api/locale/theme` 与回调 | `(options?: CaptchaVerifyOptions) => Promise<any>` |\n| holder | 必须渲染在当前 React 树中的承载节点 | `ReactNode` |\n\n```jsx\nimport { CaptchaProvider, useCaptcha } from '@aetherlib/g-captcha';\n\nexport default () => {\n  const { verify, holder } = useCaptcha();\n\n  return (\n    <CaptchaProvider api={{ basePath: 'http://foo.com' }}>\n      {holder}\n      <button\n        onClick={async () => {\n          const data = await verify({\n            type: 'auto',\n            maxRetryCount: 5,\n            locale: { userCancel: 'Canceled by user' },\n            theme: { primaryColor: '#111827' },\n          });\n          console.log(data);\n        }}\n      >\n        verify\n      </button>\n    </CaptchaProvider>\n  );\n};\n```\n\n## CaptchaConfig\n\n| 属性 | 说明 | 类型 | 默认值 |\n|---|---|---|---|\n| width | 宽度 | `number` | - |\n| height | 高度 | `number` | - |\n| thumbWidth | 缩略图宽度 | `number` | - |\n| thumbHeight | 缩略图高度 | `number` | - |\n| verticalPadding | 垂直方向内边距 | `number` | - |\n| horizontalPadding | 水平方向内边距 | `number` | - |\n| showTheme | 是否显示主题外框 | `boolean` | - |\n| title | 标题 | `string` | - |\n| iconSize | 图标大小 | `number` | - |\n| scope | 滑动和旋转生效范围 | `number` | - |\n| buttonText | 按钮文字 | `string` | - |\n| dotSize | 点选模式区域大小 | `number` | - |\n\n## LocaleTexts\n\n| 属性 | 说明 |\n|---|---|\n| clickTitle | 点选模式标题，默认 `请在下图依次点击` |\n| slideTitle | 滑块/旋转模式标题，默认 `请拖动滑块完成拼图` |\n| confirmButton | 点选确认按钮，默认 `确认` |\n| buttonText | 触发按钮文案，默认 `点击按键进行验证` |\n| userCancel | 用户取消提示，默认 `用户取消` |\n| loading | 加载中文案，默认 `加载中...` |\n\n## ThemeTokens\n\n| 属性 | 说明 | 默认值 |\n|---|---|---|\n| primaryColor | 主题色 | `#347eff` |\n| backgroundColor | 弹窗背景色 | `#ffffff` |\n| textColor | 文本颜色 | `#333333` |\n| borderColor | 边框颜色 | `#e2e2e2` |\n| borderRadius | 圆角大小 | `4` |\n\n## 二次验证（S2S）\n\n前端完成验证后，`onSuccess(data)` 回调中的 `data` 会包含一个 `second_key`。你应该将此参数随表单提交到业务后台，再由业务后台向验证码服务端发起二次验证：\n\n```bash\ncurl -X GET \\\n  https://您的验证码域名/api/v1/captchas/states/{second_key} \\\n  -H \"Authorization: Bearer <API_KEY>\"\n```\n\n如果返回 `{\"valid\": true}` 则代表验证通过，可以放行业务逻辑。\n\n若后端配置了自定义 `API_PREFIX`，此 S2S 地址中的 `/api/v1` 也需替换为相同前缀。\n","readmeFilename":"README.md"}