Use email header x-beehiiv-type to detect beehiiv newsletter and get the newsletter url from the header x-newsletter

This commit is contained in:
Hongbo Wu 2023-01-30 19:03:15 +08:00
parent 88f6e20bfc
commit 4f12580b1c
2 changed files with 13 additions and 50 deletions

View file

@ -6,36 +6,19 @@ export class BeehiivHandler extends ContentHandler {
this.name = 'beehiiv'
}
findNewsletterHeaderHref(dom: Document): string | undefined {
const readOnline = dom.querySelectorAll('table tr td a')
let res: string | undefined = undefined
readOnline.forEach((e) => {
if (e.textContent === 'Read Online') {
res = e.getAttribute('href') || undefined
}
})
return res
}
async isNewsletter(input: {
from: string
headers: Record<string, string | string[]>
dom: Document
}): Promise<boolean> {
const dom = input.dom
if (dom.querySelectorAll('img[src*="beehiiv.net"]').length > 0) {
const beehiivUrl = this.findNewsletterHeaderHref(dom)
if (beehiivUrl) {
return Promise.resolve(true)
}
}
return false
return Promise.resolve(
input.headers['x-beehiiv-type']?.toString() === 'newsletter'
)
}
async parseNewsletterUrl(
headers: Record<string, string | string[]>,
html: string
): Promise<string | undefined> {
return this.findNewsletterUrl(html)
return Promise.resolve(headers['x-newsletter']?.toString())
}
}

View file

@ -170,21 +170,13 @@ describe('Newsletter email test', () => {
})
it('returns BeehiivHandler for beehiiv.com newsletter', async () => {
const html = load('./test/data/beehiiv-newsletter.html')
const handler = await getNewsletterHandler({
html,
html: '',
from: '',
headers: {},
})
expect(handler).to.be.instanceOf(BeehiivHandler)
})
it('returns BeehiivHandler for milkroad newsletter', async () => {
const html = load('./test/data/milkroad-newsletter.html')
const handler = await getNewsletterHandler({
html,
from: '',
headers: {},
headers: {
'x-newsletter': 'https://www.milkroad.com/p/bored-ape-amazon',
'x-beehiiv-type': 'newsletter'
},
})
expect(handler).to.be.instanceOf(BeehiivHandler)
})
@ -277,24 +269,12 @@ describe('Newsletter email test', () => {
})
context('when email is from beehiiv', () => {
before(() => {
nock('https://u23463625.ct.sendgrid.net')
.head(
'/ss/c/AX1lEgEQaxtvFxLaVo0GBo_geajNrlI1TGeIcmMViR3pL3fEDZnbbkoeKcaY62QZk0KPFudUiUXc_uMLerV4nA/3k5/3TFZmreTR0qKSCgowABnVg/h30/zzLik7UXd1H_n4oyd5W8Xu639AYQQB2UXz-CsssSnno'
)
.reply(301, undefined, {
Location: 'https://www.milkroad.com/p/talked-guy-spent-30m-beeple',
})
nock('https://www.milkroad.com')
.head('/p/talked-guy-spent-30m-beeple')
.reply(200, '')
})
it('gets the URL from the header', async () => {
const html = load('./test/data/beehiiv-newsletter.html')
const url = await new BeehiivHandler().findNewsletterUrl(html)
const url = await new BeehiivHandler().parseNewsletterUrl({
'x-newsletter': 'https://www.milkroad.com/p/bored-ape-amazon',
}, '')
expect(url).to.startWith(
'https://www.milkroad.com/p/talked-guy-spent-30m-beeple'
'https://www.milkroad.com/p/bored-ape-amazon'
)
})
})