Skip to content

Instantly share code, notes, and snippets.

@jonasgroth
Created March 2, 2018 16:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonasgroth/aa341c3abaf69a281c38d3e4ebd439bf to your computer and use it in GitHub Desktop.
Save jonasgroth/aa341c3abaf69a281c38d3e4ebd439bf to your computer and use it in GitHub Desktop.
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