123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package service
- import (
- "bufio"
- "bytes"
- "context"
- "crypto/hmac"
- "crypto/md5"
- "crypto/sha1"
- "encoding/base64"
- "encoding/hex"
- "fmt"
- "image/jpeg"
- "net/http"
- "strconv"
- "time"
- "go-common/library/log"
- "go-common/library/text/translate/chinese"
- "github.com/golang/freetype"
- )
- var (
- allOrders [][]int
- x = []int{0, 1, 2, 3}
- bname = "member"
- accessKey = "3d34b1ea1dbbb0ca"
- secretKey = "d4caa344f3b115e302033b05dd0aa4"
- _template = "%s\n%s\n%s\n%d\n"
- fileFormat = "v3_%s_A-%s_B-%s_C-%s_D-%s_%s"
- bfsURL = "http://bfs.bilibili.co/bfs/%s/%s"
- platform = map[string]bool{"H5": true, "PC": false}
- language = []string{"zh-CN", "zh-TW"}
- )
- // generate 全排列组合算法 4*3*2*1 种情况
- func (s *Service) generate(c context.Context, a []int, begin int, end int) {
- if begin == end {
- allOrders = append(allOrders, []int{a[0], a[1], a[2], a[3]})
- return
- }
- for i := begin; i <= end; i++ {
- a[begin], a[i] = a[i], a[begin]
- s.generate(c, a, begin+1, end)
- a[begin], a[i] = a[i], a[begin]
- }
- return
- }
- // GenerateImage .
- func (s *Service) GenerateImage(c context.Context) {
- // 把有效id放redis
- ids, _ := s.dao.IDsByState(c)
- s.CreateBFSImg(c, ids)
- }
- // CreateBFSImg .
- func (s *Service) CreateBFSImg(c context.Context, ids []int64) {
- for _, qid := range ids {
- log.Error("qid_%d", qid)
- que, err := s.dao.QueByID(c, qid)
- log.Error("que:%+v", que)
- if err != nil {
- log.Error("get question(%d), err(%v)", qid, err)
- }
- for _, langv := range language {
- if langv == "zh-TW" {
- que.Question = chinese.Convert(c, que.Question)
- que.Ans[0] = chinese.Convert(c, que.Ans[0])
- que.Ans[1] = chinese.Convert(c, que.Ans[1])
- que.Ans[2] = chinese.Convert(c, que.Ans[2])
- que.Ans[3] = chinese.Convert(c, que.Ans[3])
- }
- for plat, platv := range platform {
- for _, order := range allOrders {
- log.Error("allOrders(len:%d) %s_%s_%s_%s_%s_%s, %+v", len(allOrders), strconv.FormatInt(qid, 10), que.Ans[order[0]], que.Ans[order[1]], que.Ans[order[2]], que.Ans[order[3]], plat, que)
- quec := s.dao.QueConf(platv)
- imgh := s.dao.Height(quec, que.Question, len(que.Ans))
- r := s.dao.Board(imgh)
- imgc := s.dao.Context(r, s.c.Answer.FontFilePath)
- pt := freetype.Pt(0, int(quec.Fontsize))
- s.dao.DrawQue(imgc, que.Question, quec, &pt)
- as := [4]string{que.Ans[order[0]], que.Ans[order[1]], que.Ans[order[2]], que.Ans[order[3]]}
- s.dao.DrawAns(imgc, quec, as, &pt)
- buf := new(bytes.Buffer)
- jpeg.Encode(buf, r, nil)
- bufReader := bufio.NewReader(buf)
- ts := time.Now().Unix()
- tm := time.Unix(ts, 0)
- m := md5.New()
- m.Write([]byte(fmt.Sprintf(fileFormat, strconv.FormatInt(qid, 10), que.Ans[order[0]], que.Ans[order[1]], que.Ans[order[2]], que.Ans[order[3]], plat)))
- fname := hex.EncodeToString(m.Sum(nil)) + ".jpg"
- if s.c.Answer.Debug {
- fname = fmt.Sprintf("debug_%s", fname)
- }
- //imgName = append(imgName, fname)
- client := &http.Client{}
- content := fmt.Sprintf(_template, "PUT", bname, fname, ts)
- mac := hmac.New(sha1.New, []byte(secretKey))
- mac.Write([]byte(content))
- sign := base64.StdEncoding.EncodeToString(mac.Sum(nil))
- req, _ := http.NewRequest(http.MethodPut, fmt.Sprintf(bfsURL, bname, fname), bufReader)
- req.Host = "bfs.bilibili.co"
- req.Header.Add("Date", tm.Format("2006-01-02 03:04:05"))
- req.Header.Add("Authorization", accessKey+":"+sign+":"+strconv.FormatInt(ts, 10))
- req.Header.Set("Content-Type", "image/jpeg")
- resp, _ := client.Do(req)
- //defer resp.Body.Close()
- if err != nil {
- log.Error("qid %s bfs upload failed error(%s)", strconv.FormatInt(qid, 10), err)
- //return
- }
- log.Info("upload img(%d), %s, %+v", qid, fname, resp)
- time.Sleep(time.Millisecond * 50)
- }
- }
- }
- }
- }
|