scrape alerts from chase

master
bel 2020-04-02 22:14:10 +00:00
parent 205879fc3b
commit eead63ecb6
3 changed files with 36 additions and 14 deletions

View File

@ -1,6 +1,9 @@
package main package main
import "local/args" import (
"local/args"
"local/storage"
)
type Config struct { type Config struct {
EmailUser string EmailUser string
@ -8,8 +11,11 @@ type Config struct {
EmailIMAP string EmailIMAP string
TodoAddr string TodoAddr string
TodoPass string TodoPass string
Storage storage.DB
} }
var config Config
func NewConfig() Config { func NewConfig() Config {
as := args.NewArgSet() as := args.NewArgSet()
@ -18,15 +24,27 @@ func NewConfig() Config {
as.Append(args.STRING, "emailimap", "email imap", "imap.gmail.com:993") as.Append(args.STRING, "emailimap", "email imap", "imap.gmail.com:993")
as.Append(args.STRING, "todoaddr", "todo addr", "https://todo-server.remote.blapointe.com") as.Append(args.STRING, "todoaddr", "todo addr", "https://todo-server.remote.blapointe.com")
as.Append(args.STRING, "todopass", "todo pass", "gJtEXbbLHLf54yS9EdujtVN2n6Y") as.Append(args.STRING, "todopass", "todo pass", "gJtEXbbLHLf54yS9EdujtVN2n6Y")
as.Append(args.STRING, "store", "store type", "map")
as.Append(args.STRING, "storeaddr", "store addr", "/tmp/store")
as.Append(args.STRING, "storeuser", "store user", "")
as.Append(args.STRING, "storepass", "store pass", "")
if err := as.Parse(); err != nil { if err := as.Parse(); err != nil {
panic(err) panic(err)
} }
return Config{
storage, err := storage.New(storage.TypeFromString(as.GetString("store")), as.GetString("storeaddr"), as.GetString("storeuser"), as.GetString("storepass"))
if err != nil {
panic(err)
}
config = Config{
EmailUser: as.GetString("emailuser"), EmailUser: as.GetString("emailuser"),
EmailPass: as.GetString("emailpass"), EmailPass: as.GetString("emailpass"),
EmailIMAP: as.GetString("emailimap"), EmailIMAP: as.GetString("emailimap"),
TodoAddr: as.GetString("todoaddr"), TodoAddr: as.GetString("todoaddr"),
TodoPass: as.GetString("todopass"), TodoPass: as.GetString("todopass"),
Storage: storage,
} }
return config
} }

View File

@ -4,12 +4,9 @@ import (
"errors" "errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log"
"net/mail" "net/mail"
"regexp" "regexp"
"strings" "strings"
"github.com/google/uuid"
) )
type scraper interface { type scraper interface {
@ -32,7 +29,6 @@ func buildScraper(m *mail.Message) (scraper, error) {
if !containsAny(subject, "transaction", "report", "Transaction") { if !containsAny(subject, "transaction", "report", "Transaction") {
return nil, errors.New("cannot build scraper for subject " + subject) return nil, errors.New("cannot build scraper for subject " + subject)
} }
log.Printf("%+v", m.Header)
from := fmt.Sprint(m.Header["From"]) from := fmt.Sprint(m.Header["From"])
if strings.Contains(from, "Chase") { if strings.Contains(from, "Chase") {
return newChaseScraper(), nil return newChaseScraper(), nil
@ -81,13 +77,7 @@ func (c *chaseScraper) scrape(m *mail.Message) ([]*Transaction, error) {
} }
transactions := make([]*Transaction, len(results["amount"])) transactions := make([]*Transaction, len(results["amount"]))
for i := range results["amount"] { for i := range results["amount"] {
transactions[i] = &Transaction{ transactions[i] = NewTransaction(results["amount"][i], results["account"][i], fmt.Sprint(m.Header["Date"]), Chase)
Amount: results["amount"][i],
Account: results["account"][i],
Bank: Chase,
Date: fmt.Sprint(m.Header["Date"]),
ID: uuid.New().String(), // TODO random based on date, amount, account, and bank so find dupes
}
} }
return transactions, nil return transactions, nil
} }

View File

@ -1,6 +1,9 @@
package main package main
import "fmt" import (
"crypto/md5"
"fmt"
)
type Transaction struct { type Transaction struct {
ID string ID string
@ -13,3 +16,14 @@ type Transaction struct {
func (t *Transaction) String() string { func (t *Transaction) String() string {
return fmt.Sprint(*t) return fmt.Sprint(*t)
} }
func NewTransaction(amount, account, date string, bank Bank) *Transaction {
t := &Transaction{
Amount: amount,
Account: account,
Bank: bank,
Date: date,
}
t.ID = fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprint(t))))
return t
}