Skip to content

Commit

Permalink
restruction, also update the key of sogou
Browse files Browse the repository at this point in the history
  • Loading branch information
xwjdsh committed Mar 21, 2019
1 parent ce69ec3 commit 860167c
Show file tree
Hide file tree
Showing 32 changed files with 735 additions and 1,183 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@
vendor/
fy
dist
/.idea
127 changes: 122 additions & 5 deletions bd/sign.go → baidu.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,131 @@
package bd
package fy

import (
"context"
"fmt"
"net/http"
"net/url"
"regexp"
"strings"

"github.com/robertkrimen/otto"
"github.com/tidwall/gjson"
)

const signJS = `
type baiduTranslator struct{}

var baidu translator = new(baiduTranslator)

func (*baiduTranslator) desc() (string, string) {
return "baiduTranslator", "https://fanyi.baiduTranslator.com/"
}

func BaiduTranslate(ctx context.Context, req Request) (resp *Response) {
return baidu.translate(ctx, req)
}

func (b *baiduTranslator) translate(ctx context.Context, req Request) (resp *Response) {
resp = newResp(b)

r, _, err := sendRequest(ctx, http.MethodGet, "https://www.baidu.com", nil, nil)
if err != nil {
resp.Err = fmt.Errorf("notReadResp error: %v", err)
return
}
cookies := r.Cookies()

r, _, err = sendRequest(ctx, http.MethodGet, "https://fanyi.baidu.com", nil, nil)
if err != nil {
resp.Err = fmt.Errorf("notReadResp error: %v", err)
return
}
fanyiCookies := r.Cookies()

param := url.Values{"query": {req.Text}}
detectUrl := "https://fanyi.baidu.com/langdetect"
body := strings.NewReader(param.Encode())
r, data, err := sendRequest(ctx, http.MethodPost, detectUrl, body, func(req *http.Request) error {
req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
return nil
})

jr := gjson.Parse(string(data))
if errorCode := jr.Get("error").Int(); errorCode != 0 {
resp.Err = fmt.Errorf("langdetect json result error is %d", errorCode)
return
}
from := jr.Get("lan").String()

r, data, err = sendRequest(ctx, http.MethodGet, "https://fanyi.baidu.com", nil, func(req *http.Request) error {
addCookies(req, cookies)
addCookies(req, fanyiCookies)
return nil
})
if err != nil {
err = fmt.Errorf("SendRequest error: %v", err)
return
}

token, gtk, err := b.tokenAndGtk(string(data))
if err != nil {
resp.Err = fmt.Errorf("getTokenAndGtk error: %v", err)
return
}
sign, err := b.sign(gtk, req.Text)
if err != nil {
resp.Err = fmt.Errorf("calSign error: %v", err)
return
}
req.ToLang = b.convertLanguage(req.ToLang)
param = url.Values{
"from": {from},
"to": {req.ToLang},
"query": {req.Text},
"sign": {sign},
"token": {token},
}
urlStr := "https://fanyi.baidu.com/v2transapi"
body = strings.NewReader(param.Encode())
_, data, err = sendRequest(ctx, "POST", urlStr, body, func(req *http.Request) error {
req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
addCookies(req, cookies)
addCookies(req, fanyiCookies)
return nil
})
if err != nil {
resp.Err = fmt.Errorf("sendRequest error: %v", err)
return
}

jr = gjson.Parse(string(data))
if errorCode := jr.Get("error").Int(); errorCode != 0 {
resp.Err = fmt.Errorf("json result error is %d", errorCode)
return
}

resp.Result = jr.Get("trans_result.data.0.dst").String()
return
}

func (*baiduTranslator) convertLanguage(language string) string {
l := language
switch language {
case Chinese:
l = "zh"
case Korean:
l = "kor"
case Japanese:
l = "jp"
case French:
l = "fra"
case Spanish:
l = "spa"
}

return l
}

const baiduSignJS = `
function a(r) {
if (Array.isArray(r)) {
for (var o = 0, t = Array(r.length); o < r.length; o++) t[o] = r[o];
Expand Down Expand Up @@ -49,15 +166,15 @@ const signJS = `
result = e(query)
`

func calSign(gtk, query string) (string, error) {
func (*baiduTranslator) sign(gtk, query string) (string, error) {
vm := otto.New()
if err := vm.Set("gtk", gtk); err != nil {
return "", fmt.Errorf("vm.Set gtk error: %v", err)
}
if err := vm.Set("query", query); err != nil {
return "", fmt.Errorf("vm.Set query error: %v", err)
}
value, err := vm.Run(signJS)
value, err := vm.Run(baiduSignJS)
if err != nil {
return "", fmt.Errorf("vm.Run error: %v", err)
}
Expand All @@ -68,7 +185,7 @@ func calSign(gtk, query string) (string, error) {
return result, nil
}

func getTokenAndGtk(dataStr string) (token, gtk string, err error) {
func (*baiduTranslator) tokenAndGtk(dataStr string) (token, gtk string, err error) {
tokenResult := regexp.MustCompile(`token: '(?P<token>\S+)',`).FindStringSubmatch(dataStr)
if len(tokenResult) != 2 {
err = fmt.Errorf("cannot get token")
Expand Down
32 changes: 32 additions & 0 deletions baidu_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package fy

import (
"context"
"testing"

"github.com/stretchr/testify/assert"
)

func TestBaiduTranslate(t *testing.T) {
{
resp := BaiduTranslate(context.Background(), Request{
ToLang: Chinese,
Text: "test",
})
assert.Nil(t, resp.Err)
expectedResp := newResp(baidu)
expectedResp.Result = "测试"
assert.Equal(t, expectedResp, resp)
}

{
resp := BaiduTranslate(context.Background(), Request{
ToLang: English,
Text: "测试",
})
assert.Nil(t, resp.Err)
expectedResp := newResp(baidu)
expectedResp.Result = "test"
assert.Equal(t, expectedResp, resp)
}
}
115 changes: 0 additions & 115 deletions bd/bd.go

This file was deleted.

59 changes: 0 additions & 59 deletions bd/bd_test.go

This file was deleted.

Loading

0 comments on commit 860167c

Please sign in to comment.