wechaty/go-wechaty

View on GitHub
wechaty-puppet/helper/fix_unknown_message.go

Summary

Maintainability
B
6 hrs
Test Coverage
F
0%
package helper

import (
    "encoding/xml"
    "fmt"
    logger "github.com/wechaty/go-wechaty/wechaty-puppet/log"
    "github.com/wechaty/go-wechaty/wechaty-puppet/schemas"
)

var log = logger.L.WithField("module", "wechaty-puppet/helper")

// FixUnknownMessage 修复wechaty服务端不能解析的消息,尝试服务端去解析
func FixUnknownMessage(payload *schemas.MessagePayload) {
    if payload.Type != schemas.MessageTypeUnknown {
        return
    }
    msg := &Msg{}
    err := xml.Unmarshal([]byte(payload.Text), msg)
    if err != nil {
        log.Errorf("FixUnknownMessage raw:%s || err: %s", payload.Text, err)
        return
    }
    if msg.Appmsg.Type.Text == "36" {
        payload.Type = schemas.MessageTypeMiniProgram
        payload.FixMiniApp = true
    }
}

// ParseMiniApp 解析小程序xml
func ParseMiniApp(payload *schemas.MessagePayload) (*schemas.MiniProgramPayload, error) {
    msg := &Msg{}
    err := xml.Unmarshal([]byte(payload.Text), msg)
    if err != nil {
        return nil, fmt.Errorf("ParseMiniApp raw:%s || err: %s", payload.Text, err)
    }
    if msg.Appmsg.Type.Text != "36" {
        return nil, fmt.Errorf("ParseMiniApp 不是小程序消息 xml type: %s", msg.Appmsg.Type.Text)
    }
    return &schemas.MiniProgramPayload{
        Appid:       msg.Appmsg.Weappinfo.Appid.Text,
        Description: "",
        PagePath:    msg.Appmsg.Weappinfo.Pagepath.Text,
        ThumbUrl:    msg.Appmsg.Appattach.Cdnthumburl.Text,
        Title:       msg.Appmsg.Title.Text,
        Username:    msg.Appmsg.Weappinfo.Username.Text,
        ThumbKey:    msg.Appmsg.Appattach.Cdnthumbaeskey.Text,
    }, nil
}

