2 Commits

Author SHA1 Message Date
eson
b9d931da68 feat(context): add Unmarshal json 2020-11-25 17:43:33 +08:00
eson
2623502cc8 feat(config): add retry and waitcapture property 2020-11-25 16:33:15 +08:00
4 changed files with 61 additions and 25 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
debug.test

23
callback.go Normal file
View File

@@ -0,0 +1,23 @@
package cwclient
import "encoding/json"
// Callback 发送代理连接获取内容后的回调函数
type Callback struct {
label string
hash string
Do func(cxt *CallbackContext)
}
// CallbackContext Callback上下文
type CallbackContext struct {
TaskID string
Content string
Error error
Carry interface{} // 传递的参数.
}
// ContentJSON 返回 json反序列化的对象
func (cxt *CallbackContext) ContentJSON(obj interface{}) error {
return json.Unmarshal([]byte(cxt.Content), obj)
}

View File

@@ -9,6 +9,7 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
"strconv"
"sync" "sync"
"time" "time"
@@ -20,21 +21,6 @@ func init() {
log.SetFlags(log.Llongfile | log.LstdFlags) log.SetFlags(log.Llongfile | log.LstdFlags)
} }
// CallbackContext Callback上下文
type CallbackContext struct {
TaskID string
Content string
Error error
Carry interface{} // 传递的参数.
}
// Callback 发送代理连接获取内容后的回调函数
type Callback struct {
label string
hash string
Do func(cxt *CallbackContext)
}
// Client 客户端 // Client 客户端
type Client struct { type Client struct {
chromeProxyAddr string chromeProxyAddr string
@@ -54,12 +40,36 @@ type Client struct {
type Label struct { type Label struct {
label string label string
conditionJS string conditionJS string
conditionlock sync.Mutex retry string
waitcapture string
configlock sync.Mutex
cli *Client cli *Client
} }
// GetWaitime Get return waitime int
func (l *Label) GetWaitime() int {
r, _ := strconv.Atoi(l.waitcapture)
return r
}
// SetWaitime Set waitime int
func (l *Label) SetWaitime(waitime int) {
l.waitcapture = strconv.Itoa(waitime)
}
// GetRetry Get return retry int
func (l *Label) GetRetry() int {
r, _ := strconv.Atoi(l.retry)
return r
}
// SetRetry Set retry int
func (l *Label) SetRetry(retry int) {
l.retry = strconv.Itoa(retry)
}
// GetHash 根据label获取hash路径 // GetHash 根据label获取hash路径
func (l *Label) GetHash(label string) string { func (l *Label) GetHash(label string) string {
if cb, ok := l.cli.register.Load(label); ok { if cb, ok := l.cli.register.Load(label); ok {
@@ -83,8 +93,8 @@ func (l *Label) Open(urlstr string, carray interface{}) (bodyRes string, ok bool
// SetContentCondition 设置识别到的内容条件. js代码. 必须是一个函数. 命名可以随意. 返回bool // SetContentCondition 设置识别到的内容条件. js代码. 必须是一个函数. 命名可以随意. 返回bool
func (l *Label) SetContentCondition(jsScript string) { func (l *Label) SetContentCondition(jsScript string) {
l.conditionlock.Lock() l.configlock.Lock()
defer l.conditionlock.Unlock() defer l.configlock.Unlock()
l.conditionJS = jsScript l.conditionJS = jsScript
} }
@@ -98,8 +108,8 @@ func (l *Label) SetContentConditionFromFile(jsScriptFile string) {
if err != nil { if err != nil {
panic(err) panic(err)
} }
l.conditionlock.Lock() l.configlock.Lock()
defer l.conditionlock.Unlock() defer l.configlock.Unlock()
// log.Println(string(data)) // log.Println(string(data))
l.conditionJS = string(data) l.conditionJS = string(data)
} }
@@ -132,7 +142,7 @@ func (cli *Client) Register(label string, callback func(cxt *CallbackContext)) *
} }
cli.register.Store(label, cb) cli.register.Store(label, cb)
cli.register.Store(cb.hash, cb) cli.register.Store(cb.hash, cb)
l := &Label{label: label, cli: cli} l := &Label{label: label, cli: cli, waitcapture: "6000", retry: "1"}
return l return l
} }
@@ -239,9 +249,11 @@ func (cli *Client) open(label *Label, urlstr string, carray interface{}) (bodyRe
} }
func() { func() {
label.conditionlock.Lock() label.configlock.Lock()
defer label.conditionlock.Unlock() defer label.configlock.Unlock()
data["content_condition"] = []string{label.conditionJS} data["content_condition"] = []string{label.conditionJS}
data["waitcapture"] = []string{label.waitcapture}
data["retry"] = []string{label.retry}
}() }()
resp, err := http.DefaultClient.PostForm(cli.chromeProxyAddr+"/task/put", data) resp, err := http.DefaultClient.PostForm(cli.chromeProxyAddr+"/task/put", data)

View File

@@ -20,7 +20,7 @@ func TestPort(t *testing.T) {
ltest.SetContentConditionFromFile("example.js") ltest.SetContentConditionFromFile("example.js")
cli.Connect() cli.Connect()
// log.Println(ltest.Open("https://playerduo.com/api/playerDuo-service-v2/rip113?lang=en&deviceType=browser", nil)) log.Println(ltest.Open("https://playerduo.com/api/playerDuo-service-v2/rip113?lang=en&deviceType=browser", nil))
// log.Println(ltest.Open("https://playerduo.com/api/playerDuo-service-v2/yanngu?lang=en&deviceType=browser", "213")) // log.Println(ltest.Open("https://playerduo.com/api/playerDuo-service-v2/yanngu?lang=en&deviceType=browser", "213"))
// log.Println(ltest.Open("https://playerduo.com/api/playerDuo-service-v2/rip113?lang=en&deviceType=browser")) // log.Println(ltest.Open("https://playerduo.com/api/playerDuo-service-v2/rip113?lang=en&deviceType=browser"))
// log.Println(ltest.Open("https://playerduo.com/api/playerDuo-service-v2/yanngu?lang=en&deviceType=browser")) // log.Println(ltest.Open("https://playerduo.com/api/playerDuo-service-v2/yanngu?lang=en&deviceType=browser"))