Browse Source

微信修改

zhanghongbo 9 years ago
parent
commit
024ce2c0a7

+ 1 - 87
weixin/src/qfw/weixin/msgtxtchandler.go

@@ -1,13 +1,10 @@
 package weixin
 package weixin
 
 
 import (
 import (
-	"encoding/json"
 	"fmt"
 	"fmt"
-	"io/ioutil"
 	_ "log"
 	_ "log"
 	"math/rand"
 	"math/rand"
-	"net"
-	"net/http"
+
 	"qfw/weixin/dao"
 	"qfw/weixin/dao"
 	wf "qfw/weixinconfig"
 	wf "qfw/weixinconfig"
 	"strconv"
 	"strconv"
@@ -15,28 +12,6 @@ import (
 	"time"
 	"time"
 )
 )
 
 
-const (
-	APIKEY = "893b61852a7de8e3194194a0fe11917c"
-	APIURL = "http://www.tuling123.com/openapi/api"
-)
-
-var robotclient *http.Client
-
-//初始化图灵123 HttpClient加上超时
-func InitRobotHttpClient() {
-	robotclient = &http.Client{Transport: &http.Transport{
-		Dial: func(netw, addr string) (net.Conn, error) {
-			deadline := time.Now().Add(2 * time.Second)
-			c, err := net.DialTimeout(netw, addr, 2*time.Second)
-			if err != nil {
-				return nil, err
-			}
-			c.SetDeadline(deadline)
-			return c, nil
-		},
-	}}
-}
-
 //文本消息处理
 //文本消息处理
 func MsgTxtHandler(w ResponseWriter, r *Request) {
 func MsgTxtHandler(w ResponseWriter, r *Request) {
 	openid := r.FromUserName
 	openid := r.FromUserName
@@ -57,15 +32,9 @@ func MsgTxtHandler(w ResponseWriter, r *Request) {
 			processPIdentifyMsgTxt(us, w, r)
 			processPIdentifyMsgTxt(us, w, r)
 		} else if us.Type == "oidentify" {
 		} else if us.Type == "oidentify" {
 			processOIdentifyMsgTxt(us, w, r)
 			processOIdentifyMsgTxt(us, w, r)
-		} else if us.Type == "robot" { //聊天机器人
-			processRobotMsg(r.FromUserName, r.Content, w, r)
 		} else if us.Type == "wxadmin" {
 		} else if us.Type == "wxadmin" {
 			processWxAdmin(openid, r.Content, w, r)
 			processWxAdmin(openid, r.Content, w, r)
 		}
 		}
-	} else if r.Content == "小星" {
-		UserSession[r.FromUserName] = NewUserSession("robot")
-		w.ReplyText("嗨,小星来陪你解闷。有什么开心的,不开心的说说来,大伙乐呵乐呵。\n输入q或Q离开。")
-		return
 	} else if r.Content == "微信管理" && mids[openid] {
 	} else if r.Content == "微信管理" && mids[openid] {
 		UserSession[r.FromUserName] = NewUserSession("wxadmin")
 		UserSession[r.FromUserName] = NewUserSession("wxadmin")
 		w.ReplyText("您已进入微信管理,请输入指令操作:\n1.查看抽奖模式(指令:f0)\n2.切换抽奖模式(指令:c*,*为数字。如c0(自动模式),c1(手动模式1),c2(手动模式2),c3(手动模式3))\n3.统计抽奖结果(tjr*,tjr120(最近两分钟),tjr120-1200(最近两分钟至最近20分钟之间的))\n4.统计新用户数(tju*)\n5.服务器情况监测(ser0)\n6服务管理(man*,man1重启主程序(man11关闭),man2重启微信,man3重启积分(man33关闭),man4重启微信认证(man44关闭))。\n输入q或Q离开。")
 		w.ReplyText("您已进入微信管理,请输入指令操作:\n1.查看抽奖模式(指令:f0)\n2.切换抽奖模式(指令:c*,*为数字。如c0(自动模式),c1(手动模式1),c2(手动模式2),c3(手动模式3))\n3.统计抽奖结果(tjr*,tjr120(最近两分钟),tjr120-1200(最近两分钟至最近20分钟之间的))\n4.统计新用户数(tju*)\n5.服务器情况监测(ser0)\n6服务管理(man*,man1重启主程序(man11关闭),man2重启微信,man3重启积分(man33关闭),man4重启微信认证(man44关闭))。\n输入q或Q离开。")
@@ -180,58 +149,3 @@ func processPIdentifyMsgTxt(us *usersession, w ResponseWriter, r *Request) {
 		w.ReplyOK()
 		w.ReplyOK()
 	}
 	}
 }
 }