// Msg 小程序xml消息体
type Msg struct {
    XMLName xml.Name `xml:"msg"`
    Text    string   `xml:",chardata"`
    Appmsg  struct {
        Text   string `xml:",chardata"`
        Appid  string `xml:"appid,attr"`
        Sdkver string `xml:"sdkver,attr"`
        Title  struct {
            Text string `xml:",chardata"`
        } `xml:"title"`
        Des struct {
            Text string `xml:",chardata"`
        } `xml:"des"`
        Username struct {
            Text string `xml:",chardata"`
        } `xml:"username"`
        Action struct {
            Text string `xml:",chardata"`
        } `xml:"action"`
        Type struct {
            Text string `xml:",chardata"`
        } `xml:"type"`
        Showtype struct {
            Text string `xml:",chardata"`
        } `xml:"showtype"`
        Content struct {
            Text string `xml:",chardata"`
        } `xml:"content"`
        URL struct {
            Text string `xml:",chardata"`
        } `xml:"url"`
        Lowurl struct {
            Text string `xml:",chardata"`
        } `xml:"lowurl"`
        Dataurl struct {
            Text string `xml:",chardata"`
        } `xml:"dataurl"`
        Lowdataurl struct {
            Text string `xml:",chardata"`
        } `xml:"lowdataurl"`
        Contentattr struct {
            Text string `xml:",chardata"`
        } `xml:"contentattr"`
        Streamvideo struct {
            Text           string `xml:",chardata"`
            Streamvideourl struct {
                Text string `xml:",chardata"`
            } `xml:"streamvideourl"`
            Streamvideototaltime struct {
                Text string `xml:",chardata"`
            } `xml:"streamvideototaltime"`
            Streamvideotitle struct {
                Text string `xml:",chardata"`
            } `xml:"streamvideotitle"`
            Streamvideowording struct {
                Text string `xml:",chardata"`
            } `xml:"streamvideowording"`
            Streamvideoweburl struct {
                Text string `xml:",chardata"`
            } `xml:"streamvideoweburl"`
            Streamvideothumburl struct {
                Text string `xml:",chardata"`
            } `xml:"streamvideothumburl"`
            Streamvideoaduxinfo struct {
                Text string `xml:",chardata"`
            } `xml:"streamvideoaduxinfo"`
            Streamvideopublishid struct {
                Text string `xml:",chardata"`
            } `xml:"streamvideopublishid"`
        } `xml:"streamvideo"`
        CanvasPageItem struct {
            Text          string `xml:",chardata"`
            CanvasPageXml struct {
                Text string `xml:",chardata"`
            } `xml:"canvasPageXml"`
        } `xml:"canvasPageItem"`
        Appattach struct {
            Text     string `xml:",chardata"`
            Attachid struct {
                Text string `xml:",chardata"`
            } `xml:"attachid"`
            Cdnthumburl struct {
                Text string `xml:",chardata"`
            } `xml:"cdnthumburl"`
            Cdnthumbmd5 struct {
                Text string `xml:",chardata"`
            } `xml:"cdnthumbmd5"`
            Cdnthumblength struct {
                Text string `xml:",chardata"`
            } `xml:"cdnthumblength"`
            Cdnthumbheight struct {
                Text string `xml:",chardata"`
            } `xml:"cdnthumbheight"`
            Cdnthumbwidth struct {
                Text string `xml:",chardata"`
            } `xml:"cdnthumbwidth"`
            Cdnthumbaeskey struct {
                Text string `xml:",chardata"`
            } `xml:"cdnthumbaeskey"`
            Aeskey struct {
                Text string `xml:",chardata"`
            } `xml:"aeskey"`
            Encryver struct {
                Text string `xml:",chardata"`
            } `xml:"encryver"`
            Fileext struct {
                Text string `xml:",chardata"`
            } `xml:"fileext"`
            Islargefilemsg struct {
                Text string `xml:",chardata"`
            } `xml:"islargefilemsg"`
        } `xml:"appattach"`
        Extinfo struct {
            Text string `xml:",chardata"`
        } `xml:"extinfo"`
        Androidsource struct {
            Text string `xml:",chardata"`
        } `xml:"androidsource"`
        Thumburl struct {
            Text string `xml:",chardata"`
        } `xml:"thumburl"`
        Mediatagname struct {
            Text string `xml:",chardata"`
        } `xml:"mediatagname"`
        Messageaction struct {
            Text string `xml:",chardata"`
        } `xml:"messageaction"`
        Messageext struct {
            Text string `xml:",chardata"`
        } `xml:"messageext"`
        Emoticongift struct {
            Text        string `xml:",chardata"`
            Packageflag struct {
                Text string `xml:",chardata"`
            } `xml:"packageflag"`
            Packageid struct {
                Text string `xml:",chardata"`
            } `xml:"packageid"`
        } `xml:"emoticongift"`
        Emoticonshared struct {
            Text        string `xml:",chardata"`
            Packageflag struct {
                Text string `xml:",chardata"`
            } `xml:"packageflag"`
            Packageid struct {
                Text string `xml:",chardata"`
            } `xml:"packageid"`
        } `xml:"emoticonshared"`
        Designershared struct {
            Text        string `xml:",chardata"`
            Designeruin struct {
                Text string `xml:",chardata"`
            } `xml:"designeruin"`
            Designername struct {
                Text string `xml:",chardata"`
            } `xml:"designername"`
            Designerrediretcturl struct {
                Text string `xml:",chardata"`
            } `xml:"designerrediretcturl"`
        } `xml:"designershared"`
        Emotionpageshared struct {
            Text string `xml:",chardata"`
            Tid  struct {
                Text string `xml:",chardata"`
            } `xml:"tid"`
            Title struct {
                Text string `xml:",chardata"`
            } `xml:"title"`
            Desc struct {
                Text string `xml:",chardata"`
            } `xml:"desc"`
            IconUrl struct {
                Text string `xml:",chardata"`
            } `xml:"iconUrl"`
            SecondUrl struct {
                Text string `xml:",chardata"`
            } `xml:"secondUrl"`
            PageType struct {
                Text string `xml:",chardata"`
            } `xml:"pageType"`
        } `xml:"emotionpageshared"`
        Webviewshared struct {
            Text             string `xml:",chardata"`
            ShareUrlOriginal struct {
                Text string `xml:",chardata"`
            } `xml:"shareUrlOriginal"`
            ShareUrlOpen struct {
                Text string `xml:",chardata"`
            } `xml:"shareUrlOpen"`
            JsAppId struct {
                Text string `xml:",chardata"`
            } `xml:"jsAppId"`
            PublisherId struct {
                Text string `xml:",chardata"`
            } `xml:"publisherId"`
        } `xml:"webviewshared"`
        TemplateID struct {
            Text string `xml:",chardata"`
        } `xml:"template_id"`
        Md5 struct {
            Text string `xml:",chardata"`
        } `xml:"md5"`
        Weappinfo struct {
            Text     string `xml:",chardata"`
            Pagepath struct {
                Text string `xml:",chardata"`
            } `xml:"pagepath"`
            Username struct {
                Text string `xml:",chardata"`
            } `xml:"username"`
            Appid struct {
                Text string `xml:",chardata"`
            } `xml:"appid"`
            Version struct {
                Text string `xml:",chardata"`
            } `xml:"version"`
            Weappiconurl struct {
                Text string `xml:",chardata"`
            } `xml:"weappiconurl"`
            Appservicetype struct {
                Text string `xml:",chardata"`
            } `xml:"appservicetype"`
            Videopageinfo struct {
                Text       string `xml:",chardata"`
                Thumbwidth struct {
                    Text string `xml:",chardata"`
                } `xml:"thumbwidth"`
                Thumbheight struct {
                    Text string `xml:",chardata"`
                } `xml:"thumbheight"`
                Fromopensdk struct {
                    Text string `xml:",chardata"`
                } `xml:"fromopensdk"`
            } `xml:"videopageinfo"`
        } `xml:"weappinfo"`
        Statextstr struct {
            Text string `xml:",chardata"`
        } `xml:"statextstr"`
        FinderFeed struct {
            Text     string `xml:",chardata"`
            ObjectId struct {
                Text string `xml:",chardata"`
            } `xml:"objectId"`
            ObjectNonceId struct {
                Text string `xml:",chardata"`
            } `xml:"objectNonceId"`
            FeedType struct {
                Text string `xml:",chardata"`
            } `xml:"feedType"`
            Nickname struct {
                Text string `xml:",chardata"`
            } `xml:"nickname"`
            Username struct {
                Text string `xml:",chardata"`
            } `xml:"username"`
            Avatar struct {
                Text string `xml:",chardata"`
            } `xml:"avatar"`
            Desc struct {
                Text string `xml:",chardata"`
            } `xml:"desc"`
            MediaCount struct {
                Text string `xml:",chardata"`
            } `xml:"mediaCount"`
            LocalId struct {
                Text string `xml:",chardata"`
            } `xml:"localId"`
            MediaList struct {
                Text string `xml:",chardata"`
            } `xml:"mediaList"`
            MegaVideo struct {
                Text     string `xml:",chardata"`
                ObjectId struct {
                    Text string `xml:",chardata"`
                } `xml:"objectId"`
                ObjectNonceId struct {
                    Text string `xml:",chardata"`
                } `xml:"objectNonceId"`
            } `xml:"megaVideo"`
        } `xml:"finderFeed"`
        FinderLive struct {
            Text         string `xml:",chardata"`
            FinderLiveID struct {
                Text string `xml:",chardata"`
            } `xml:"finderLiveID"`
            FinderUsername struct {
                Text string `xml:",chardata"`
            } `xml:"finderUsername"`
            FinderObjectID struct {
                Text string `xml:",chardata"`
            } `xml:"finderObjectID"`
            Nickname struct {
                Text string `xml:",chardata"`
            } `xml:"nickname"`
            Desc struct {
                Text string `xml:",chardata"`
            } `xml:"desc"`
            FinderNonceID struct {
                Text string `xml:",chardata"`
            } `xml:"finderNonceID"`
            HeadUrl struct {
                Text string `xml:",chardata"`
            } `xml:"headUrl"`
            Media struct {
                Text     string `xml:",chardata"`
                CoverUrl struct {
                    Text string `xml:",chardata"`
                } `xml:"coverUrl"`
                Height struct {
                    Text string `xml:",chardata"`
                } `xml:"height"`
                Width struct {
                    Text string `xml:",chardata"`
                } `xml:"width"`
            } `xml:"media"`
            LiveStatus struct {
                Text string `xml:",chardata"`
            } `xml:"liveStatus"`
        } `xml:"finderLive"`
        FinderMegaVideo struct {
            Text     string `xml:",chardata"`
            ObjectId struct {
                Text string `xml:",chardata"`
            } `xml:"objectId"`
            ObjectNonceId struct {
                Text string `xml:",chardata"`
            } `xml:"objectNonceId"`
            Nickname struct {
                Text string `xml:",chardata"`
            } `xml:"nickname"`
            Avatar struct {
                Text string `xml:",chardata"`
            } `xml:"avatar"`
            Desc struct {
                Text string `xml:",chardata"`
            } `xml:"desc"`
            Username struct {
                Text string `xml:",chardata"`
            } `xml:"username"`
            MediaCount struct {
                Text string `xml:",chardata"`
            } `xml:"mediaCount"`
            MediaList struct {
                Text string `xml:",chardata"`
            } `xml:"mediaList"`
            FinderFeed struct {
                Text     string `xml:",chardata"`
                ObjectId struct {
                    Text string `xml:",chardata"`
                } `xml:"objectId"`
                ObjectNonceId struct {
                    Text string `xml:",chardata"`
                } `xml:"objectNonceId"`
            } `xml:"finderFeed"`
        } `xml:"finderMegaVideo"`
        Findernamecard struct {
            Text     string `xml:",chardata"`
            Username struct {
                Text string `xml:",chardata"`
            } `xml:"username"`
            Avatar struct {
                Text string `xml:",chardata"`
            } `xml:"avatar"`
            Nickname struct {
                Text string `xml:",chardata"`
            } `xml:"nickname"`
            AuthJob struct {
                Text string `xml:",chardata"`
            } `xml:"auth_job"`
            AuthIcon struct {
                Text string `xml:",chardata"`
            } `xml:"auth_icon"`
            AuthIconURL struct {
                Text string `xml:",chardata"`
            } `xml:"auth_icon_url"`
        } `xml:"findernamecard"`
        FinderTopic struct {
            Text  string `xml:",chardata"`
            Topic struct {
                Text string `xml:",chardata"`
            } `xml:"topic"`
            TopicType struct {
                Text string `xml:",chardata"`
            } `xml:"topicType"`
            IconUrl struct {
                Text string `xml:",chardata"`
            } `xml:"iconUrl"`
            Desc struct {
                Text string `xml:",chardata"`
            } `xml:"desc"`
            PatMusicId struct {
                Text string `xml:",chardata"`
            } `xml:"patMusicId"`
            Location struct {
                Text          string `xml:",chardata"`
                PoiClassifyId struct {
                    Text string `xml:",chardata"`
                } `xml:"poiClassifyId"`
                Longitude struct {
                    Text string `xml:",chardata"`
                } `xml:"longitude"`
                Latitude struct {
                    Text string `xml:",chardata"`
                } `xml:"latitude"`
            } `xml:"location"`
        } `xml:"finderTopic"`
        FinderColumn struct {
            Text   string `xml:",chardata"`
            CardId struct {
                Text string `xml:",chardata"`
            } `xml:"cardId"`
            Title struct {
                Text string `xml:",chardata"`
            } `xml:"title"`
            SecondTitle struct {
                Text string `xml:",chardata"`
            } `xml:"secondTitle"`
            IconUrl struct {
                Text string `xml:",chardata"`
            } `xml:"iconUrl"`
            IconUrl1 struct {
                Text string `xml:",chardata"`
            } `xml:"iconUrl_1"`
            IconUrl2 struct {
                Text string `xml:",chardata"`
            } `xml:"iconUrl_2"`
            IconUrl3 struct {
                Text string `xml:",chardata"`
            } `xml:"iconUrl_3"`
            Cardbuffer struct {
                Text string `xml:",chardata"`
            } `xml:"cardbuffer"`
        } `xml:"finderColumn"`
        FinderEndorsement struct {
            Text  string `xml:",chardata"`
            Scene struct {
                Text string `xml:",chardata"`
            } `xml:"scene"`
        } `xml:"finderEndorsement"`
        Directshare struct {
            Text string `xml:",chardata"`
        } `xml:"directshare"`
        Gamecenter struct {
            Text     string `xml:",chardata"`
            Namecard struct {
                Text    string `xml:",chardata"`
                IconUrl struct {
                    Text string `xml:",chardata"`
                } `xml:"iconUrl"`
                Name struct {
                    Text string `xml:",chardata"`
                } `xml:"name"`
                Desc struct {
                    Text string `xml:",chardata"`
                } `xml:"desc"`
                Tail struct {
                    Text string `xml:",chardata"`
                } `xml:"tail"`
                JumpUrl struct {
                    Text string `xml:",chardata"`
                } `xml:"jumpUrl"`
            } `xml:"namecard"`
        } `xml:"gamecenter"`
        PatMsg struct {
            Text     string `xml:",chardata"`
            ChatUser struct {
                Text string `xml:",chardata"`
            } `xml:"chatUser"`
            Records struct {
                Text      string `xml:",chardata"`
                RecordNum struct {
                    Text string `xml:",chardata"`
                } `xml:"recordNum"`
            } `xml:"records"`
        } `xml:"patMsg"`
        FinderLiveInvite struct {
            Text         string `xml:",chardata"`
            FinderLiveID struct {
                Text string `xml:",chardata"`
            } `xml:"finderLiveID"`
            FinderUsername struct {
                Text string `xml:",chardata"`
            } `xml:"finderUsername"`
            FinderObjectID struct {
                Text string `xml:",chardata"`
            } `xml:"finderObjectID"`
            Nickname struct {
                Text string `xml:",chardata"`
            } `xml:"nickname"`
            Desc struct {
                Text string `xml:",chardata"`
            } `xml:"desc"`
            FinderNonceID struct {
                Text string `xml:",chardata"`
            } `xml:"finderNonceID"`
            HeadUrl struct {
                Text string `xml:",chardata"`
            } `xml:"headUrl"`
            CoverUrl struct {
                Text string `xml:",chardata"`
            } `xml:"coverUrl"`
            LiveMicId struct {
                Text string `xml:",chardata"`
            } `xml:"liveMicId"`
            LiveMicSdkUserId struct {
                Text string `xml:",chardata"`
            } `xml:"liveMicSdkUserId"`
        } `xml:"finderLiveInvite"`
        Websearch struct {
            Text string `xml:",chardata"`
        } `xml:"websearch"`
    } `xml:"appmsg"`
    Fromusername struct {
        Text string `xml:",chardata"`
    } `xml:"fromusername"`
    Scene struct {
        Text string `xml:",chardata"`
    } `xml:"scene"`
    Appinfo struct {
        Text    string `xml:",chardata"`
        Version struct {
            Text string `xml:",chardata"`
        } `xml:"version"`
        Appname struct {
            Text string `xml:",chardata"`
        } `xml:"appname"`
    } `xml:"appinfo"`
    Commenturl struct {
        Text string `xml:",chardata"`
    } `xml:"commenturl"`
}