working rss feed to nostr publish
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import 'websocket-polyfill'
|
||||
import { extract } from '@extractus/feed-extractor'
|
||||
import NDK, { NDKEvent, NDKPrivateKeySigner, NDKRelay, NDKRelaySet } from '@nostr-dev-kit/ndk'
|
||||
import { bytesToHex, utf8ToBytes } from '@noble/hashes/utils'
|
||||
import bech32 from 'bech32-buffer'
|
||||
|
||||
const toHexString = nsec => {
|
||||
let buffer = bech32.decode(nsec).data
|
||||
return buffer.reduce((s, byte) => {
|
||||
let hex = byte.toString(16);
|
||||
if (hex.length === 1) hex = '0' + hex;
|
||||
return s + hex;
|
||||
}, '');
|
||||
}
|
||||
|
||||
|
||||
export const handler = async (event) => {
|
||||
const region = process.env.AWS_REGION || "us-east-1"
|
||||
const feed = event.feedUrl
|
||||
const privkey = toHexString(event.nostrNsec)
|
||||
const since = event.since
|
||||
|
||||
if (feed === "") {
|
||||
console.error("feedUrl was not set.")
|
||||
return {
|
||||
statusCode: 400,
|
||||
body: "feedUrl must be provided in payload."
|
||||
}
|
||||
}
|
||||
|
||||
let response = {
|
||||
totalItems: 0,
|
||||
successes: 0,
|
||||
errors: []
|
||||
}
|
||||
|
||||
const ndk = new NDK({
|
||||
signer: new NDKPrivateKeySigner(privkey),
|
||||
explicitRelayUrls: [
|
||||
"wss://nostr.mom",
|
||||
"wss://nostr.snort.social",
|
||||
"wss://nostr.lol"
|
||||
]
|
||||
})
|
||||
|
||||
await ndk.connect(6000).catch(err => {
|
||||
console.error(err)
|
||||
response.errors.push ("failed to connect to relay", err)
|
||||
return response
|
||||
})
|
||||
|
||||
let rss = await extract(feed)
|
||||
.catch(err => {
|
||||
console.error(err.error);
|
||||
return response
|
||||
})
|
||||
|
||||
let filtered = rss.entries.filter(item => Date.parse(item.published) >= Date.parse(since))
|
||||
response.totalItems = filtered.length
|
||||
|
||||
for (let item of filtered) {
|
||||
let ndkEvent = new NDKEvent(ndk, {
|
||||
kind: 1,
|
||||
pubkey: ndk.signer.user().hexpubkey,
|
||||
content: item.title,
|
||||
created_at: Math.floor(Date.now() / 1000),
|
||||
})
|
||||
|
||||
try {
|
||||
const published = await ndkEvent.publish()
|
||||
if (published) {
|
||||
response.successes++
|
||||
}
|
||||
} catch(e) {
|
||||
console.error(e)
|
||||
response.errors.push(e)
|
||||
}
|
||||
}
|
||||
|
||||
return response
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user