comein.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. package comein
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "hongze/hongze_task/models"
  8. "hongze/hongze_task/models/yb"
  9. "hongze/hongze_task/services/alarm_msg"
  10. "hongze/hongze_task/utils"
  11. "io/ioutil"
  12. "net/http"
  13. "net/url"
  14. "sort"
  15. "strconv"
  16. "time"
  17. )
  18. // EventListResp 会议列表返回数据结构
  19. type EventListResp struct {
  20. Code string `json:"code"`
  21. Data []EventListDataResp `json:"data"`
  22. Errorcode string `json:"errorcode"`
  23. Errordesc string `json:"errordesc"`
  24. Extra struct {
  25. HasMore bool `json:"hasMore"`
  26. More string `json:"more"`
  27. Pagestart string `json:"pagestart"`
  28. Total string `json:"total"`
  29. } `json:"extra"`
  30. Msg string `json:"msg"`
  31. Total int64 `json:"total"`
  32. }
  33. // EventListDataResp 会议数据
  34. type EventListDataResp struct {
  35. Authtag string `json:"authtag"`
  36. ConferenceType int64 `json:"conferenceType"`
  37. ContentTypeTagName string `json:"contentTypeTagName"`
  38. DescURL string `json:"descUrl"`
  39. Etime int64 `json:"etime"`
  40. ID int64 `json:"id"`
  41. IndustryName string `json:"industryName"`
  42. IsDel int64 `json:"isDel"`
  43. Livemode int64 `json:"livemode"`
  44. Logo string `json:"logo"`
  45. Logoweb string `json:"logoweb"`
  46. Members []struct {
  47. Identity int64 `json:"identity"`
  48. PhoneNumber string `json:"phoneNumber"`
  49. Type int64 `json:"type"`
  50. Uname string `json:"uname"`
  51. } `json:"members"`
  52. PresentURL string `json:"presentUrl"`
  53. RecordSupport int64 `json:"recordSupport"`
  54. RoadshowID int64 `json:"roadshowId"`
  55. ShortURL string `json:"shortUrl"`
  56. Status string `json:"status"`
  57. Stime int64 `json:"stime"`
  58. Title string `json:"title"`
  59. WxminiProgramID string `json:"wxminiProgramId"`
  60. WxminiProgramPage string `json:"wxminiProgramPage"`
  61. }
  62. // GetEventList 获取会议列表
  63. func GetEventList(startTime, endTime time.Time) (respData EventListResp, err error) {
  64. defer func() {
  65. if err != nil {
  66. go alarm_msg.SendAlarmMsg("查询组织下所有的会议列表失败;ERR:"+err.Error(), 3)
  67. }
  68. }()
  69. logMsg := ``
  70. pageStart := 0
  71. pageNum := 10
  72. paramsMap := map[string]string{
  73. "mod": "roadshow", //模块名
  74. "act": "opensearch", //处理方法名
  75. //"btime": fmt.Sprint(startTime.Unix() * 1000), //开始时间,时间戳
  76. //"etime": fmt.Sprint(endTime.Unix() * 1000), //结束时间,时间戳
  77. //"ignoredel": "1", //忽略已删除的数据 (1 删除的数据也可查询出)
  78. "pagestart": strconv.Itoa(pageStart), //翻页数 (第一页传 0 )
  79. "pagenum": strconv.Itoa(pageNum), //每页总条数(默认10条)
  80. "ts": fmt.Sprint(time.Now().Unix() * 1000), //请求发起的时间戳,单位:毫秒
  81. }
  82. paramStr := GetUrlParams(paramsMap)
  83. //fmt.Println(paramStr)
  84. //App string `json:"app" description:"数据类型"`
  85. //Mod string `json:"mod" description:"模块名"`
  86. //Act string `json:"act" description:"处理方法名"`
  87. //Appid string `json:"appid" description:"合作方ID"`
  88. getUrl := utils.COMEIN_URL + "?" + paramStr
  89. resp, err := http.Get(getUrl)
  90. if err != nil {
  91. logMsg = fmt.Sprint("comein get err; request:", getUrl, "; errMsg:", err.Error())
  92. utils.FileLog.Info(logMsg)
  93. return
  94. }
  95. defer resp.Body.Close()
  96. body, err := ioutil.ReadAll(resp.Body)
  97. if err != nil {
  98. logMsg = fmt.Sprint("comein get err; request:", getUrl, "; errMsg:", err.Error())
  99. utils.FileLog.Info(logMsg)
  100. return
  101. }
  102. utils.FileLog.Info(fmt.Sprint("comein get Result", ";url:", getUrl, ";\nresponse:", string(body)))
  103. err = json.Unmarshal(body, &respData)
  104. if err != nil {
  105. utils.FileLog.Info("comein get Err:", err.Error(), ";url:", getUrl, ";response:", string(body))
  106. err = errors.New("Unmarshal Err:" + err.Error())
  107. return
  108. }
  109. if respData.Errorcode != "0" {
  110. utils.FileLog.Info("comein get Err:", err.Error(), ";url:", getUrl, ";response:", string(body))
  111. err = errors.New(respData.Errordesc)
  112. return
  113. }
  114. return
  115. }
  116. // RoadshowDataResp 用户参会数据返回
  117. type RoadshowDataResp struct {
  118. Code string `json:"code"`
  119. Data []RoadshowData `json:"data"`
  120. Errorcode string `json:"errorcode"`
  121. Errordesc string `json:"errordesc"`
  122. Msg string `json:"msg"`
  123. }
  124. type RoadshowData struct {
  125. AreaCode string `json:"areaCode"`
  126. AskCount int64 `json:"askCount"`
  127. AuthInfo string `json:"authInfo"`
  128. Company string `json:"company"`
  129. DataType int64 `json:"dataType"`
  130. DutySeller string `json:"dutySeller"`
  131. Email string `json:"email"`
  132. FirstWatchTime int64 `json:"firstWatchTime"`
  133. GuestUserNames string `json:"guestUserNames"`
  134. ID int64 `json:"id"`
  135. JoinTime int64 `json:"joinTime"`
  136. JoinType int64 `json:"joinType"`
  137. LastWatchTime int64 `json:"lastWatchTime"`
  138. MeetingType string `json:"meetingType"`
  139. Occupation string `json:"occupation"`
  140. OrgRemarks string `json:"orgRemarks"`
  141. ResearchArea string `json:"researchArea"`
  142. RoadshowBeginTime int64 `json:"roadshowBeginTime"`
  143. RoadshowEndTime int64 `json:"roadshowEndTime"`
  144. RoadshowID int64 `json:"roadshowId"`
  145. RoadshowTitle string `json:"roadshowTitle"`
  146. RoadshowType int64 `json:"roadshowType"`
  147. SpeakerID int64 `json:"speakerId"`
  148. SpeakerName string `json:"speakerName"`
  149. TelFixedID int64 `json:"telFixedId"`
  150. TeleconferenceID string `json:"teleconferenceId"`
  151. ThirdMeetingID string `json:"thirdMeetingId"`
  152. UniqueID string `json:"uniqueId"`
  153. UserIdentity int64 `json:"userIdentity"`
  154. UserInfoSource string `json:"userInfoSource"`
  155. UserName string `json:"userName"`
  156. UserPhone string `json:"userPhone"`
  157. }
  158. // GetRoadshowDataList 获取参会人员列表
  159. func GetRoadshowDataList(startTime, endTime int64) (respData RoadshowDataResp, err error) {
  160. defer func() {
  161. if err != nil {
  162. go alarm_msg.SendAlarmMsg("获取参会人员列表失败;ERR:"+err.Error(), 3)
  163. }
  164. }()
  165. logMsg := ``
  166. paramsMap := map[string]string{
  167. "mod": "open", //模块名
  168. "act": "roadshow-datas", //处理方法名
  169. "beginTime": fmt.Sprint(startTime), //开始时间,时间戳
  170. "endTime": fmt.Sprint(endTime), //结束时间,时间戳
  171. "ts": fmt.Sprint(time.Now().Unix() * 1000), //请求发起的时间戳,单位:毫秒
  172. }
  173. paramStr := GetUrlParams(paramsMap)
  174. paramsMap["dataType"] = "1" //数据类型,1:直播 2:回放 (该参数不参与签名算法)
  175. //fmt.Println(paramStr)
  176. //App string `json:"app" description:"数据类型"`
  177. //Mod string `json:"mod" description:"模块名"`
  178. //Act string `json:"act" description:"处理方法名"`
  179. //Appid string `json:"appid" description:"合作方ID"`
  180. getUrl := utils.COMEIN_URL + "?" + paramStr
  181. resp, err := http.Get(getUrl)
  182. if err != nil {
  183. logMsg = fmt.Sprint("获取参会人员列表 comein get err; request:", getUrl, "; errMsg:", err.Error())
  184. utils.FileLog.Info(logMsg)
  185. return
  186. }
  187. defer resp.Body.Close()
  188. body, err := ioutil.ReadAll(resp.Body)
  189. if err != nil {
  190. logMsg = fmt.Sprint("获取参会人员列表 comein get err; request:", getUrl, "; errMsg:", err.Error())
  191. utils.FileLog.Info(logMsg)
  192. return
  193. }
  194. utils.FileLog.Info(fmt.Sprint("获取参会人员列表 comein get Result", ";url:", getUrl, ";\nresponse:", string(body)))
  195. err = json.Unmarshal(body, &respData)
  196. if err != nil {
  197. utils.FileLog.Info("获取参会人员列表 comein get Err:", err.Error(), ";url:", getUrl, ";response:", string(body))
  198. err = errors.New("Unmarshal Err:" + err.Error())
  199. return
  200. }
  201. if respData.Errorcode != "0" {
  202. utils.FileLog.Info("获取参会人员列表 comein get Err:", err.Error(), ";url:", getUrl, ";response:", string(body))
  203. err = errors.New(respData.Errordesc)
  204. return
  205. }
  206. return
  207. }
  208. // GetUrlParams 获取url请求参数
  209. func GetUrlParams(params map[string]string) (paramStr string) {
  210. GetSign(params)
  211. // 待签名字符串
  212. for index, val := range params {
  213. paramStr += index + `=` + val + `&`
  214. }
  215. paramStr = paramStr[:len(paramStr)-1]
  216. return
  217. }
  218. // GetSign 获取签名
  219. func GetSign(params map[string]string) (paramStr string) {
  220. //获取map的下标切片,然后对下标进行排序
  221. keySlice := make([]string, 0)
  222. //基础参数
  223. params["appid"] = utils.COMEIN_APPID //签名用的是appid,实际请求用的appId
  224. params["app"] = "json"
  225. ignoreStr := []string{"app", "mod", "act"}
  226. for index := range params {
  227. //需要忽略的字符
  228. if utils.InArrayByStr(ignoreStr, index) {
  229. continue
  230. }
  231. keySlice = append(keySlice, index)
  232. }
  233. sort.Strings(keySlice)
  234. // 待签名字符串
  235. for _, index := range keySlice {
  236. paramStr += index + `=` + params[index] + `&`
  237. }
  238. // 获取签名
  239. signStr := utils.HmacMd5(utils.COMEIN_SECREKEY, paramStr[:len(paramStr)-1])
  240. signature := url.QueryEscape(signStr)
  241. params["signature"] = signature
  242. delete(params, "appid")
  243. params["appId"] = utils.COMEIN_APPID
  244. return
  245. }
  246. // InitAddWhiteList 初始化进门财经白名单
  247. func InitAddWhiteList() (err error) {
  248. defer func() {
  249. if err != nil {
  250. go alarm_msg.SendAlarmMsg("InitAddWhiteList;ERR:"+err.Error(), 3)
  251. }
  252. }()
  253. postUrl := utils.COMEIN_URL
  254. timestamp := fmt.Sprintf("%d", time.Now().UnixNano()/1e6)
  255. signature := GetSignature("1", timestamp)
  256. request := yb.SyncWhitelist{
  257. Opt: 1,
  258. Timestamp: timestamp,
  259. AppID: utils.COMEIN_WHITELIST_APPID,
  260. Signature: signature,
  261. }
  262. list, err := models.GetComeinWhiteUserMulti()
  263. if err != nil {
  264. fmt.Println("GetUserMobileFormal Err:", err.Error())
  265. return
  266. }
  267. whiteList := make([]yb.Whitelist, 0)
  268. for _, v := range list {
  269. whiteUser := yb.Whitelist{}
  270. if v.Mobile != "" {
  271. whiteUser.Phone = v.Mobile
  272. whiteUser.Areacode = "+" + v.CountryCode
  273. whiteUser.Guid = utils.MD5(strconv.Itoa(v.UserId))
  274. whiteList = append(whiteList, whiteUser)
  275. } else if v.Email != "" {
  276. whiteUser.Email = v.Email
  277. whiteUser.Guid = utils.MD5(strconv.Itoa(v.UserId))
  278. whiteList = append(whiteList, whiteUser)
  279. }
  280. }
  281. fmt.Println("共"+strconv.Itoa(len(whiteList))+"条数据")
  282. // 分批发送请求
  283. var count int
  284. for i, v := range whiteList {
  285. request.Whitelist = append(request.Whitelist, v)
  286. if count < 10000 && (len(whiteList)-i-1) > 0 {
  287. count++
  288. continue
  289. }
  290. count = 0
  291. jsonData, e := json.Marshal(request)
  292. if e != nil {
  293. err = e
  294. return
  295. }
  296. fmt.Println(jsonData)
  297. headers := map[string]string{
  298. "app": "json",
  299. "mod": "channelopen",
  300. "act": "whitelist",
  301. }
  302. // 发起POST请求
  303. resp, e := utils.MakePostRequest(postUrl, jsonData, headers)
  304. if e != nil {
  305. err = e
  306. utils.FileLog.Info("comein addWhitelist Err:", err.Error(), ";url:", postUrl)
  307. return
  308. }
  309. defer resp.Body.Close()
  310. body, e := ioutil.ReadAll(resp.Body)
  311. if e != nil {
  312. err = e
  313. fmt.Println("reponse error", err)
  314. return
  315. }
  316. result := new(yb.ComeinResponse)
  317. err = json.Unmarshal(body, &result)
  318. if err != nil {
  319. fmt.Println("json.Unmarshal Err:" + err.Error())
  320. return
  321. }
  322. utils.FileLog.Info(fmt.Sprint("comein addWhitelist Result", ";url:", postUrl, ";\nresponse:", string(body)))
  323. err = json.Unmarshal(body, &result)
  324. if err != nil {
  325. utils.FileLog.Info("comein addWhitelist Err:", err.Error(), ";url:", postUrl, ";response:", string(body))
  326. err = errors.New("Unmarshal Err:" + err.Error())
  327. return
  328. }
  329. if result.ErrorCode != "0" {
  330. utils.FileLog.Info("comein addWhitelist Err:", err.Error(), ";url:", postUrl, ";response:", string(body))
  331. err = errors.New(result.ErrorDesc)
  332. return
  333. }
  334. request.Whitelist = nil
  335. time.Sleep(110 * time.Second)
  336. fmt.Println("同步成功:"+strconv.Itoa(i+1)+"条数据")
  337. }
  338. return
  339. }
  340. func GetSignature(opt, timestamp string) (signature string) {
  341. //获取map的下标切片,然后对下标进行排序
  342. keySlice := make([]string, 0)
  343. //基础参数
  344. params := make(map[string]string, 0)
  345. params["appid"] = utils.COMEIN_WHITELIST_APPID //签名用的是appid,实际请求用的appId
  346. params["opt"] = opt
  347. params["timestamp"] = timestamp
  348. for index := range params {
  349. keySlice = append(keySlice, index)
  350. }
  351. sort.Strings(keySlice)
  352. var paramStr string
  353. // 待签名字符串
  354. for _, index := range keySlice {
  355. paramStr += index + `=` + params[index] + `&`
  356. }
  357. paramStr = paramStr[:len(paramStr)-1]
  358. // 获取签名
  359. signStr := utils.HmacMd5(utils.COMEIN_WHITELIST_SECREKEY, paramStr)
  360. signature = url.QueryEscape(signStr)
  361. return
  362. }
  363. func InitComeinWhiteList()(err error) {
  364. list := make([]*models.ComeinWhiteUser, 0)
  365. realList, err := models.GetUserMobileFormal()
  366. if err != nil {
  367. fmt.Println("GetUserMobileFormal Err:", err.Error())
  368. return
  369. }
  370. for _, v := range realList {
  371. user := models.ComeinWhiteUser{
  372. Email: v.Email,
  373. Mobile: v.Mobile,
  374. CountryCode: "+86",
  375. IsFake: 0,
  376. }
  377. list = append(list, &user)
  378. }
  379. for i := 0; i < 100000-len(realList); i++ {
  380. phone := utils.RandomPhone()
  381. user := models.ComeinWhiteUser{
  382. Mobile: phone,
  383. CountryCode: "+86",
  384. IsFake: 1,
  385. }
  386. list = append(list, &user)
  387. }
  388. err = models.AddComeinWhiteUserMulti(list)
  389. if err != nil {
  390. fmt.Println("添加随机手机号失败", err.Error())
  391. return
  392. }
  393. fmt.Println("添加随机手机号成功")
  394. return
  395. }
  396. // SyncWhiteList 同步进门财经白名单定时任务
  397. func SyncWhiteList(cont context.Context) (err error) {
  398. defer func() {
  399. if err != nil {
  400. go alarm_msg.SendAlarmMsg("SyncWhiteList;ERR:"+err.Error(), 3)
  401. }
  402. }()
  403. // 拿白名单表
  404. list, err := models.GetComeinWhiteUserMulti()
  405. if err != nil {
  406. fmt.Println("GetUserMobileFormal Err:", err.Error())
  407. return
  408. }
  409. syncedMap := make(map[string]bool, 0)
  410. for _, v := range list {
  411. syncedMap[v.Mobile+v.Email] = true
  412. }
  413. //拿联系人表,需要进白名单的
  414. needAddList, err := models.GetUserMobileFormal()
  415. if err != nil {
  416. fmt.Println("GetUserMobileFormal Err:", err.Error())
  417. return
  418. }
  419. addList := make([]*models.ComeinWhiteUser, 0)
  420. for _, v := range needAddList {
  421. if _, ok := syncedMap[v.Mobile+v.Email]; !ok {
  422. user := models.ComeinWhiteUser{
  423. Mobile: v.Mobile,
  424. CountryCode: v.CountryCode,
  425. Email: v.Email,
  426. IsFake: 0,
  427. }
  428. addList = append(addList, &user)
  429. }
  430. }
  431. err = syncWhiteList(addList, 1)
  432. if err != nil {
  433. fmt.Println("新增白名单失败", err.Error())
  434. return
  435. }
  436. err = models.AddComeinWhiteUserMulti(list)
  437. if err != nil {
  438. fmt.Println("新增白名单失败,AddComeinWhiteUserMulti", err.Error())
  439. return
  440. }
  441. //拿联系人表,需要删除的
  442. needDelList, err := models.GetUserMobileNotFormal()
  443. if err != nil {
  444. fmt.Println("GetUserMobileFormal Err:", err.Error())
  445. return
  446. }
  447. delList := make([]*models.ComeinWhiteUser, 0)
  448. for _, v := range needDelList {
  449. if _, ok := syncedMap[v.Mobile+v.Email]; ok {
  450. user := models.ComeinWhiteUser{
  451. Mobile: v.Mobile,
  452. CountryCode: v.CountryCode,
  453. Email: v.Email,
  454. IsFake: 0,
  455. }
  456. delList = append(delList, &user)
  457. }
  458. }
  459. err = syncWhiteList(delList, 2)
  460. if err != nil {
  461. fmt.Println("删除白名单失败", err.Error())
  462. return
  463. }
  464. delIds := make([]int, 0)
  465. for _, v := range delList {
  466. delIds = append(delIds, v.UserId)
  467. }
  468. err = models.DelComeinWhiteUserMulti(delIds)
  469. if err != nil {
  470. fmt.Println("删除白名单失败,DelComeinWhiteUserMulti", err.Error())
  471. return
  472. }
  473. return
  474. }
  475. func syncWhiteList(list []*models.ComeinWhiteUser, opt int) (err error) {
  476. postUrl := utils.COMEIN_URL
  477. timestamp := fmt.Sprintf("%d", time.Now().UnixNano()/1e6)
  478. signature := GetSignature(strconv.Itoa(opt), timestamp)
  479. request := yb.SyncWhitelist{
  480. Opt: opt,
  481. Timestamp: timestamp,
  482. AppID: utils.COMEIN_WHITELIST_APPID,
  483. Signature: signature,
  484. }
  485. whiteList := make([]yb.Whitelist, 0)
  486. for _, v := range list {
  487. whiteUser := yb.Whitelist{}
  488. if v.Mobile != "" {
  489. whiteUser.Phone = v.Mobile
  490. whiteUser.Areacode = "+" + v.CountryCode
  491. whiteUser.Guid = utils.MD5(strconv.Itoa(v.UserId))
  492. whiteList = append(whiteList, whiteUser)
  493. } else if v.Email != "" {
  494. whiteUser.Email = v.Email
  495. whiteUser.Guid = utils.MD5(strconv.Itoa(v.UserId))
  496. whiteList = append(whiteList, whiteUser)
  497. }
  498. }
  499. request.Whitelist = whiteList
  500. jsonData, err := json.Marshal(request)
  501. if err != nil {
  502. return
  503. }
  504. headers := map[string]string{
  505. "app": "json",
  506. "mod": "channelopen",
  507. "act": "whitelist",
  508. }
  509. var respData EventListResp
  510. // 发起POST请求
  511. resp, err := utils.MakePostRequest(postUrl, jsonData, headers)
  512. if err != nil {
  513. utils.FileLog.Info("comein addWhitelist Err:", err.Error(), ";url:", postUrl)
  514. err = errors.New(respData.Errordesc)
  515. return
  516. }
  517. defer resp.Body.Close()
  518. body, err := ioutil.ReadAll(resp.Body)
  519. if err != nil {
  520. fmt.Println("reponse error", err)
  521. return
  522. }
  523. result := new(yb.ComeinResponse)
  524. err = json.Unmarshal(body, &result)
  525. if err != nil {
  526. fmt.Println("json.Unmarshal Err:" + err.Error())
  527. return
  528. }
  529. utils.FileLog.Info(fmt.Sprint("comein syncWhiteList Result", ";url:", postUrl, ";\nresponse:", string(body)))
  530. err = json.Unmarshal(body, &respData)
  531. if err != nil {
  532. utils.FileLog.Info("comein syncWhiteList Err:", err.Error(), ";url:", postUrl, ";response:", string(body))
  533. err = errors.New("Unmarshal Err:" + err.Error())
  534. return
  535. }
  536. if respData.Errorcode != "0" {
  537. utils.FileLog.Info("comein syncWhiteList Err:", err.Error(), ";url:", postUrl, ";response:", string(body))
  538. err = errors.New(respData.Errordesc)
  539. return
  540. }
  541. return
  542. }