-
-//处理聊天机器人消息
-func processRobotMsg(userid string, content string, w ResponseWriter, r *Request) {
-	rurl := fmt.Sprintf("%s?key=%s&info=%s&userid=%s", APIURL, APIKEY, content, userid)
-	//log.Println("robot::", rurl)
-	resp, err1 := robotclient.Get(rurl)
-	if err1 != nil {
-		w.ReplyText("我386的大脑,实在理解不了你说的话啊。")
-		return
-	}
-	defer resp.Body.Close()
-	bs, err2 := ioutil.ReadAll(resp.Body)
-	if err2 != nil {
-		w.ReplyText("对不起,我理解不了你说的话。")
-		return
-	}
-	//log.Println("robot::", string(bs))
-	var tmp map[string]interface{}
-	err3 := json.Unmarshal(bs, &tmp)
-	if err3 != nil {
-		w.ReplyText("对不起,我理解不了你说的话。")
-		return
-	}
-	code, _ := tmp["code"].(float64)
-	if code == 100000 {
-		repl, _ := tmp["text"].(string)
-		w.ReplyText(repl)
-	} else if code == 308000 { //菜谱
-		l, _ := tmp["list"].([]interface{})
-		arts := []Article{}
-		for index, item := range l {
-			if index > 5 {
-				break
-			}
-			m := item.(map[string]interface{})
-			arts = append(arts, Article{Title: m["info"].(string), PicUrl: m["icon"].(string), Url: m["detailurl"].(string)})
-		}
-		w.ReplyNews(arts)
-	} else if code == 302000 { //新闻
-		l, _ := tmp["list"].([]interface{})
-		arts := []Article{}
-		for index, item := range l {
-			if index > 5 {
-				break
-			}
-			m := item.(map[string]interface{})
-			arts = append(arts, Article{Title: m["article"].(string), Url: m["detailurl"].(string)})
-		}
-		w.ReplyNews(arts)
-	} else {
-		w.ReplyText("对不起,我理解不了你说的话。")
-		return
-	}
-}
-

+ 90 - 14
weixin/src/qfw/weixin/subscribehandler.go

@@ -8,21 +8,87 @@ import (
 	"net/http"
 	"net/http"
 	"os"
 	"os"
 	"qfw/util"
 	"qfw/util"
-	wxutil "qfw/weixin/util"
 	"qfw/util/redis"
 	"qfw/util/redis"
 	"qfw/weixin/dao"
 	"qfw/weixin/dao"
+	wxutil "qfw/weixin/util"
 	"qfw/weixinconfig"
 	"qfw/weixinconfig"
 	"strings"
 	"strings"
 	"time"
 	"time"
 )
 )
 
 
