From 524665f95b1c22f608376641b0be9d5a49e578d1 Mon Sep 17 00:00:00 2001 From: azimut Date: Wed, 1 Sep 2021 07:33:03 -0300 Subject: [PATCH] fetch and parse --- cmd/twitterview/main.go | 14 +++++++++----- internal/fetch/fetch.go | 2 +- internal/twitter/tweet.go | 24 ++++++++++++++++++++---- internal/twitter/validate.go | 22 ++++++++++++++++++++++ 4 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 internal/twitter/validate.go diff --git a/cmd/twitterview/main.go b/cmd/twitterview/main.go index 91874e8..ad80910 100644 --- a/cmd/twitterview/main.go +++ b/cmd/twitterview/main.go @@ -16,11 +16,12 @@ type options struct { } var opt options +var url string func init() { - flag.StringVar(&opt.userAgent, "A", "CliView/0.1", "default User-Agent sent") - flag.DurationVar(&opt.timeout, "t", time.Second*5, "timeout in seconds") flag.IntVar(&opt.width, "w", 0, "fixed with, defaults to console width") + flag.StringVar(&opt.userAgent, "A", "Wget", "default User-Agent sent") + flag.DurationVar(&opt.timeout, "t", time.Second*5, "timeout in seconds") } func usage() { @@ -31,7 +32,10 @@ func usage() { func main() { flag.Parse() flag.Usage = usage - t := twitter.Tweet{} - t.GetHeader("what is this") - println("HELP ME") + url = "https://twitter.com/vickyguareschi/status/1432922904556146691" + res, err := twitter.Fetch(url, opt.userAgent, opt.timeout) + if err != nil { + panic(err) + } + fmt.Println(res) } diff --git a/internal/fetch/fetch.go b/internal/fetch/fetch.go index 56b64da..727c2a3 100644 --- a/internal/fetch/fetch.go +++ b/internal/fetch/fetch.go @@ -22,7 +22,6 @@ func getResponse(req *http.Request, timeout time.Duration) (*http.Response, erro if err != nil { return nil, err } - defer resp.Body.Close() return resp, nil } @@ -33,6 +32,7 @@ func handleResponse(resp *http.Response) (string, error) { if b, err := ioutil.ReadAll(resp.Body); err == nil { return string(b), nil } + defer resp.Body.Close() return "", fmt.Errorf("no body read") } diff --git a/internal/twitter/tweet.go b/internal/twitter/tweet.go index 920c69b..ef7aa4c 100644 --- a/internal/twitter/tweet.go +++ b/internal/twitter/tweet.go @@ -1,8 +1,24 @@ package twitter -type Tweet struct { -} +import ( + "encoding/json" + "time" + + "github.com/azimut/cli-view/internal/fetch" +) -func (t Tweet) GetHeader(url string) { - println(url) +func Fetch(url, ua string, timeout time.Duration) (tweet *Embedded, err error) { + url, err = EffectiveUrl(url) + if err != nil { + return nil, err + } + res, err := fetch.Fetch(url, ua, timeout) + if err != nil { + return nil, err + } + b := []byte(res) + if err != json.Unmarshal(b, &tweet) { + return nil, err + } + return } diff --git a/internal/twitter/validate.go b/internal/twitter/validate.go new file mode 100644 index 0000000..e3d8d7a --- /dev/null +++ b/internal/twitter/validate.go @@ -0,0 +1,22 @@ +package twitter + +import ( + "errors" + "net/url" +) + +const prefix = "https://publish.twitter.com/oembed?url=" + +func EffectiveUrl(rawUrl string) (string, error) { + uri, err := url.Parse(rawUrl) + if err != nil { + return "", err + } + if uri.Host == "m.twitter.com" || uri.Host == "mobile.twitter.com" { + uri.Host = "twitter.com" + } + if uri.Host != "twitter.com" { + return "", errors.New("invalid hostname") + } + return prefix + uri.String(), nil +}