156 lines
3.7 KiB
Go
156 lines
3.7 KiB
Go
package models
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/beego/beego/v2/client/httplib"
|
|
)
|
|
|
|
type Asset struct {
|
|
Nickname string
|
|
Bean struct {
|
|
Total int
|
|
TodayIn int
|
|
TodayOut int
|
|
YestodayIn int
|
|
YestodayOut int
|
|
MonthIn int
|
|
MonthOut int
|
|
ToExpire []int
|
|
}
|
|
RedPacket struct {
|
|
Total float64
|
|
ToExpire float64
|
|
ToExpireJd float64
|
|
ToExpireJx float64
|
|
ToExpireJs float64
|
|
}
|
|
}
|
|
|
|
var Int = func(s string) int {
|
|
i, _ := strconv.Atoi(s)
|
|
return i
|
|
}
|
|
|
|
func DailyAssetsPush() {
|
|
for _, ck := range GetJdCookies() {
|
|
if (ck.QQ != 0 && Config.QQID != 0 && SendQQ != nil) || ck.PushPlus != "" {
|
|
msg := ""
|
|
for _, task := range Config.Tasks {
|
|
if task.Word == "查询" {
|
|
task.Envs = []Env{{
|
|
Name: "pins",
|
|
Value: ck.PtPin,
|
|
}}
|
|
msg = runTask(&task)
|
|
break
|
|
}
|
|
}
|
|
if ck.QQ != 0 && Config.QQID != 0 && SendQQ != nil {
|
|
SendQQ(int64(ck.QQ), msg)
|
|
}
|
|
if ck.PushPlus != "" {
|
|
pushPlus(ck.PushPlus, msg)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (ck *JdCookie) Query() string {
|
|
msgs := []string{}
|
|
asset := Asset{}
|
|
if CookieOK(ck) {
|
|
today := time.Now().Local().Format("2006-01-02")
|
|
yestoday := time.Now().Local().Add(-time.Hour * 24).Format("2006-01-02")
|
|
month := time.Now().Local().Format("2006-01")
|
|
page := 1
|
|
end := false
|
|
for {
|
|
if end {
|
|
break
|
|
}
|
|
bds := getJingBeanBalanceDetail(page, fmt.Sprintf("pt_key=%s;pt_pin=%s;", ck.PtKey, ck.PtPin))
|
|
if bds == nil {
|
|
end = true
|
|
break
|
|
}
|
|
for _, bd := range bds {
|
|
amount := Int(bd.Amount)
|
|
if !strings.Contains(bd.Date, month) {
|
|
end = true
|
|
break
|
|
}
|
|
if amount > 0 {
|
|
asset.Bean.MonthIn += amount
|
|
} else {
|
|
asset.Bean.MonthOut += -amount
|
|
}
|
|
if strings.Contains(bd.Date, today) {
|
|
if amount > 0 {
|
|
asset.Bean.TodayIn += amount
|
|
} else {
|
|
asset.Bean.TodayOut += -amount
|
|
}
|
|
}
|
|
if strings.Contains(bd.Date, yestoday) {
|
|
if amount > 0 {
|
|
asset.Bean.YestodayIn += amount
|
|
} else {
|
|
asset.Bean.YestodayOut += -amount
|
|
}
|
|
}
|
|
}
|
|
page++
|
|
}
|
|
msgs = append(msgs, []string{
|
|
fmt.Sprintf("当月收入:%d京豆", asset.Bean.MonthIn),
|
|
fmt.Sprintf("当月支出:%d京豆", asset.Bean.MonthOut),
|
|
fmt.Sprintf("昨日收入:%d京豆", asset.Bean.YestodayIn),
|
|
fmt.Sprintf("昨日支出:%d京豆", asset.Bean.YestodayOut),
|
|
fmt.Sprintf("今日收入:%d京豆", asset.Bean.TodayIn),
|
|
fmt.Sprintf("今日支出:%d京豆", asset.Bean.TodayOut),
|
|
}...)
|
|
} else {
|
|
msgs = append(msgs, []string{
|
|
"提醒:该账号已过期,请重新登录",
|
|
}...)
|
|
}
|
|
ck.PtPin, _ = url.QueryUnescape(ck.PtPin)
|
|
return strings.Join(append([]string{
|
|
fmt.Sprintf("账号:%s", ck.PtPin),
|
|
fmt.Sprintf("昵称:%s", ck.Nickname),
|
|
fmt.Sprintf("备注:%s", ck.Note),
|
|
}, append(msgs, fmt.Sprintf("当前京豆:%v京豆", ck.BeanNum))...), "\n")
|
|
}
|
|
|
|
type BeanDetail struct {
|
|
Date string `json:"date"`
|
|
Amount string `json:"amount"`
|
|
EventMassage string `json:"eventMassage"`
|
|
}
|
|
|
|
func getJingBeanBalanceDetail(page int, cookie string) []BeanDetail {
|
|
type AutoGenerated struct {
|
|
Code string `json:"code"`
|
|
DetailList []BeanDetail `json:"detailList"`
|
|
}
|
|
a := AutoGenerated{}
|
|
req := httplib.Post(`https://api.m.jd.com/client.action?functionId=getJingBeanBalanceDetail`)
|
|
req.Header("User-Agent", ua)
|
|
req.Header("Host", "api.m.jd.com")
|
|
req.Header("Content-Type", "application/x-www-form-urlencoded")
|
|
req.Header("Cookie", cookie)
|
|
req.Body(fmt.Sprintf(`body={"pageSize": "20", "page": "%d"}&appid=ld`, page))
|
|
data, err := req.Bytes()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
json.Unmarshal(data, &a)
|
|
return a.DetailList
|
|
}
|