+//关注事件处理
+func SubscribeHandler(w ResponseWriter, r *Request) {
+	l1 := time.Now().Unix()
+	wxutil.SubscribeInc()
+	openid := r.FromUserName
+	log.Println("user data", w.GetUserData())
+	ret,_ := w.GetUserData().(map[string]interface{})
+	var unionid, bindweixin, userphoto string
+	if ret != nil {
+		unionid = ""
+		bindweixin = "qmx-" + fmt.Sprintf("%d%d", time.Now().Local().Unix(), rand.Intn(99))
+	} else {
+		unionid, _ = ret["unionid"].(string)
+		bindweixin, _ = ret["nickname"].(string)
+		//取得用户头像
+		headimgurl, _ := ret["headimgurl"].(string)
+		log.Println("download userface :", headimgurl)
+		userphoto = downloadUserFace(headimgurl)
+	}
+	l2 := time.Now().Unix()
+	_, flag := dao.AddUser(openid, unionid, bindweixin, userphoto)
+	l2 = time.Now().Unix()
+	log.Println(",Add user", l2-l1)
+	l1 = l2
+	//保存关注日志
+	var source string
+	if len(r.EventKey) > 8 {
+		source = r.EventKey[8:]
+	} else {
+		source = ""
+	}
+	if digitreg.MatchString(source) {
+		dao.SaveSubscribeLogs(openid, unionid, bindweixin, "wangzhan", "subscribe")
+		if flag == 1 {
+			w.ReplyText(WELCOME_MSG) // 有新人关注,返回欢迎消息
+			redis.Put("sso", "new_"+source, openid, 900)
+			//TODO 处理分享(邀请)类的二维码,记录邀请关系
+			if strings.HasPrefix(source, "32") {
+				go dao.SaveInviteLink(source, r.FromUserName, false)
+				//go dao.UpdateInviteUserCoupon(source)
+			}
+		} else {
+			w.ReplyText(OWELCOME_MSG) // 有旧人关注,返回欢迎消息
+			if strings.HasPrefix(source, "32") {
+				go dao.SaveInviteLink(source, r.FromUserName, true)
+			}
+		}
+		DoLogin(source, openid)
+	} else {
+		if flag == 1 {
+			w.ReplyText(WELCOME_MSG) // 有新人关注,返回欢迎消息
+		} else {
+			w.ReplyText(OWELCOME_MSG) // 有旧人关注,返回欢迎消息
+		}
+		dao.SaveSubscribeLogs(openid, unionid, bindweixin, source, "subscribe")
+	}
 
 
+	l2 = time.Now().Unix()
+	log.Println(",Do save userinfo", l2-l1)
+	l1 = l2
+}
 
 
 //关注事件处理
 //关注事件处理
-func SubscribeHandler(w ResponseWriter, r *Request) {
+func SubscribeHandlerBak(w ResponseWriter, r *Request) {
+	l1 := time.Now().Unix()
 	wxutil.SubscribeInc()
 	wxutil.SubscribeInc()
 	openid := r.FromUserName
 	openid := r.FromUserName
+	log.Println("user data", w.GetUserData())
 	ret, err := w.GetUserBaseInfo(openid)
 	ret, err := w.GetUserBaseInfo(openid)
+	//ret:=w.GetUserData()
+	l2 := time.Now().Unix()
+	log.Println(",Get user baseinfo", l2-l1, " s")
+	l1 = l2
 	var unionid, bindweixin, userphoto string
 	var unionid, bindweixin, userphoto string
 	if err != nil {
 	if err != nil {
 		unionid = ""
 		unionid = ""
@@ -36,6 +102,9 @@ func SubscribeHandler(w ResponseWriter, r *Request) {
 		userphoto = downloadUserFace(headimgurl)
 		userphoto = downloadUserFace(headimgurl)
 	}
 	}
 	_, flag := dao.AddUser(openid, unionid, bindweixin, userphoto)
 	_, flag := dao.AddUser(openid, unionid, bindweixin, userphoto)
+	l2 = time.Now().Unix()
+	log.Println(",Add user", l2-l1)
+	l1 = l2
 	//保存关注日志
 	//保存关注日志
 	var source string
 	var source string
 	if len(r.EventKey) > 8 {
 	if len(r.EventKey) > 8 {
@@ -43,7 +112,7 @@ func SubscribeHandler(w ResponseWriter, r *Request) {
 	} else {
 	} else {
 		source = ""
 		source = ""
 	}
 	}
-	log.Println("source::", source, "flag:::", flag)
+	//log.Println("source::", source, "flag:::", flag)
 	if digitreg.MatchString(source) {
 	if digitreg.MatchString(source) {
 		dao.SaveSubscribeLogs(openid, unionid, bindweixin, "wangzhan", "subscribe")
 		dao.SaveSubscribeLogs(openid, unionid, bindweixin, "wangzhan", "subscribe")
 		if flag == 1 {
 		if flag == 1 {
@@ -69,6 +138,10 @@ func SubscribeHandler(w ResponseWriter, r *Request) {
 		}
 		}
 		dao.SaveSubscribeLogs(openid, unionid, bindweixin, source, "subscribe")
 		dao.SaveSubscribeLogs(openid, unionid, bindweixin, source, "subscribe")
 	}
 	}
+
+	l2 = time.Now().Unix()
+	log.Println(",Do save userinfo", l2-l1)
+	l1 = l2
 }
 }
 
 
 //取消关注事件处理
 //取消关注事件处理
@@ -112,18 +185,21 @@ func DoLogin(key string, openid string) {
 //下载微信用户头像
 //下载微信用户头像
 func downloadUserFace(url string) string {
 func downloadUserFace(url string) string {
 	var filename string
 	var filename string
-	util.Try(func() {
+	
 		tn := time.Now()
 		tn := time.Now()
 		filename = fmt.Sprintf("/upload/%s/%s/%s/%s%d.jpg", tn.Format("2006"), tn.Format("01"), tn.Format("02"), tn.Format("20060102150405"), rand.Intn(9999)+1000)
 		filename = fmt.Sprintf("/upload/%s/%s/%s/%s%d.jpg", tn.Format("2006"), tn.Format("01"), tn.Format("02"), tn.Format("20060102150405"), rand.Intn(9999)+1000)
-		fi, _ := os.OpenFile(weixinconfig.SysConfig.Imgpath+filename, os.O_CREATE|os.O_TRUNC|os.O_SYNC|os.O_RDWR, 0x666)
-		defer fi.Close()
-		resp, err := http.Get(url)
-		defer resp.Body.Close()
-		if err == nil {
-			io.Copy(fi, resp.Body)
-		} else {
-			log.Println("download userface err:", err.Error())
-		}
-	}, func(e interface{}) {})
+		go func() {
+			util.Try(func() {
+			fi, _ := os.OpenFile(weixinconfig.SysConfig.Imgpath+filename, os.O_CREATE|os.O_TRUNC|os.O_SYNC|os.O_RDWR, 0x666)
+			defer fi.Close()
+			resp, err := http.Get(url)
+			defer resp.Body.Close()
+			if err == nil {
+				io.Copy(fi, resp.Body)
+			} else {
+				log.Println("download userface err:", err.Error())
+			}
+			}, func(e interface{}) {})
+		}()
 	return filename
 	return filename
 }
 }

+ 2 - 20
weixin/src/qfw/weixin/voicehandler.go

@@ -17,22 +17,7 @@ func MsgVoiceHandler(w ResponseWriter, r *Request) {
 		return
 		return
 	}
 	}
 	tmp := clear_voice_reg.ReplaceAllString(r.Recognition, "")
 	tmp := clear_voice_reg.ReplaceAllString(r.Recognition, "")
-	if v, ok := UserSession[r.FromUserName]; ok {
-		if v.Type == "robot" { //正在聊天
-			if len(chat_bye.FindStringIndex(tmp)) > 0 { //离开
-				delete(UserSession, r.FromUserName)
-				w.ReplyText("再见了小主人,记得想我呦。")
-				return
-			} else { //正常聊天
-				processRobotMsg(r.FromUserName, tmp, w, r)
-				return
-			}
-		}
-	} else if len(notify_xiaoxing.FindStringIndex(tmp)) > 0 {
-		UserSession[r.FromUserName] = NewUserSession("robot")
-		w.ReplyText("嗨,小星来陪你解闷。有什么开心的,不开心的说说来,大伙乐呵乐呵。\n输入q或Q离开。")
-		return
-	} else if k_index := keyword_voice_reg.FindStringIndex(tmp); len(k_index) == 2 {
+	if k_index := keyword_voice_reg.FindStringIndex(tmp); len(k_index) == 2 {
 		//不再会话中,也没有唤醒小星,并且在查企业
 		//不再会话中,也没有唤醒小星,并且在查企业
 		search := tmp[k_index[1]:]
 		search := tmp[k_index[1]:]
 		ret, err := findEntprise(search)
 		ret, err := findEntprise(search)
@@ -48,10 +33,7 @@ func MsgVoiceHandler(w ResponseWriter, r *Request) {
 			}
 			}
 			w.ReplyNews(arts)
 			w.ReplyNews(arts)
 		}
 		}
-	} else {
-		w.ReplyText("您说的是:" + tmp + ",小星无法识别。\n查询企业请说:\n搜索XX\n查询XX\n检索XX")
-		return
-	}
+	}  
 }
 }
 
 
 //查询企业
 //查询企业

