113 lines
2.2 KiB
Go
113 lines
2.2 KiB
Go
package nuapi
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"os/exec"
|
|
"path"
|
|
"strings"
|
|
|
|
"git.tordarus.net/tordarus/ezhttp"
|
|
"github.com/PuerkitoBio/goquery"
|
|
)
|
|
|
|
func (api *Api) GetWithCookie(ctx context.Context, url string) (*goquery.Document, error) {
|
|
if api.Cookie == "" {
|
|
return nil, ErrNoCookieSet.New()
|
|
}
|
|
|
|
curl := exec.Command("curl",
|
|
"-s", url,
|
|
"-H", fmt.Sprintf("User-Agent: %s", api.UserAgent),
|
|
"-H", fmt.Sprintf("Cookie: %s", api.Cookie),
|
|
"-H", fmt.Sprintf("Accept-Encoding: %s", "gzip"),
|
|
)
|
|
|
|
stdout, err := curl.StdoutPipe()
|
|
if err != nil {
|
|
return nil, ErrCurlRequestFailed.Wrap(err, url)
|
|
}
|
|
|
|
if err := curl.Start(); err != nil {
|
|
return nil, ErrCurlRequestFailed.Wrap(err, url)
|
|
}
|
|
defer curl.Wait()
|
|
|
|
r, err := gzip.NewReader(stdout)
|
|
if err != nil {
|
|
return nil, ErrInvalidGzipData.New(err)
|
|
}
|
|
|
|
return goquery.NewDocumentFromReader(r)
|
|
}
|
|
|
|
func (api *Api) Get(url string) (*goquery.Document, error) {
|
|
if api.Cookie == "" {
|
|
return nil, ErrNoCookieSet.New()
|
|
}
|
|
|
|
curl := exec.Command("curl",
|
|
"-s", url,
|
|
"-H", fmt.Sprintf("Cookie: %s", api.Cookie),
|
|
"-H", fmt.Sprintf("User-Agent: %s", api.UserAgent),
|
|
"-H", fmt.Sprintf("Accept-Encoding: %s", "gzip"),
|
|
)
|
|
|
|
stdout, err := curl.StdoutPipe()
|
|
if err != nil {
|
|
return nil, ErrCurlRequestFailed.Wrap(err, url)
|
|
}
|
|
|
|
if err := curl.Start(); err != nil {
|
|
return nil, ErrCurlRequestFailed.Wrap(err, url)
|
|
}
|
|
defer curl.Wait()
|
|
|
|
r, err := gzip.NewReader(stdout)
|
|
if err != nil {
|
|
return nil, ErrInvalidGzipData.Wrap(err)
|
|
}
|
|
|
|
return goquery.NewDocumentFromReader(r)
|
|
}
|
|
|
|
func (api *Api) ResolveExternalLink(link string) string {
|
|
if api.Cookie == "" {
|
|
return link
|
|
}
|
|
|
|
parsedLink, err := url.Parse(link)
|
|
if err != nil {
|
|
return link
|
|
}
|
|
|
|
if !strings.HasPrefix(path.Clean(parsedLink.Path), "/extnu/") {
|
|
return link
|
|
}
|
|
|
|
client := &http.Client{
|
|
CheckRedirect: func(req *http.Request, via []*http.Request) error {
|
|
return http.ErrUseLastResponse
|
|
},
|
|
}
|
|
|
|
req := ezhttp.Request(
|
|
ezhttp.URL(link),
|
|
ezhttp.AddHeaders(
|
|
"User-Agent", api.UserAgent,
|
|
"Cookie", api.Cookie,
|
|
),
|
|
)
|
|
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return link
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
return resp.Header.Get("Location")
|
|
}
|