Created
March 2, 2018 16:50
-
-
Save jonasgroth/aa341c3abaf69a281c38d3e4ebd439bf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
console.log('Loading event'); | |
var doc = require('dynamodb-doc'); | |
var dynamodb = new doc.DynamoDB(); | |
var request = require('request'); | |
var akismet = require('akismet-api'); | |
var validator = require('validator'); | |
var client = akismet.client({ | |
key : 'API_KEY', // Required! | |
blog : 'https://DOMAIN' // Required! | |
}); | |
var PushBullet = require('pushbullet'); | |
var pusher = new PushBullet('API_KEY'); | |
exports.handler = function(event, context, callback) { | |
console.log("Request received:\n", JSON.stringify(event)); | |
console.log("Context received:\n", JSON.stringify(context)); | |
var tableName = "jonasgroth.se_comments"; | |
var datetime = Math.floor(Date.now() / 1000); | |
var sourceIp = event.requestContext.identity.sourceIp; | |
var userAgent = event.requestContext.identity.userAgent; | |
var messageBody = JSON.parse(event.body); | |
var recaptcha = messageBody["g-recaptcha-response"]; | |
console.log("Message body: ", JSON.stringify(messageBody)); | |
var item = { | |
"post": event.headers.Referer, | |
"timedate": datetime, | |
"authorName": validator.escape(messageBody["authorName"]), | |
"commentText": validator.escape(messageBody["commentText"]), | |
"userAgent": userAgent, | |
"sourceIp": sourceIp | |
}; | |
console.log("Item:\n", item); | |
if(event.headers.Referer === undefined || messageBody["authorName"] === undefined || messageBody["commentText"] === undefined){ | |
var body = {message: "ERROR: Missing input fields!"}; | |
var httpResponse = generateResponse(body, 200); | |
console.log("Response: " + JSON.stringify(httpResponse)); | |
callback(null, httpResponse); | |
} | |
console.log("Checking reCaptcha....."); | |
request('https://www.google.com/recaptcha/api/siteverify?secret="API_KEY"&response='+recaptcha+"&remoteip="+sourceIp,function(error,response,reCaptchaBody) { | |
var reCaptchaBody = JSON.parse(reCaptchaBody); | |
console.log(reCaptchaBody); | |
// Success will be true or false depending upon captcha validation. | |
if(reCaptchaBody.success !== undefined && (reCaptchaBody.success == true)) { | |
console.log('reCaptcha Success!'); | |
client.checkSpam({ | |
user_ip : sourceIp, // Required! | |
user_agent : userAgent, // Required! | |
referrer : event.headers.Referer, // Required! | |
permalink : event.headers.Referer, | |
comment_type : 'comment', | |
comment_author : item.authorName, | |
comment_content : item.commentText, | |
//is_test : true // Default value is false | |
}, function(err, spam) { | |
if (err) { | |
var body = {message: "ERROR!"}; | |
var httpResponse = generateResponse(body, 200); | |
console.log("Response: " + JSON.stringify(httpResponse)); | |
callback(null, httpResponse); | |
} else if (spam) { | |
console.log('OMG Spam!'); | |
var body = {message: "SPAM!"}; | |
var httpResponse = generateResponse(body, 200); | |
console.log("Response: " + JSON.stringify(httpResponse)); | |
callback(null, httpResponse); | |
} else { | |
console.log('Totally not spam'); | |
dynamodb.putItem({ | |
"TableName": tableName, | |
"Item": item | |
}, function(err, data) { | |
if (err) { | |
var body = {message: "ERROR!"}; | |
var httpResponse = generateResponse(body, 200); | |
console.log("Response: " + JSON.stringify(httpResponse)); | |
callback(null, httpResponse); | |
} else { | |
console.log('Dynamo Success: ' + JSON.stringify(data, null, ' ')); | |
var body = {message: "OK!"}; | |
var httpResponse = generateResponse(body, 200); | |
console.log("Response: " + JSON.stringify(httpResponse)); | |
var deviceParams = {}; | |
pusher.note(deviceParams, "New comment", JSON.stringify(item), function(error, response) { | |
if(error){ | |
console.log("PushBullet error: " + response); | |
} else { | |
console.log("PushBullet: " + response); | |
} | |
}); | |
callback(null, httpResponse); | |
} | |
}); | |
} | |
}); | |
} else { | |
var body = {message: "reCaptcha error!"}; | |
var httpResponse = generateResponse(body, 200); | |
console.log("Response: " + JSON.stringify(httpResponse)); | |
callback(null, httpResponse); | |
} | |
}); | |
} | |
function generateResponse(body, statusCode) { | |
var httpResponse = { | |
"statusCode":statusCode, | |
"headers": { | |
"date": new Date().toUTCString(), | |
"X-Requested-With":"*", | |
"Access-Control-Allow-Headers":"Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token", | |
"access-control-allow-origin":"https://jonasgroth.se", | |
"access-control-allow-methods": "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT", | |
"content-type": "application/json", | |
"status": statusCode, | |
"content-length": body.length | |
}, | |
"body": JSON.stringify(body) | |
}; | |
return httpResponse; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment