|
- package main
-
- import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "log"
- "net/http"
- "time"
- )
-
- type kfInfo struct {
- Acc string `json:"kf_account"` //
- Nick string `json:"kf_nick"` //
- ID int `json:"kf_id"` //
- Avatar string `json:"kf_headimgurl"` //
- }
-
- //KFUserList a list of kf users
- type kfUserList struct {
- KfList []kfInfo `json:"kf_list"`
- }
-
- //KFCache KF user's info cache
- type kfCache struct {
- Name2Acc map[string]string //map nickname to account id
- ID2Acc map[int]string //map from id to acc
- Users kfUserList
- UpdateAt int32 //time stamp
- Expire int32 //time stamp
- }
-
- func getKFlistURL() string {
- atk, _ := GetAccessToken()
- return fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=%s", atk)
- }
-
- func (m *kfCache) getKFUsers() (err error) {
- jstr, err := m.kfGetListJSON()
- err = json.Unmarshal([]byte(jstr), &m.Users)
- return
- }
-
- func (m *kfCache) kfAcc(nickname string) (acc string) {
- m.kfRenewList()
- return m.Name2Acc[nickname]
- }
-
- func (m *kfCache) kfGetListJSON() (jstr string, err error) {
- url := getKFlistURL()
- resp, err := http.Get(url)
- if err != nil {
- return
- }
- b, err := ioutil.ReadAll(resp.Body)
- if err == nil {
- jstr = string(b)
- }
- return
- }
-
- func (m *kfCache) kfRenewList() {
- if m.Expire == 0 || m.UpdateAt == 0 || m.Expire < m.UpdateAt {
- log.Println("Renew Kf Info List")
- err := m.getKFUsers()
- if err == nil {
- m.Name2Acc = map[string]string{}
- m.ID2Acc = map[int]string{}
- for _, v := range m.Users.KfList {
- m.Name2Acc[v.Nick] = v.Acc
- m.ID2Acc[v.ID] = v.Acc
- }
- m.UpdateAt = int32(time.Now().Unix())
- m.Expire = m.UpdateAt + 1200 //20 minutes
- }
- }
- }
-
- func (m *kfCache) kfGetInfo(nick string) (r kfInfo) {
- m.kfRenewList()
- for _, v := range m.Users.KfList {
- if nick == v.Nick {
- return v
- }
- }
- return
- }
|