Skip to content

Commit

Permalink
update weibo
Browse files Browse the repository at this point in the history
  • Loading branch information
Sora233 committed Nov 3, 2021
1 parent 00a6693 commit 5e79fb5
Show file tree
Hide file tree
Showing 9 changed files with 523 additions and 9 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ require (
github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4
github.com/go-playground/validator/v10 v10.9.0 // indirect
github.com/golang/protobuf v1.5.2
github.com/guonaihong/gout v0.2.6
github.com/guonaihong/gout v0.2.9
github.com/hashicorp/golang-lru v0.5.4
github.com/json-iterator/go v1.1.12
github.com/jupp0r/go-priority-queue v0.0.0-20160601094913-ab1073853bde
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,8 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/guonaihong/gout v0.2.6 h1:B94Xf4QZTBh9husXH+tRKTGQXdzatyr0DktvESvW8zQ=
github.com/guonaihong/gout v0.2.6/go.mod h1:FdoeAbCloB9j6O4JHFuGl8Roxx6z3pV/VNxkR7k2pmc=
github.com/guonaihong/gout v0.2.9 h1:8nU5hrtwP1qDwiadFvU+D+z3ud9WEk8iPSfxQDiebng=
github.com/guonaihong/gout v0.2.9/go.mod h1:H1JqEuZmK4h/urWUq/LnIOEzS1kxl5rK3NkFqZ6Rn48=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
Expand Down
5 changes: 5 additions & 0 deletions lsp/weibo/concern.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package weibo

import "github.com/Logiase/MiraiGo-Template/utils"

var logger = utils.GetModuleLogger("weibo-concern")
153 changes: 151 additions & 2 deletions lsp/weibo/freshCookie.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,155 @@
package weibo

import (
"fmt"
"github.com/Sora233/DDBOT/proxy_pool"
"github.com/Sora233/DDBOT/requests"
"github.com/Sora233/DDBOT/utils"
"github.com/guonaihong/gout"
"github.com/sirupsen/logrus"
"net/http"
"net/http/cookiejar"
"net/url"
"regexp"
"strings"
"time"
)

const (
pathGenvisitor = "https://passport.weibo.com/visitor/genvisitor"
pathVisitor = "https://passport.weibo.com/visitor/visitor"
pathPassportGenvisitor = "https://passport.weibo.com/visitor/genvisitor"
pathPassportVisitor = "https://passport.weibo.com/visitor/visitor"
pathLoginVisitor = "https://login.sina.com.cn/visitor/visitor"
)

var (
genvisitorRegex = regexp.MustCompile(`\((.*)\)`)
)

func genvisitor(externalOpts ...requests.Option) (*GenVisitorResponse, error) {
st := time.Now()
defer func() {
ed := time.Now()
logger.WithField("FuncName", utils.FuncName()).Tracef("cost %v", ed.Sub(st))
}()
params := gout.H{
"cb": "gen_callback",
"fp": `{"os":"1","browser":"Gecko60,0,0,0","fonts":"undefined","screenInfo":"1536*864*24","plugins":""}`,
}
var opts = []requests.Option{
requests.ProxyOption(proxy_pool.PreferNone),
requests.AddUAOption(),
requests.TimeoutOption(time.Second * 10),
}
opts = append(opts, externalOpts...)
var result string
err := requests.Get(pathPassportGenvisitor, params, &result, opts...)
if err != nil {
return nil, err
}
submatch := genvisitorRegex.FindStringSubmatch(result)
if len(submatch) < 2 {
logger.Errorf("genvisitorRegex submatch not found")
return nil, fmt.Errorf("genvisitor response regex extract failed")
}
var resp = new(GenVisitorResponse)
err = json.Unmarshal([]byte(submatch[1]), resp)
if err != nil {
logger.WithField("Content", submatch[1]).Errorf("genvisitor data unmarshal error %v", err)
resp = nil
}
return resp, err
}

func passportVisitor(params gout.H, externalOpts ...requests.Option) (*VisitorIncarnateResponse, error) {
st := time.Now()
defer func() {
ed := time.Now()
logger.WithField("FuncName", utils.FuncName()).Tracef("cost %v", ed.Sub(st))
}()
var opts = []requests.Option{
requests.ProxyOption(proxy_pool.PreferNone),
requests.AddUAOption(),
requests.TimeoutOption(time.Second * 10),
}
opts = append(opts, externalOpts...)
var result string
err := requests.Get(pathPassportVisitor, params, &result, opts...)
if err != nil {
return nil, err
}
submatch := genvisitorRegex.FindStringSubmatch(result)
if len(submatch) < 2 {
logger.Errorf("passportVisitor submatch not found")
return nil, fmt.Errorf("passportVisitor response regex extract failed")
}
var resp = new(VisitorIncarnateResponse)
err = json.Unmarshal([]byte(submatch[1]), resp)
if err != nil {
logger.WithField("Content", submatch[1]).Errorf("passportVisitor data unmarshal error %v", err)
resp = nil
}
return resp, err
}

func FreshCookie() ([]*http.Cookie, error) {
jar, _ := cookiejar.New(nil)
genVisitorResp, err := genvisitor(requests.WithCookieJar(jar))
if err != nil {
logger.Errorf("genvisitor error %v", err)
return nil, err
}
if genVisitorResp.GetRetcode() != 20000000 || !strings.Contains(genVisitorResp.GetMsg(), "succ") {
logger.WithFields(logrus.Fields{
"Msg": genVisitorResp.GetMsg(),
"Retcode": genVisitorResp.GetRetcode(),
}).Errorf("incarnateResp error")
return nil, fmt.Errorf("genvisitor response error %v - %v",
genVisitorResp.GetRetcode(), genVisitorResp.GetMsg())
}

incarnateParams := gout.H{
"a": "incarnate",
"t": url.QueryEscape(genVisitorResp.GetData().GetTid()),
"gc": "",
"cb": "cross_domain",
"from": "weibo",
}
if genVisitorResp.GetData().GetNewTid() {
incarnateParams["w"] = "3"
} else {
incarnateParams["w"] = "2"
}
incarnateParams["c"] = fmt.Sprintf("%03d", genVisitorResp.GetData().GetConfidence())
incarnateResp, err := passportVisitor(incarnateParams, requests.WithCookieJar(jar))
if err != nil {
logger.Errorf("passportVisitor error %v", err)
return nil, err
}
if incarnateResp.GetRetcode() != 20000000 || !strings.Contains(incarnateResp.GetMsg(), "succ") {
logger.WithFields(logrus.Fields{
"Msg": incarnateResp.GetMsg(),
"Retcode": incarnateResp.GetRetcode(),
}).Errorf("incarnateResp error")
return nil, fmt.Errorf("passportVisitor response error %v - %v",
incarnateResp.GetRetcode(), incarnateResp.GetMsg())
}

crossdomainParams := gout.H{
"a": "crossdomain",
"cb": "return_back",
"s": incarnateResp.GetData().GetSub(),
"sp": incarnateResp.GetData().GetSubp(),
"from": "weibo",
}
err = requests.Get(pathLoginVisitor, crossdomainParams, nil, requests.WithCookieJar(jar))
if err != nil {
logger.Errorf("loginVisitor error %v", err)
return nil, err
}

cookieUrl, err := url.Parse(pathPassportVisitor)
if err != nil {
panic(fmt.Sprintf("path %v url parse error", pathPassportVisitor))
}
return jar.Cookies(cookieUrl), nil
}
12 changes: 12 additions & 0 deletions lsp/weibo/freshCookie_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package weibo

import (
"github.com/stretchr/testify/assert"
"testing"
)

func TestFreshCookie(t *testing.T) {
cookies, err := FreshCookie()
assert.Nil(t, err)
assert.NotEmpty(t, cookies)
}
7 changes: 7 additions & 0 deletions lsp/weibo/weibo.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package weibo

import (
jsoniter "github.com/json-iterator/go"
)

var json = jsoniter.ConfigCompatibleWithStandardLibrary
Loading

0 comments on commit 5e79fb5

Please sign in to comment.