157 lines
4.0 KiB
Go
157 lines
4.0 KiB
Go
package api
|
||
|
||
import (
|
||
"bytes"
|
||
"crypto/md5"
|
||
"encoding/hex"
|
||
"fmt"
|
||
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
||
ctxLogger "github.com/luizsuper/ctxLoggers"
|
||
"go.uber.org/zap"
|
||
"io"
|
||
"io/ioutil"
|
||
"net/http"
|
||
"os"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
type DetailInfoUrls struct {
|
||
ID int `json:"id" gorm:"column:id"`
|
||
Image string `json:"image" gorm:"column:image"`
|
||
Cover string `json:"cover" gorm:"column:cover"`
|
||
Mycover string `json:"mycover" gorm:"column:mycover"`
|
||
Myimage string `json:"myimage" gorm:"column:myimage"`
|
||
Sid string `json:"sid" gorm:"column:sid"`
|
||
Sname string `json:"sname" gorm:"column:sname"`
|
||
Done int `json:"done" gorm:"column:done"`
|
||
ErrorInfo string `json:"errinfo" gorm:"column:errinfo"`
|
||
ErrorImage string `json:"errorimage" gorm:"column:errorimage"`
|
||
}
|
||
|
||
func (m *DetailInfoUrls) TableName() string {
|
||
return "detail_info_urls"
|
||
}
|
||
|
||
type Error struct {
|
||
Sid string `json:"sid" gorm:"column:sid"`
|
||
ID int `json:"id" gorm:"column:id"`
|
||
Url string `json:"url" gorm:"column:url"`
|
||
Type int `json:"type" gorm:"column:type"`
|
||
Msg string `json:"msg" gorm:"column:msg"`
|
||
CreateTime time.Time `json:"create_time" gorm:"column:create_time"`
|
||
}
|
||
|
||
func (m *Error) TableName() string {
|
||
return "error"
|
||
}
|
||
|
||
const EndPoint = `oss-cn-hangzhou.aliyuncs.com`
|
||
|
||
func s(name, url string) error {
|
||
// 创建OSSClient实例。
|
||
client, err := oss.New(EndPoint, "LTAI5tJHzAYoXL7ZNrZwKGoz", "QfL9kWUOMiswz7dk4PbTEy4jukm5YD")
|
||
if err != nil {
|
||
ctxLogger.Error(nil, "create oss client err", zap.String("err reason", err.Error()))
|
||
return err
|
||
}
|
||
|
||
// 获取存储空间。
|
||
bucket, err := client.Bucket("ganesh-pic")
|
||
if err != nil {
|
||
ctxLogger.Error(nil, "get bucket err", zap.String("err reason", err.Error()))
|
||
return err
|
||
}
|
||
|
||
picBytes, err := getPic(url)
|
||
if err != nil {
|
||
ctxLogger.Error(nil, "get bucket err", zap.String("err reason", err.Error()))
|
||
return err
|
||
}
|
||
|
||
err = bucket.PutObject(name, bytes.NewReader(picBytes))
|
||
if err != nil {
|
||
ctxLogger.Error(nil, "get bucket err", zap.String("err reason", err.Error()))
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func getPic(url string) ([]byte, error) {
|
||
client := &http.Client{}
|
||
req, err := http.NewRequest("GET", url, nil)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
resp, err := client.Do(req)
|
||
defer func(Body io.ReadCloser) {
|
||
err := Body.Close()
|
||
if err != nil {
|
||
ctxLogger.Error(nil, "net body close error", zap.String("errReason", err.Error()))
|
||
}
|
||
}(resp.Body)
|
||
return ioutil.ReadAll(resp.Body)
|
||
}
|
||
|
||
func k(start, end int) {
|
||
const (
|
||
coverSuffix = `wujian`
|
||
contentSuffix = `content`
|
||
coverType = 0
|
||
contentType = 1
|
||
other = 2
|
||
)
|
||
//错误次数,等于30退出程序
|
||
errNum := 0
|
||
//数据源
|
||
d := new([]DetailInfoUrls)
|
||
//给图片进行md5加密
|
||
md5Name := func(name string) string {
|
||
h := md5.New()
|
||
h.Write([]byte(name))
|
||
return hex.EncodeToString(h.Sum(nil))
|
||
}
|
||
//insetError
|
||
insertErr := func(sid, url, msg string, types int) {
|
||
DB.Create(&Error{
|
||
Sid: sid,
|
||
Url: url,
|
||
Type: types,
|
||
Msg: msg,
|
||
})
|
||
errNum++
|
||
}
|
||
if err := DB.Where("id >= ? and id <= ?", start, end).Find(d).Error; err != nil {
|
||
if errNum == 100 {
|
||
os.Exit(0)
|
||
}
|
||
insertErr("999", "", err.Error(), other)
|
||
}
|
||
for _, v := range *d {
|
||
myContent := ``
|
||
if errNum == 100 {
|
||
os.Exit(0)
|
||
}
|
||
md5Cover := md5Name(v.Sname + coverSuffix)
|
||
if err := s(md5Cover, v.Cover); err != nil {
|
||
insertErr(v.Sid, v.Cover, err.Error(), coverType)
|
||
}
|
||
if spilt := strings.Split(v.Image, `@`); len(spilt) != 0 {
|
||
for k, contentUrl := range spilt {
|
||
md5Content := md5Name(v.Sname + contentSuffix + strconv.Itoa(k))
|
||
if err := s(md5Content, contentUrl); err == nil {
|
||
myContent = fmt.Sprintf("%v%v@", myContent, md5Content)
|
||
} else {
|
||
insertErr(v.Sid, contentUrl, err.Error(), contentType)
|
||
}
|
||
}
|
||
v.Myimage = myContent
|
||
} else {
|
||
insertErr(v.Sid, v.Image, "split len ==0", other)
|
||
}
|
||
DB.Debug().Model(&v).Updates(DetailInfoUrls{Done: 1, Mycover: md5Cover, Myimage: string([]byte(myContent)[0 : len([]byte(myContent))-1])})
|
||
|
||
}
|
||
}
|