summaryrefslogtreecommitdiff
path: root/flatbot.go
diff options
context:
space:
mode:
authorDmitry Ilvokhin <d@ilvokhin.com>2025-03-01 20:10:26 +0000
committerDmitry Ilvokhin <d@ilvokhin.com>2025-03-02 21:58:24 +0000
commit96bcc15d6e3e820309c874fe39df11cb88b30af2 (patch)
tree1674002cc4378c5d077c0fe4ca239dd3c4ef9ab0 /flatbot.go
parent602dcb4ec617634d1fed182ac0309123992e43c6 (diff)
downloadflatbot-96bcc15d6e3e820309c874fe39df11cb88b30af2.tar.gz
flatbot-96bcc15d6e3e820309c874fe39df11cb88b30af2.tar.bz2
flatbot-96bcc15d6e3e820309c874fe39df11cb88b30af2.zip
Split logic to multiple files
Diffstat (limited to 'flatbot.go')
-rw-r--r--flatbot.go79
1 files changed, 6 insertions, 73 deletions
diff --git a/flatbot.go b/flatbot.go
index ba76595..3cb052f 100644
--- a/flatbot.go
+++ b/flatbot.go
@@ -1,15 +1,10 @@
package main
import (
- "bytes"
- "errors"
"fmt"
"io"
"log"
"net/http"
- "strings"
-
- "golang.org/x/net/html"
)
func main() {
@@ -22,7 +17,13 @@ func main() {
if err != nil {
log.Fatal(err)
}
+ sent, err := readSent("sent/sent.json")
+ if err != nil {
+ log.Fatal(err)
+ }
+ flats = removeAlreadySent(flats, sent)
fmt.Println(flats)
+ writeSent(flats, "/tmp/sent.json")
}
func fetch(url string) ([]byte, error) {
@@ -41,71 +42,3 @@ func fetch(url string) ([]byte, error) {
}
return body, nil
}
-
-type flat struct {
- URL string
- Price string
-}
-
-func parse(body []byte) ([]flat, error) {
- doc, err := html.Parse(bytes.NewReader(body))
- if err != nil {
- return make([]flat, 0), err
- }
- flats := make([]flat, 0)
- for _, n := range findNodes(doc) {
- flat, err := parseNode(n)
- if err != nil {
- continue
- }
- flats = append(flats, flat)
- }
- return flats, nil
-}
-
-func findNodes(root *html.Node) []*html.Node {
- flats := make([]*html.Node, 0)
- for n := range root.Descendants() {
- if n.Type != html.ElementNode {
- continue
- }
- if n.Data != "a" {
- continue
- }
- attr := matchAttr(n, "data-testid")
- if attr == nil || attr.Val != "property-price" {
- continue
- }
- flats = append(flats, n)
- }
- return flats
-}
-
-func matchAttr(n *html.Node, key string) *html.Attribute {
- for _, attr := range n.Attr {
- if attr.Key == key {
- return &attr
- }
- }
- return nil
-}
-
-func parseNode(root *html.Node) (flat, error) {
- url := matchAttr(root, "href")
- if url == nil {
- return flat{}, errors.New("Couldn't find URL")
- }
- f := flat{URL: makeURL(url.Val), Price: ""}
- for n := range root.Descendants() {
- if price, found := strings.CutSuffix(n.Data, " pcm"); found {
- f.Price = price
- return f, nil
- }
- }
- return flat{}, errors.New("Couldn't find price")
-}
-
-func makeURL(path string) string {
- prettySuffix, _ := strings.CutSuffix(path, "/?channel=RES_LET")
- return fmt.Sprintf("https://rightmove.co.uk%v", prettySuffix)
-}