diff --git a/scrape.go b/scrape.go index dd30169..97ddf62 100755 --- a/scrape.go +++ b/scrape.go @@ -280,7 +280,13 @@ func (c *bankOfAmericaScraper) scrapeCharge(m *mail.Message) ([]*Transaction, er if err != nil { return nil, err } + if v, err := c.scrapeCharge2023(m, b); err == nil { + return v, nil + } + return c.scrapeCharge2024(m, b) +} +func (c *bankOfAmericaScraper) scrapeCharge2023(m *mail.Message, b []byte) ([]*Transaction, error) { amount := findFloatAfter(b, "Amount: $") acc := string(findLineAfter(b, "Where: ")) @@ -291,6 +297,31 @@ func (c *bankOfAmericaScraper) scrapeCharge(m *mail.Message) ([]*Transaction, er return []*Transaction{transaction}, nil } +func (c *bankOfAmericaScraper) scrapeCharge2024(m *mail.Message, b []byte) ([]*Transaction, error) { + amountPattern := `Amount:[^\$]*\$([0-9]*\.[0-9]*)` + amountMatches := regexp.MustCompile(amountPattern).FindSubmatch(bytes.ReplaceAll(b, []byte("\n"), []byte(" "))) + if len(amountMatches) < 2 { + return nil, fmt.Errorf("email does not match amount %q: %+v", amountPattern, amountMatches) + } + amount := string(amountMatches[1]) + + b2 := bytes.Split(b, []byte("Where:"))[1] + b3 := bytes.Split(b2, []byte(""))[0] + b4 := bytes.ReplaceAll(b3, []byte("\n"), []byte(" ")) + accPattern := `(.*)` + accMatches := regexp.MustCompile(accPattern).FindSubmatch(b4) + if len(accMatches) < 2 { + return nil, fmt.Errorf("email does not match acc %q", accPattern) + } + acc := string(accMatches[1]) + + if amount == "" || acc == "" { + return nil, errors.New("no amount/account found") + } + transaction := NewTransaction(BankOfAmerica.String(), amount, acc, fmt.Sprint(m.Header["Date"]), BankOfAmerica) + return []*Transaction{transaction}, nil +} + func (c *bankOfAmericaScraper) scrapePayment(m *mail.Message) ([]*Transaction, error) { b, err := ioutil.ReadAll(m.Body) if err != nil { diff --git a/scrape_test.go b/scrape_test.go index 5667531..342ab87 100644 --- a/scrape_test.go +++ b/scrape_test.go @@ -249,6 +249,41 @@ func TestScrapeFidelityWithdrawal(t *testing.T) { } } +func TestScrapeBofACharge2024(t *testing.T) { + b, err := ioutil.ReadFile("./testdata/bofa.charge.2024.txt") + if err != nil { + t.Fatal(err) + } + message := &mail.Message{ + Header: map[string][]string{ + "Subject": []string{"Credit card transaction exceeds alert limit you set"}, + }, + Body: bytes.NewReader(b), + } + bofa := &bankOfAmericaScraper{} + + gots, err := bofa.scrape(message) + if err != nil { + t.Fatal(err) + } + + if len(gots) != 1 { + t.Fatal(len(gots)) + } + got := gots[0] + want := Transaction{ + ID: got.ID, + Bank: BankOfAmerica, + Amount: "21.48", + Vendor: "PP SPOTIFYUSAI", + Date: "[]", + Account: BankOfAmerica.String(), + } + if *got != want { + t.Fatalf("want:\n\t%+v, got\n\t%+v", want, *got) + } +} + func TestScrapeBofACharge(t *testing.T) { b, err := ioutil.ReadFile("./testdata/bofa.charge.txt") if err != nil { diff --git a/testdata/bofa.charge.2024.txt b/testdata/bofa.charge.2024.txt new file mode 100644 index 0000000..db86ced --- /dev/null +++ b/testdata/bofa.charge.2024.txt @@ -0,0 +1,623 @@ +Delivered-To: breellocaldev@gmail.com +Received: by 2002:a05:6e04:410a:b0:337:e209:a6dd with SMTP id ab10csp997577imd; + Fri, 22 Nov 2024 03:21:45 -0800 (PST) +X-Google-Smtp-Source: AGHT+IF+g6ycRXBD1NCmTgCmYsdR7EaUiTrr6m4TjY81halMm8PMqQPaIVPGdqeuLn6MScBOpgIL +X-Received: by 2002:a05:6214:d6e:b0:6d4:2b2:61f9 with SMTP id 6a1803df08f44-6d442336b62mr127197466d6.5.1732274505767; + Fri, 22 Nov 2024 03:21:45 -0800 (PST) +ARC-Seal: i=1; a=rsa-sha256; t=1732274505; cv=none; + d=google.com; s=arc-20240605; + b=DOWQaaaBxJOxTAbGlmwXcxHxVYcT2JoZRrYDY1ybcxQmvEhuXA2mDLI4sbePTHa1X+ + NLEh/hvBkwfwQe0b7554tIaTF3Q/7MBsZKRttc41JcgnbsApiznFn5ncGJ5/vuPTMAG9 + 8/oBvgNLjgJ8R7yUBSYNR0zlPeaN69okV59DJ2FYjIxvKCbuaM/aeJ7qQtrrvIcG0Oyi + YRRcw8l4pkenP9fzHo9MmupYS3YJP5YVE0DaIFxA9y1jFkpxN4rGGHl2VPrGUezWBIGJ + owxLJNzKwHjzq2cfKvko3BftaBdDVVWetHsHUd5TISPnLYQkfdvctN4SOH9q9JXl0l9T + 7xTQ== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; + h=content-transfer-encoding:feedback-id:message-id:reply-to + :mime-version:list-help:date:subject:to:from:dkim-signature + :dkim-signature; + bh=Kjcf8l3mYIkPtkdpXpj0inhpY0YdNBqkJohGWf3viHk=; + fh=3JUHTSQLTIIxQd8AswL6O34TjQIBrZ4ZoXgEKtTs4Cc=; + b=k9x6eOqDsHMK/3BHdWV57glqBDel/EtRixV/w6OsUGH0p4Q9Uhc9TFsHFn1vdChlcr + bQnuBKWU8/TM6Z8fb3VdjMX6kQ9dtuFJbGlBdDX5iUuUNGwLytLeyRiQEscMGESlRkQe + gmRexmvVRzxE4BlKQqmoJYgq0oNG+pxs8YGgaIBkySe9yU9xw+kdr0fcWkh1Y7C1ILmo + eFVH1zRqAHaKe03iXqBb4aLNrJ+mF77CtGi0wU3ZzPz02OI4MGSMFkmJfONE2nE0ZXOD + NRcV5My0xaWPs/6vfvBZ+Ffdtjwsqcqyqe7/B3SO0AKZ/iwN1+5uzR81yff1lzFsZc5N + /vVw==; + dara=google.com +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@ealerts.bankofamerica.com header.s=200608 header.b=bBfeKaM5; + dkim=pass header.i=@s5.y.mc.salesforce.com header.s=fbldkim5 header.b=I8atuJ7U; + spf=pass (google.com: domain of bounce-145816_text-1457994210-6989359-522000109-197442@bounce.ealerts.bankofamerica.com designates 68.232.194.86 as permitted sender) smtp.mailfrom=bounce-145816_TEXT-1457994210-6989359-522000109-197442@bounce.ealerts.bankofamerica.com; + dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bankofamerica.com +Return-Path: +Received: from mta.appointment.bankofamerica.com (mta.appointment.bankofamerica.com. [68.232.194.86]) + by mx.google.com with ESMTPS id 6a1803df08f44-6d451b8d6e9si17689236d6.558.2024.11.22.03.21.45 + for + (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); + Fri, 22 Nov 2024 03:21:45 -0800 (PST) +Received-SPF: pass (google.com: domain of bounce-145816_text-1457994210-6989359-522000109-197442@bounce.ealerts.bankofamerica.com designates 68.232.194.86 as permitted sender) client-ip=68.232.194.86; +Authentication-Results: mx.google.com; + dkim=pass header.i=@ealerts.bankofamerica.com header.s=200608 header.b=bBfeKaM5; + dkim=pass header.i=@s5.y.mc.salesforce.com header.s=fbldkim5 header.b=I8atuJ7U; + spf=pass (google.com: domain of bounce-145816_text-1457994210-6989359-522000109-197442@bounce.ealerts.bankofamerica.com designates 68.232.194.86 as permitted sender) smtp.mailfrom=bounce-145816_TEXT-1457994210-6989359-522000109-197442@bounce.ealerts.bankofamerica.com; + dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bankofamerica.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=200608; d=ealerts.bankofamerica.com; h=From:To:Subject:Date:List-Help:MIME-Version:Reply-To:Message-ID: Content-Type:Content-Transfer-Encoding; i=onlinebanking@ealerts.bankofamerica.com; bh=Kjcf8l3mYIkPtkdpXpj0inhpY0YdNBqkJohGWf3viHk=; b=bBfeKaM5RO/rMVToMyColBLLRtSjYNT3TGvWj49o32q2tfyrsE7wX9Yq7EaMYTCCMzoTWacjdDiF + UcfZoBtLt9twX1FMPGFPMJ75J9FJhrEPFhvakDou2fWrwFlV+RMhE9DWOq2eFug4vgpSqGNi/jfF + SS9H481F8tG3XpkpuDw= +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=fbldkim5; d=s5.y.mc.salesforce.com; h=From:To:Subject:Date:List-Help:MIME-Version:Reply-To:Message-ID: Content-Type:Content-Transfer-Encoding; bh=Kjcf8l3mYIkPtkdpXpj0inhpY0YdNBqkJohGWf3viHk=; b=I8atuJ7U2Q5P1QwvqEFf5/btRqH4ha8RSoyCenSOtaSf216FNv+Lg443P7yLzghV5bNjEMI/C6b/ + r9+sUJB09dvKUbxV5qAhQr7a8bbvoKII3mk80NwdZf+4gNigTQFOF2y7rpi1kFZzmYKgvzY/EecN + AKfVmwpc+mirDuQi0lcIYAIDbaSsh20DchPAwJN+sw+f6kw+8c61s8PkDIxTFkbu3rTNexMgBEub + 9zvvxBYVt+yzQqx6NyB5XTSXhpzILBV28SKD2rf0stAe+E9aie5JeSEkdYIceFkEF8RkNmMWq0cj + 7Esz0wuM90nIy/vUUWEdLKvdVNCAvk5GnA0y5g== +Received: by mta.appointment.bankofamerica.com id h81kki2fmd4o for ; Fri, 22 Nov 2024 11:21:43 +0000 (envelope-from ) +From: Bank of America +To: +Subject: Credit card transaction exceeds alert limit you set +Date: Fri, 22 Nov 2024 05:21:43 -0600 +List-Help: +MIME-Version: 1.0 +Reply-To: Bank of America +X-SFMC-Stack: 5 +x-job: 522000109_6989359 +Message-ID: <063d3237-4661-4553-ac40-a4dabde00bad@las1s05mta5.xt.local> +Feedback-ID: 522000109:6989359:68.232.194.86:sfmktgcld +Content-Type: text/html; charset="iso-8859-1" +Content-Transfer-Encoding: 7bit + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + +
+ + + + +
+ + + + +
+ Bank of America. +
+
+
+
+
+
+ + +