mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 21:02:25 +08:00
457 lines
14 KiB
Go
457 lines
14 KiB
Go
package operation
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/silenceper/wechat/v2/miniprogram/context"
|
|
"github.com/silenceper/wechat/v2/util"
|
|
)
|
|
|
|
const (
|
|
// getDomainInfoURL 查询域名配置
|
|
getDomainInfoURL = "https://api.weixin.qq.com/wxa/getwxadevinfo?access_token=%s"
|
|
// getPerformanceURL 获取性能数据
|
|
getPerformanceURL = "https://api.weixin.qq.com/wxaapi/log/get_performance?access_token=%s"
|
|
// getSceneListURL 获取访问来源
|
|
getSceneListURL = "https://api.weixin.qq.com/wxaapi/log/get_scene?access_token=%s"
|
|
// getVersionListURL 获取客户端版本
|
|
getVersionListURL = "https://api.weixin.qq.com/wxaapi/log/get_client_version?access_token=%s"
|
|
// realTimeLogSearchURL 查询实时日志
|
|
realTimeLogSearchURL = "https://api.weixin.qq.com/wxaapi/userlog/userlog_search?%s"
|
|
// getFeedbackListURL 获取用户反馈列表
|
|
getFeedbackListURL = "https://api.weixin.qq.com/wxaapi/feedback/list?%s"
|
|
// getJsErrDetailURL 查询js错误详情
|
|
getJsErrDetailURL = "https://api.weixin.qq.com/wxaapi/log/jserr_detail?access_token=%s"
|
|
// getJsErrListURL 查询错误列表
|
|
getJsErrListURL = "https://api.weixin.qq.com/wxaapi/log/jserr_list?access_token=%s"
|
|
// getGrayReleasePlanURL 获取分阶段发布详情
|
|
getGrayReleasePlanURL = "https://api.weixin.qq.com/wxa/getgrayreleaseplan?access_token=%s"
|
|
)
|
|
|
|
// Operation 运维中心
|
|
type Operation struct {
|
|
*context.Context
|
|
}
|
|
|
|
// NewOperation 实例化
|
|
func NewOperation(ctx *context.Context) *Operation {
|
|
return &Operation{ctx}
|
|
}
|
|
|
|
// GetDomainInfoRequest 查询域名配置请求
|
|
type GetDomainInfoRequest struct {
|
|
Action string `json:"action"`
|
|
}
|
|
|
|
// GetDomainInfoResponse 查询域名配置响应
|
|
type GetDomainInfoResponse struct {
|
|
util.CommonError
|
|
RequestDomain []string `json:"requestdomain"`
|
|
WsRequestDomain []string `json:"wsrequestdomain"`
|
|
UploadDomain []string `json:"uploaddomain"`
|
|
DownloadDomain []string `json:"downloaddomain"`
|
|
UDPDomain []string `json:"udpdomain"`
|
|
BizDomain []string `json:"bizdomain"`
|
|
}
|
|
|
|
// GetDomainInfo 查询域名配置
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/getDomainInfo.html
|
|
func (o *Operation) GetDomainInfo(req *GetDomainInfoRequest) (res GetDomainInfoResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
var response []byte
|
|
if response, err = util.PostJSON(fmt.Sprintf(getDomainInfoURL, accessToken), req); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "GetDomainInfo")
|
|
return
|
|
}
|
|
|
|
// GetPerformanceRequest 获取性能数据请求
|
|
type GetPerformanceRequest struct {
|
|
CostTimeType int64 `json:"cost_time_type"`
|
|
DefaultStartTime int64 `json:"default_start_time"`
|
|
DefaultEndTime int64 `json:"default_end_time"`
|
|
Device string `json:"device"`
|
|
IsDownloadCode string `json:"is_download_code"`
|
|
Scene string `json:"scene"`
|
|
NetworkType string `json:"networktype"`
|
|
}
|
|
|
|
// GetPerformanceResponse 获取性能数据响应
|
|
type GetPerformanceResponse struct {
|
|
util.CommonError
|
|
DefaultTimeData string `json:"default_time_data"`
|
|
CompareTimeData string `json:"compare_time_data"`
|
|
}
|
|
|
|
// PerformanceDefaultTimeData 查询数据
|
|
type PerformanceDefaultTimeData struct {
|
|
List []DefaultTimeDataItem `json:"list"`
|
|
}
|
|
|
|
// DefaultTimeDataItem 查询数据
|
|
type DefaultTimeDataItem struct {
|
|
RefData string `json:"ref_data"`
|
|
CostTimeType int64 `json:"cost_time_type"`
|
|
CostTime int64 `json:"cost_time"`
|
|
}
|
|
|
|
// GetPerformance 获取性能数据
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/getPerformance.html
|
|
func (o *Operation) GetPerformance(req *GetPerformanceRequest) (res GetPerformanceResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
var response []byte
|
|
if response, err = util.PostJSON(fmt.Sprintf(getPerformanceURL, accessToken), req); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "GetPerformance")
|
|
return
|
|
}
|
|
|
|
// GetSceneListResponse 获取访问来源响应
|
|
type GetSceneListResponse struct {
|
|
util.CommonError
|
|
Scene []Scene `json:"scene"`
|
|
}
|
|
|
|
// Scene 访问来源
|
|
type Scene struct {
|
|
Name string `json:"name"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
// GetSceneList 获取访问来源
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/getSceneList.html
|
|
func (o *Operation) GetSceneList() (res GetSceneListResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
var response []byte
|
|
if response, err = util.HTTPGet(fmt.Sprintf(getSceneListURL, accessToken)); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "GetSceneList")
|
|
return
|
|
}
|
|
|
|
// GetVersionListResponse 获取客户端版本响应
|
|
type GetVersionListResponse struct {
|
|
util.CommonError
|
|
CvList []ClientVersion `json:"cvlist"`
|
|
}
|
|
|
|
// ClientVersion 客户端版本
|
|
type ClientVersion struct {
|
|
Type int64 `json:"type"`
|
|
ClientVersionList []string `json:"client_version_list"`
|
|
}
|
|
|
|
// GetVersionList 获取客户端版本
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/getVersionList.html
|
|
func (o *Operation) GetVersionList() (res GetVersionListResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
var response []byte
|
|
if response, err = util.HTTPGet(fmt.Sprintf(getVersionListURL, accessToken)); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "GetVersionList")
|
|
return
|
|
}
|
|
|
|
// RealTimeLogSearchRequest 查询实时日志请求
|
|
type RealTimeLogSearchRequest struct {
|
|
Date string
|
|
BeginTime int64
|
|
EndTime int64
|
|
Start int64
|
|
Limit int64
|
|
Level int64
|
|
TraceID string
|
|
URL string
|
|
ID string
|
|
FilterMsg string
|
|
}
|
|
|
|
// RealTimeLogSearchResponse 查询实时日志响应
|
|
type RealTimeLogSearchResponse struct {
|
|
util.CommonError
|
|
Data RealTimeLogSearchData `json:"data"`
|
|
}
|
|
|
|
// RealTimeLogSearchData 日志数据和日志条数总量
|
|
type RealTimeLogSearchData struct {
|
|
List []RealTimeLogSearchDataList `json:"list"`
|
|
Total int64 `json:"total"`
|
|
}
|
|
|
|
// RealTimeLogSearchDataList 日志数据列表
|
|
type RealTimeLogSearchDataList struct {
|
|
Level int64 `json:"level"`
|
|
LibraryVersion string `json:"libraryVersion"`
|
|
ClientVersion string `json:"clientVersion"`
|
|
ID string `json:"id"`
|
|
Timestamp int64 `json:"timestamp"`
|
|
Platform int64 `json:"platform"`
|
|
URL string `json:"url"`
|
|
TraceID string `json:"traceid"`
|
|
FilterMsg string `json:"filterMsg"`
|
|
Msg []RealTimeLogSearchDataListMsg `json:"msg"`
|
|
}
|
|
|
|
// RealTimeLogSearchDataListMsg 日志内容数组
|
|
type RealTimeLogSearchDataListMsg struct {
|
|
Time int64 `json:"time"`
|
|
Level int64 `json:"level"`
|
|
Msg []string `json:"msg"`
|
|
}
|
|
|
|
// RealTimeLogSearch 查询实时日志
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/realtimelogSearch.html
|
|
func (o *Operation) RealTimeLogSearch(req *RealTimeLogSearchRequest) (res RealTimeLogSearchResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
|
|
params := map[string]interface{}{
|
|
"access_token": accessToken,
|
|
"date": req.Date,
|
|
"begintime": req.BeginTime,
|
|
"endtime": req.EndTime,
|
|
}
|
|
if req.Start > 0 {
|
|
params["start"] = req.Start
|
|
}
|
|
if req.Limit > 0 {
|
|
params["limit"] = req.Limit
|
|
}
|
|
if req.TraceID != "" {
|
|
params["traceId"] = req.TraceID
|
|
}
|
|
if req.URL != "" {
|
|
params["url"] = req.URL
|
|
}
|
|
if req.ID != "" {
|
|
params["id"] = req.ID
|
|
}
|
|
if req.FilterMsg != "" {
|
|
params["filterMsg"] = req.FilterMsg
|
|
}
|
|
if req.Level > 0 {
|
|
params["level"] = req.Level
|
|
}
|
|
query := util.Query(params)
|
|
|
|
var response []byte
|
|
if response, err = util.HTTPGet(fmt.Sprintf(realTimeLogSearchURL, query)); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "RealTimeLogSearch")
|
|
return
|
|
}
|
|
|
|
// GetFeedbackListRequest 获取用户反馈列表请求
|
|
type GetFeedbackListRequest struct {
|
|
Page int64
|
|
Num int64
|
|
Type int64
|
|
}
|
|
|
|
// GetFeedbackListResponse 获取用户反馈列表响应
|
|
type GetFeedbackListResponse struct {
|
|
util.CommonError
|
|
TotalNum int64 `json:"total_num"`
|
|
List []Feedback `json:"list"`
|
|
}
|
|
|
|
// Feedback 反馈列表
|
|
type Feedback struct {
|
|
RecordID int64 `json:"record_id"`
|
|
CreateTime int64 `json:"create_time"`
|
|
Content string `json:"content"`
|
|
Phone string `json:"phone"`
|
|
OpenID string `json:"openid"`
|
|
Nickname string `json:"nickname"`
|
|
HeadURL string `json:"head_url"`
|
|
Type int64 `json:"type"`
|
|
MediaIDS []string `json:"mediaIds"`
|
|
SystemInfo string `json:"systemInfo"`
|
|
}
|
|
|
|
// GetFeedbackList 获取用户反馈列表
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/getFeedback.html
|
|
func (o *Operation) GetFeedbackList(req *GetFeedbackListRequest) (res GetFeedbackListResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
|
|
params := map[string]interface{}{
|
|
"access_token": accessToken,
|
|
"page": req.Page,
|
|
"num": req.Num,
|
|
}
|
|
if req.Type > 0 {
|
|
params["type"] = req.Type
|
|
}
|
|
query := util.Query(params)
|
|
|
|
var response []byte
|
|
if response, err = util.HTTPGet(fmt.Sprintf(getFeedbackListURL, query)); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "GetFeedbackList")
|
|
return
|
|
}
|
|
|
|
// GetJsErrDetailRequest 查询js错误详情请求
|
|
type GetJsErrDetailRequest struct {
|
|
StartTime string `json:"startTime"`
|
|
EndTime string `json:"endTime"`
|
|
ErrorMsgMd5 string `json:"errorMsgMd5"`
|
|
ErrorStackMd5 string `json:"errorStackMd5"`
|
|
AppVersion string `json:"appVersion"`
|
|
SdkVersion string `json:"sdkVersion"`
|
|
OsName string `json:"osName"`
|
|
ClientVersion string `json:"clientVersion"`
|
|
OpenID string `json:"openid"`
|
|
Offset int64 `json:"offset"`
|
|
Limit int64 `json:"limit"`
|
|
Desc string `json:"desc"`
|
|
}
|
|
|
|
// GetJsErrDetailResponse 查询js错误详情响应
|
|
type GetJsErrDetailResponse struct {
|
|
util.CommonError
|
|
TotalCount int64 `json:"totalCount"`
|
|
OpenID string `json:"openid"`
|
|
Data []JsErrDetailData `json:"data"`
|
|
}
|
|
|
|
// JsErrDetailData 错误列表
|
|
type JsErrDetailData struct {
|
|
Count string `json:"Count"`
|
|
SdkVersion string `json:"sdkVersion"`
|
|
ClientVersion string `json:"ClientVersion"`
|
|
ErrorStackMd5 string `json:"errorStackMd5"`
|
|
TimeStamp string `json:"TimeStamp"`
|
|
AppVersion string `json:"appVersion"`
|
|
ErrorMsgMd5 string `json:"errorMsgMd5"`
|
|
ErrorMsg string `json:"errorMsg"`
|
|
ErrorStack string `json:"errorStack"`
|
|
Ds string `json:"Ds"`
|
|
OsName string `json:"OsName"`
|
|
OpenID string `json:"openId"`
|
|
PluginVersion string `json:"pluginversion"`
|
|
AppID string `json:"appId"`
|
|
DeviceModel string `json:"DeviceModel"`
|
|
Source string `json:"source"`
|
|
Route string `json:"route"`
|
|
Uin string `json:"Uin"`
|
|
Nickname string `json:"nickname"`
|
|
}
|
|
|
|
// GetJsErrDetail 查询js错误详情
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/getJsErrDetail.html
|
|
func (o *Operation) GetJsErrDetail(req *GetJsErrDetailRequest) (res GetJsErrDetailResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
var response []byte
|
|
if response, err = util.PostJSON(fmt.Sprintf(getJsErrDetailURL, accessToken), req); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "GetJsErrDetail")
|
|
return
|
|
}
|
|
|
|
// GetJsErrListRequest 查询错误列表请求
|
|
type GetJsErrListRequest struct {
|
|
AppVersion string `json:"appVersion"`
|
|
ErrType string `json:"errType"`
|
|
StartTime string `json:"startTime"`
|
|
EndTime string `json:"endTime"`
|
|
Keyword string `json:"keyword"`
|
|
OpenID string `json:"openid"`
|
|
OrderBy string `json:"orderby"`
|
|
Desc string `json:"desc"`
|
|
Offset int64 `json:"offset"`
|
|
Limit int64 `json:"limit"`
|
|
}
|
|
|
|
// GetJsErrListResponse 查询错误列表响应
|
|
type GetJsErrListResponse struct {
|
|
util.CommonError
|
|
TotalCount int64 `json:"totalCount"`
|
|
OpenID string `json:"openid"`
|
|
Data []JsErrListData `json:"data"`
|
|
}
|
|
|
|
// JsErrListData 错误列表
|
|
type JsErrListData struct {
|
|
ErrorMsgMd5 string `json:"errorMsgMd5"`
|
|
ErrorMsg string `json:"errorMsg"`
|
|
Uv int64 `json:"uv"`
|
|
Pv int64 `json:"pv"`
|
|
ErrorStackMd5 string `json:"errorStackMd5"`
|
|
ErrorStack string `json:"errorStack"`
|
|
PvPercent string `json:"pvPercent"`
|
|
UvPercent string `json:"uvPercent"`
|
|
}
|
|
|
|
// GetJsErrList 查询错误列表
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/getJsErrList.html
|
|
func (o *Operation) GetJsErrList(req *GetJsErrListRequest) (res GetJsErrListResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
var response []byte
|
|
if response, err = util.PostJSON(fmt.Sprintf(getJsErrListURL, accessToken), req); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "GetJsErrList")
|
|
return
|
|
}
|
|
|
|
// GetGrayReleasePlanResponse 获取分阶段发布详情响应
|
|
type GetGrayReleasePlanResponse struct {
|
|
util.CommonError
|
|
GrayReleasePlan GrayReleasePlanDetail `json:"gray_release_plan"`
|
|
}
|
|
|
|
// GrayReleasePlanDetail 分阶段发布计划详情
|
|
type GrayReleasePlanDetail struct {
|
|
Status int64 `json:"status"`
|
|
CreateTimestamp int64 `json:"create_timestamp"`
|
|
GrayPercentage int64 `json:"gray_percentage"`
|
|
SupportExperiencerFirst bool `json:"support_experiencer_first"`
|
|
SupportDebugerFirst bool `json:"support_debuger_first"`
|
|
}
|
|
|
|
// GetGrayReleasePlan 获取分阶段发布详情
|
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/operation/getGrayReleasePlan.html
|
|
func (o *Operation) GetGrayReleasePlan() (res GetGrayReleasePlanResponse, err error) {
|
|
var accessToken string
|
|
if accessToken, err = o.GetAccessToken(); err != nil {
|
|
return
|
|
}
|
|
var response []byte
|
|
if response, err = util.HTTPGet(fmt.Sprintf(getGrayReleasePlanURL, accessToken)); err != nil {
|
|
return
|
|
}
|
|
err = util.DecodeWithError(response, &res, "GetGrayReleasePlan")
|
|
return
|
|
}
|