1
0
mirror of https://github.com/comatory/fb2iCal synced 2025-02-19 13:10:53 +01:00

allow passing FB event number as parameter

This commit is contained in:
Ondrej Synacek 2019-10-22 20:25:09 +02:00
parent 97317aeaa4
commit acebfe3658
8 changed files with 78 additions and 31 deletions

View File

@ -1,13 +1,29 @@
const request = require('request')
const { checkURLFormat, checkNumberURLParameter } = require('./utils')
const useMobileURL = (originalURL) => {
const url = new URL(originalURL)
const urlWithProtocol = originalURL.includes('http') ?
originalURL :
`https://${originalURL}`
const url = new URL(urlWithProtocol)
return `${url.protocol}//mobile.facebook.com${url.port}${url.pathname}${url.hash}`
}
const createURL = (originalURL) => {
if (checkURLFormat(originalURL)) {
return originalURL
}
if (checkNumberURLParameter(originalURL)) {
return `https://facebook.com/events/${originalURL}`
}
return ''
}
const crawl = async (originalURL) => {
const url = useMobileURL(originalURL)
const url = useMobileURL(createURL(originalURL))
return new Promise((resolve, reject) => {
console.info(`Started request for URL: ${url}`)
request({

View File

@ -7,7 +7,7 @@ const rateLimit = require('express-rate-limit')
const crawl = require('./crawler')
const parseHTML = require('./parser')
const generateICS = require('./ics')
const { genericErrorHandler, checkFBURL } = require('./middlewares')
const { genericErrorHandler, checkURLParameter } = require('./middlewares')
const port = process.env.PORT
const app = express()
@ -36,9 +36,9 @@ app.get('*', (req, res) => {
res.status(400).render('404')
})
app.use('/download', checkFBURL)
app.use('/download', checkURLParameter)
app.use('/download', rateLimit())
app.post('/download', async (req, res) => {
app.post('/download', async (req, res, next) => {
const { url } = req.body
try {
@ -52,7 +52,8 @@ app.post('/download', async (req, res) => {
.send(200, new Buffer(ics, 'utf8'))
}
} catch (err) {
return next(err)
next(err)
return
}
})

View File

@ -1,4 +1,5 @@
const FBURLError = () => new Error('Not a valid Facebook URL!')
const { checkValidURL } = require('./utils')
const MissingURLParameter = () => new Error('Please provide valid URL or event number.')
const sendJSON = (req) => {
return req.accepts().includes('application/json')
@ -19,27 +20,17 @@ const genericErrorHandler = (err, req, res, next) => {
.render('error', { error: err.toString() })
}
const checkFBURL = (req, res, next) => {
const checkURLParameter = (req, res, next) => {
const { url } = req.body
if (!url) {
return next(FBURLError())
if (!url || !checkValidURL(url)) {
return next(MissingURLParameter())
}
try {
const FBURL = new URL(url)
if (!(/facebook/.test(FBURL.hostname))) {
return next(FBURLError())
}
} catch (err) {
return next(err)
}
return next()
}
module.exports = {
genericErrorHandler,
checkFBURL,
checkURLParameter,
}

View File

@ -1,5 +1,6 @@
const dayjs = require('dayjs')
const cheerio = require('cheerio')
const { createParserError } = require('./utils')
// NOTE: Specific formatting for `ics` library
const parseDates = (startDate, endDate) => {
@ -79,15 +80,16 @@ const parseHTML = (html) => {
return data
}, null)
const eventData = rawData ?
JSON.parse(rawData.slice(12, -5)) :
{}
if (!rawData) {
throw createParserError()
}
const eventData = JSON.parse(rawData.slice(12, -5))
const data = parseEventData(eventData)
return data
} catch (err) {
throw err
return
}
}

View File

@ -270,6 +270,10 @@
return
}
if (!form.reportValidity()) {
return
}
event.preventDefault()
const formData = new URLSearchParams()

View File

@ -1,4 +1,4 @@
// Worker v2
// Worker v3
self.addEventListener('install', (event) => {
event.waitUntil(
@ -6,8 +6,8 @@ self.addEventListener('install', (event) => {
return cache.addAll([
'/',
'/favicon.ico',
'/scripts.js?2',
'/style.css?2',
'/scripts.js?3',
'/style.css?3',
])
})
)

26
lib/utils.js Normal file
View File

@ -0,0 +1,26 @@
const checkValidURL = (url) => {
return checkURLFormat(url) ||
checkNumberURLParameter(url)
}
const checkURLFormat = (url) => {
return /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/.test(url)
}
const checkNumberURLParameter = (url) => {
return /^\d+$/.test(url)
}
const createParserError = () => {
const err = new Error('Unable to parse event data.')
err.statusCode = 422
return err
}
module.exports = {
checkValidURL,
checkURLFormat,
checkNumberURLParameter,
createParserError,
}

View File

@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" sizes="180x180" href="/icon-180.png">
<link rel="stylesheet" type="text/css" href="/style.css?2">
<link rel="stylesheet" type="text/css" href="/style.css?3">
<title>Facebook Event to iCal Converter</title>
</head>
@ -24,7 +24,14 @@
</p>
<form action='/download' method='POST' id="form">
<input id="url" type='text' name='url' placeholder='Paste / type FB event URL here...' />
<input
required
pattern="^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?|\d+$"
id="url"
name="url"
placeholder="Paste / type FB event URL or event number..."
title="Please insert Facebook Event URL / Number"
/>
<input id="submit" type='submit' value='Submit' />
</form>
@ -71,6 +78,6 @@
<a href="#" title="Source code coming soon">Source</a>
</footer>
<script src="/scripts.js?2"></script>
<script src="/scripts.js?3"></script>
</body>
</html>