|
@@ -2,8 +2,13 @@
|
|
|
package weixin
|
|
|
|
|
|
import (
|
|
|
+ "bytes"
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
+ "github.com/disintegration/imaging"
|
|
|
+ "image"
|
|
|
+ "image/color"
|
|
|
+ "io"
|
|
|
"log"
|
|
|
"math/rand"
|
|
|
util "mfw/util"
|
|
@@ -11,7 +16,6 @@ import (
|
|
|
"net/rpc"
|
|
|
"os"
|
|
|
qfwutil "qfw/util"
|
|
|
- "qfw/util/image"
|
|
|
qrpc "qfw/util/rpc"
|
|
|
wf "qfw/weixinconfig"
|
|
|
"sync"
|
|
@@ -22,6 +26,11 @@ const (
|
|
|
status_rest = 0 //闲时,没有任务
|
|
|
status_working = 1 //进入工作状态
|
|
|
status_waitReply = 2 //收到验证码,等待回复
|
|
|
+ //
|
|
|
+ white = uint8(0xff)
|
|
|
+ bgImgName = "background.jpg"
|
|
|
+ newsImagWidth = 640
|
|
|
+ newsImagHeight = 320
|
|
|
)
|
|
|
|
|
|
var workLock = new(sync.Mutex)
|
|
@@ -34,6 +43,10 @@ var client *util.Client
|
|
|
type DistinguishWork struct {
|
|
|
}
|
|
|
|
|
|
+func init() {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
func InitDgWork() {
|
|
|
client, _ = util.StartClient(processevent, wf.SysConfig.Msgserver, []int{util.SERVICE_DISTINGUISH}, 20)
|
|
|
client.ResetMyName("识别验证码")
|
|
@@ -42,6 +55,7 @@ func processevent(p *util.Packet) {
|
|
|
event := int(p.Event)
|
|
|
switch event {
|
|
|
case util.SERVICE_DISTINGUISH:
|
|
|
+ defer util.Catch()
|
|
|
log.Println("------接收到消息的数据-----")
|
|
|
//写数据
|
|
|
if ret := make(map[string]interface{}); json.Unmarshal(p.GetBusinessData(), &ret) == nil {
|
|
@@ -79,6 +93,7 @@ func processevent(p *util.Packet) {
|
|
|
|
|
|
//开始工作,记录工作人的相关数
|
|
|
func (a *DistinguishWork) Start(openId string) {
|
|
|
+ defer util.Catch()
|
|
|
if client == nil {
|
|
|
InitDgWork()
|
|
|
}
|
|
@@ -93,6 +108,7 @@ func (a *DistinguishWork) Start(openId string) {
|
|
|
|
|
|
//结束工作,删除工作人
|
|
|
func (a *DistinguishWork) End(openId string) {
|
|
|
+ defer util.Catch()
|
|
|
end(openId)
|
|
|
}
|
|
|
|
|
@@ -108,6 +124,7 @@ func end(openId string) {
|
|
|
|
|
|
//判断该人是否是工作模式
|
|
|
func (a *DistinguishWork) IsWorking(openId string) bool {
|
|
|
+ defer util.Catch()
|
|
|
for _, v := range workers {
|
|
|
if v["openId"] == openId {
|
|
|
return true
|
|
@@ -118,6 +135,7 @@ func (a *DistinguishWork) IsWorking(openId string) bool {
|
|
|
|
|
|
//判断该人是否在等待回复
|
|
|
func (a *DistinguishWork) IsWaitReply(openId string) bool {
|
|
|
+ defer util.Catch()
|
|
|
for _, v := range workers {
|
|
|
if v["openId"] == openId {
|
|
|
return v["status"] == status_waitReply
|
|
@@ -138,6 +156,7 @@ func overtime(msgId string) {
|
|
|
|
|
|
//回复验证码
|
|
|
func (a *DistinguishWork) Reply(openId, content string) {
|
|
|
+ defer util.Catch()
|
|
|
obj := workering[openId]
|
|
|
if obj == nil || len(obj) < 2 {
|
|
|
return
|
|
@@ -216,7 +235,6 @@ func worked(o map[string]interface{}) (string, map[string]interface{}, int) {
|
|
|
obj["imgName"] = name
|
|
|
}
|
|
|
if name == "" || err != nil {
|
|
|
- log.Println("生成验证码图片出错:", err)
|
|
|
return openId, obj, -2
|
|
|
}
|
|
|
workering[openId] = []string{msgId, from}
|
|
@@ -313,40 +331,79 @@ func getWorker(obj map[string]interface{}) (openId string, object map[string]int
|
|
|
//获取一个要识别的任务
|
|
|
func createImg(msgId string, img []byte) (string, error) {
|
|
|
name := msgId + "-" + fmt.Sprint(time.Now().Unix()) + ".jpg"
|
|
|
- path := wf.SysConfig.Imgpath + "/upload/spider"
|
|
|
+ path := wf.SysConfig.Imgpath + "/upload/spider/"
|
|
|
fs, err := os.Open(path)
|
|
|
if err != nil && os.MkdirAll(path, 0700) != nil {
|
|
|
log.Println("创建文件夹出错:", err)
|
|
|
return "", err
|
|
|
}
|
|
|
defer fs.Close()
|
|
|
- file, err := os.Create(path + "/" + name)
|
|
|
+ err = processImg(path, name, bytes.NewBuffer(img), img)
|
|
|
if err != nil {
|
|
|
- log.Println("创建验证码图片出错:", err)
|
|
|
return "", err
|
|
|
}
|
|
|
- defer file.Close()
|
|
|
- _, err = file.Write(img)
|
|
|
+ return name, nil
|
|
|
+}
|
|
|
+
|
|
|
+func processImg(path, name string, file io.Reader, img []byte) error {
|
|
|
+ b_image, err := imaging.Open(path + bgImgName)
|
|
|
if err != nil {
|
|
|
- log.Println("写入验证码图片出错:", err)
|
|
|
- return "", err
|
|
|
+ b_newImg := imaging.New(newsImagWidth, newsImagHeight, color.NRGBA{white, white, white, white})
|
|
|
+ err = imaging.Save(b_newImg, path+bgImgName)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("创建背景图片出错!", err)
|
|
|
+ }
|
|
|
+ b_image, err = imaging.Open(path + bgImgName)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("重新打开背景图片出错!", err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ config, _, err := image.DecodeConfig(file)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("获取图片config出错!", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ w := config.Width
|
|
|
+ h := config.Height
|
|
|
+ if w >= newsImagWidth {
|
|
|
+ return nil
|
|
|
}
|
|
|
- newName, e := image.MakeResize(path+"/"+name, 640, 320, 100, 0)
|
|
|
- if e == nil {
|
|
|
- //删除老文件
|
|
|
- file.Close()
|
|
|
- if e = os.Remove(path + "/" + name); e != nil {
|
|
|
- return newName, nil
|
|
|
+ f, err := os.Create(path + name)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("创建图片出错!", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = f.Write(img)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("写入图片出错!", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ f.Close()
|
|
|
+ _file, err := imaging.Open(path + name)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("打开图片出错!", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if h > newsImagHeight {
|
|
|
+ err = imaging.Save(imaging.Resize(_file, 0, newsImagHeight, imaging.Lanczos), path+name)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("缩放图片出错!", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _file, err = imaging.Open(path + name)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("缩放之后重新打开图片出错!", err)
|
|
|
+ return err
|
|
|
}
|
|
|
- os.Rename(path+"/"+newName, path+"/"+name)
|
|
|
}
|
|
|
- return name, nil
|
|
|
+ err = imaging.Save(imaging.PasteCenter(b_image, _file), path+name)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("合并之后创建图片出错:", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
-func Distinguishworkinit(w http.ResponseWriter, r *http.Request) {
|
|
|
- var distinguishWork DistinguishWork
|
|
|
- distinguishWork.Start("o8-2pwHj1s_tv3nnRxrH9cD2ngkk")
|
|
|
-}
|
|
|
func Monitor(w http.ResponseWriter, r *http.Request) {
|
|
|
var h_p, h_w, h_wa string
|
|
|
for _, v := range workers {
|