mirror of
https://github.com/karust/openserp.git
synced 2026-08-05 16:53:54 +08:00
119 lines
2.6 KiB
Go
119 lines
2.6 KiB
Go
package baidu
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/karust/openserp/core"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func dateToTimestamp(date string) (int64, error) {
|
|
layout := "20060102"
|
|
t, err := time.Parse(layout, date)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return t.Unix(), nil
|
|
}
|
|
|
|
// BuildURL builds a Baidu web search URL from Query fields.
|
|
// It returns an error when query text, date, or pagination parameters are invalid.
|
|
func BuildURL(q core.Query) (string, error) {
|
|
base, _ := url.Parse("https://www.baidu.com/")
|
|
base.Path += "s"
|
|
|
|
params := url.Values{}
|
|
if q.Text != "" || q.Site != "" || q.Filetype != "" {
|
|
text := q.Text
|
|
if q.Site != "" {
|
|
text += " site:" + q.Site
|
|
}
|
|
if q.Filetype != "" {
|
|
text += " filetype:" + q.Filetype
|
|
}
|
|
params.Add("wd", text)
|
|
}
|
|
|
|
if q.DateInterval != "" {
|
|
dateInterval := strings.Split(q.DateInterval, "..")
|
|
|
|
ts1, err := dateToTimestamp(dateInterval[0])
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
ts2, err := dateToTimestamp(dateInterval[1])
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
params.Add("gpc", fmt.Sprintf("stf=%d,%d|stftype=2", ts1, ts2))
|
|
}
|
|
|
|
if q.LangCode != "" {
|
|
//params.Add("rqlang", q.LangCode)
|
|
logrus.Warn("Language search not supported")
|
|
}
|
|
|
|
if q.Filetype != "" {
|
|
//params.Add("ft", q.Filetype)
|
|
logrus.Warn("File search not supported")
|
|
}
|
|
|
|
if q.Limit != 0 {
|
|
params.Add("rn", strconv.Itoa(q.Limit))
|
|
}
|
|
if q.Start < 0 {
|
|
return "", errors.New("incorrect start provided")
|
|
}
|
|
if q.Start > 0 {
|
|
// Baidu uses "pn" as result offset for pagination.
|
|
params.Add("pn", strconv.Itoa(q.Start))
|
|
}
|
|
|
|
if len(params.Get("wd")) == 0 {
|
|
return "", errors.New("Empty query built")
|
|
}
|
|
|
|
params.Add("f", "8")
|
|
params.Add("ie", "utf-8")
|
|
base.RawQuery = params.Encode()
|
|
return base.String(), nil
|
|
}
|
|
|
|
// BuildImageURL builds a Baidu image search URL from Query fields and page
|
|
// index. It returns an error when the query text is empty.
|
|
func BuildImageURL(q core.Query, pageNum int) (string, error) {
|
|
base, _ := url.Parse("https://image.baidu.com/")
|
|
base.Path += "search/acjson"
|
|
|
|
params := url.Values{}
|
|
params.Add("tn", "resultjson_com")
|
|
params.Add("cl", "2") // Cl = 2 indicates image search
|
|
|
|
if q.Text != "" {
|
|
params.Add("word", q.Text)
|
|
}
|
|
|
|
if len(params.Get("word")) == 0 {
|
|
return "", errors.New("Empty query built")
|
|
}
|
|
|
|
if q.Limit != 0 {
|
|
params.Add("rn", "30") // Results per page
|
|
params.Add("pn", strconv.Itoa(pageNum*30)) // Offset
|
|
}
|
|
|
|
params.Add("fp", "result")
|
|
params.Add("ipn", "rj")
|
|
params.Add("ie", "utf-8")
|
|
params.Add("oe", "utf-8")
|
|
base.RawQuery = params.Encode()
|
|
return base.String(), nil
|
|
}
|