env vars:
SLACK_WEBHOOK_URL
CRAIGSLIST_SEARCH_URL=https://sfbay.craigslist.org/search/sfc/apa?query=glen+park&hasPic=1&postedToday=1&availabilityMode=0&sale_date=all+dates
SLACK_ICON_URL
const p = require('puppeteer'); | |
const request = require('request-promise-native'); | |
async function postToSlack(listing) { | |
const options = { | |
method: 'POST', | |
uri: process.env.SLACK_WEBHOOK_URL, | |
body: { | |
icon_url: process.env.SLACK_ICON_URL, | |
attachments: [ | |
{ | |
title: listing.title, | |
title_link: listing.href, | |
fallback: listing.title, | |
thumb_url: listing.img, | |
}, | |
], | |
}, | |
headers: { | |
'Content-type': 'application/json', | |
}, | |
json: true, | |
}; | |
try { | |
await request(options); | |
} catch (error) { | |
console.error(`failed to post ${listing.href} to slack.`); | |
console.log(error); | |
} | |
} | |
async function getDetails(listing) { | |
const img = await listing.$eval('img', img => img.getAttribute('src')); | |
const titleElement = await listing.$('.result-title'); | |
const title = await (await titleElement.getProperty('textContent')).jsonValue(); | |
const href = await (await titleElement.getProperty('href')).jsonValue(); | |
return { img, title, href }; | |
} | |
async function main() { | |
const browser = await p.launch({ | |
args: ['--no-sandbox'], | |
defaultViewport: { width: 1024, height: 720 }, | |
}); | |
const page = await browser.newPage(); | |
await page.goto(process.env.CRAIGSLIST_SEARCH_URL); | |
const rows = await page.$$('.rows>*'); | |
const headingIndex = rows.findIndex(r => r._remoteObject.description === 'h4.ban.nearby'); | |
const relevant = rows.slice(0, headingIndex); | |
const listings = await Promise.all(relevant.map(getDetails)); | |
await Promise.all(listings.map(postToSlack)); | |
await browser.close(); | |
} | |
exports.main = main; |
{ | |
"name": "glen-park-homes", | |
"version": "1.0.0", | |
"description": "", | |
"main": "index.js", | |
"scripts": { | |
"test": "echo \"Error: no test specified\" && exit 1" | |
}, | |
"keywords": [], | |
"author": "", | |
"license": "ISC", | |
"dependencies": { | |
"@google-cloud/pubsub": "^0.24.1", | |
"puppeteer": "^1.12.2", | |
"request": "^2.88.0", | |
"request-promise-native": "^1.0.5" | |
} | |
} |