+ 11 - 1
weixin/src/qfw/weixin/weixin.go

@@ -15,6 +15,11 @@ var WELCOME_MSG string
 var OWELCOME_MSG string
 var OWELCOME_MSG string
 var digitreg *regexp.Regexp = regexp.MustCompile("^\\d+$")
 var digitreg *regexp.Regexp = regexp.MustCompile("^\\d+$")
 
 
+var mids = map[string]bool{}
+var reg = regexp.MustCompile("^([a-z]+)(\\d.*)$")
+var subreg = regexp.MustCompile("^(\\d+)([smhd]{0,1})$")
+var DIR = ""
+
 func InitWeixinSdk() {
 func InitWeixinSdk() {
 	keyword_voice_reg, _ = regexp.Compile("查询|搜索|检索|看|找|查|搜")
 	keyword_voice_reg, _ = regexp.Compile("查询|搜索|检索|看|找|查|搜")
 	clear_voice_reg, _ = regexp.Compile("!|!|\\s+")
 	clear_voice_reg, _ = regexp.Compile("!|!|\\s+")
@@ -23,6 +28,12 @@ func InitWeixinSdk() {
 	WELCOME_MSG = wf.SysConfig.WelcomeTip
 	WELCOME_MSG = wf.SysConfig.WelcomeTip
 	OWELCOME_MSG = wf.SysConfig.OWelcomeTip
 	OWELCOME_MSG = wf.SysConfig.OWelcomeTip
 
 
+	//
+	for _, v := range wf.SysConfig.Mids {
+		mids[v] = true
+	}
+	DIR = wf.SysConfig.Dir
+
 	// my-token 验证微信公众平台的Token
 	// my-token 验证微信公众平台的Token
 	// app-id, app-secret用于高级API调用。
 	// app-id, app-secret用于高级API调用。
 	// 如果仅使用接收/回复消息,则可以不填写,使用下面语句
 	// 如果仅使用接收/回复消息,则可以不填写,使用下面语句
@@ -57,7 +68,6 @@ func InitWeixinSdk() {
 	http.HandleFunc("/"+wf.SysConfig.Appcontext+"/adv/", AdvHandle)
 	http.HandleFunc("/"+wf.SysConfig.Appcontext+"/adv/", AdvHandle)
 
 
 	//执行其他一些初始化的动作
 	//执行其他一些初始化的动作
-	InitRobotHttpClient()
 	InitSSLClient()
 	InitSSLClient()
 	util.StartSubscribeFilter(wf.SysConfig.SubscribeMonitorCyc, wf.SysConfig.SubscribeMonitorTimes)
 	util.StartSubscribeFilter(wf.SysConfig.SubscribeMonitorCyc, wf.SysConfig.SubscribeMonitorTimes)
 }
 }

+ 0 - 13
weixin/src/qfw/weixin/wxadmin.go

@@ -8,24 +8,11 @@ import (
 	"qfw/util"
 	"qfw/util"
 	"qfw/util/mongodb"
 	"qfw/util/mongodb"
 	"qfw/util/redis"
 	"qfw/util/redis"
-	"qfw/weixinconfig"
-	"regexp"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 	"time"
 	"time"
 )
 )
 
 
-var mids = map[string]bool{}
-var reg = regexp.MustCompile("^([a-z]+)(\\d.*)$")
-var subreg = regexp.MustCompile("^(\\d+)([smhd]{0,1})$")
-var DIR = ""
-
-func init() {
-	for _, v := range weixinconfig.SysConfig.Mids {
-		mids[v] = true
-	}
-	DIR = weixinconfig.SysConfig.Dir
-}
 
 
 func processWxAdmin(openid, content string, w ResponseWriter, r *Request) {
 func processWxAdmin(openid, content string, w ResponseWriter, r *Request) {
 	util.Try(func() {
 	util.Try(func() {