Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

88 lines
1.8KB

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. "net/http"
  8. "time"
  9. )
  10. type kfInfo struct {
  11. Acc string `json:"kf_account"` //
  12. Nick string `json:"kf_nick"` //
  13. ID int `json:"kf_id"` //
  14. Avatar string `json:"kf_headimgurl"` //
  15. }
  16. //KFUserList a list of kf users
  17. type kfUserList struct {
  18. KfList []kfInfo `json:"kf_list"`
  19. }
  20. //KFCache KF user's info cache
  21. type kfCache struct {
  22. Name2Acc map[string]string //map nickname to account id
  23. ID2Acc map[int]string //map from id to acc
  24. Users kfUserList
  25. UpdateAt int32 //time stamp
  26. Expire int32 //time stamp
  27. }
  28. func getKFlistURL() string {
  29. atk, _ := GetAccessToken()
  30. return fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=%s", atk)
  31. }
  32. func (m *kfCache) getKFUsers() (err error) {
  33. jstr, err := m.kfGetListJSON()
  34. err = json.Unmarshal([]byte(jstr), &m.Users)
  35. return
  36. }
  37. func (m *kfCache) kfAcc(nickname string) (acc string) {
  38. m.kfRenewList()
  39. return m.Name2Acc[nickname]
  40. }
  41. func (m *kfCache) kfGetListJSON() (jstr string, err error) {
  42. url := getKFlistURL()
  43. resp, err := http.Get(url)
  44. if err != nil {
  45. return
  46. }
  47. b, err := ioutil.ReadAll(resp.Body)
  48. if err == nil {
  49. jstr = string(b)
  50. }
  51. return
  52. }
  53. func (m *kfCache) kfRenewList() {
  54. if m.Expire == 0 || m.UpdateAt == 0 || m.Expire < m.UpdateAt {
  55. log.Println("Renew Kf Info List")
  56. err := m.getKFUsers()
  57. if err == nil {
  58. m.Name2Acc = map[string]string{}
  59. m.ID2Acc = map[int]string{}
  60. for _, v := range m.Users.KfList {
  61. m.Name2Acc[v.Nick] = v.Acc
  62. m.ID2Acc[v.ID] = v.Acc
  63. }
  64. m.UpdateAt = int32(time.Now().Unix())
  65. m.Expire = m.UpdateAt + 1200 //20 minutes
  66. }
  67. }
  68. }
  69. func (m *kfCache) kfGetInfo(nick string) (r kfInfo) {
  70. m.kfRenewList()
  71. for _, v := range m.Users.KfList {
  72. if nick == v.Nick {
  73. return v
  74. }
  75. }
  76. return
  77. }