このコミットが含まれているのは:
守矢諏訪子 2023-09-27 23:01:54 +09:00
コミット 366283bd62
3個のファイルの変更23行の追加20行の削除

7
go.mod
ファイルの表示

@ -2,7 +2,6 @@ module gitler.moe/suwako/gocaptcha
go 1.21.1
require (
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
golang.org/x/image v0.12.0
)
require golang.org/x/image v0.12.0
require golang.org/x/text v0.13.0 // indirect

3
go.sum
ファイルの表示

@ -1,5 +1,3 @@
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
@ -27,6 +25,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=

33
main.go
ファイルの表示

@ -1,7 +1,6 @@
package gocaptcha
import (
"bytes"
"crypto/rand"
"encoding/base64"
"image"
@ -11,10 +10,12 @@ import (
"io/ioutil"
"math/big"
"strings"
"bytes"
"golang.org/x/image/font"
"golang.org/x/image/font/sfnt"
"golang.org/x/image/math/fixed"
"github.com/golang/freetype/truetype"
"golang.org/x/image/font/opentype"
)
type Captcha struct {
@ -38,23 +39,29 @@ func GenerateCaptcha(fontPath, charset string, length int) (*Captcha, error) {
return nil, err
}
f, err := truetype.Parse(fontBytes)
f, err := sfnt.Parse(fontBytes)
if err != nil {
return nil, err
}
face, err := opentype.NewFace(f, &opentype.FaceOptions{
Size: 24,
DPI: 72,
Hinting: font.HintingFull,
})
if err != nil {
return nil, err
}
defer face.Close()
img := image.NewRGBA(image.Rect(0, 0, 300, 100))
bgColor := color.RGBA{0, 0, 0, 255}
draw.Draw(img, img.Bounds(), &image.Uniform{bgColor}, image.Point{}, draw.Src)
d := &font.Drawer{
Dst: img,
Src: image.NewUniform(color.RGBA{255, 255, 255, 255}),
Face: truetype.NewFace(f, &truetype.Options{
Size: 24,
DPI: 72,
Hinting: font.HintingFull,
}),
Dst: img,
Src: image.NewUniform(color.RGBA{255, 255, 255, 255}),
Face: face,
}
d.Dot = fixed.Point26_6{
@ -83,12 +90,10 @@ func VerifyCaptcha(input, captchaText string) bool {
}
func genTxt(charset string, length int) string {
runes := []rune(charset)
text := make([]rune, length)
for i := range text {
bigIndex, _ := rand.Int(rand.Reader, big.NewInt(int64(len(runes))))
randomIndex := int(bigIndex.Int64())
text[i] = runes[randomIndex]
randomIndex, _ := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
text[i] = rune(charset[randomIndex.Int64()])
}
return string(text)
}