Skip to content

Instantly share code, notes, and snippets.

@supinf
Last active February 21, 2017 21:40
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save supinf/e1a6504dcf1571e48fd9 to your computer and use it in GitHub Desktop.
Save supinf/e1a6504dcf1571e48fd9 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="ja">
<head>
<title>AWS Javascript Browser SDK Example</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/nvd3/1.1.15-beta/nv.d3.min.css">
<script src="//sdk.amazonaws.com/js/aws-sdk-2.0.16.min.js"></script>
</head>
<body>
<fb:login-button scope="public_profile" onlogin="checkLoginState();"></fb:login-button>
<div>Browsers used by you:</div>
<div id="chart">
<svg style="width:500px;height:500px" />
</div>
<div>
<span>Browsers used by all users:</span>
<ul id="browser-list"></ul>
</div>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.4.8/d3.min.js" charset="utf-8"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/nvd3/1.1.15-beta/nv.d3.min.js" charset="utf-8"></script>
<script src="//code.jquery.com/jquery.js"></script>
<script type="text/JavaScript">
// IAM Role that you created for Login With Facebook
var awsRoleArn = 'arn:aws:iam::230936187603:role/demo-awssdk',
awsRegion = 'ap-northeast-1',
facebookAppId = '1430761990526092';
window.fbAsyncInit = function () {
FB.init({appId: facebookAppId, cookie: true, xfbml: true, version: 'v2.1'});
};
function checkLoginState() {
FB.getLoginStatus(function (response) {
if (response.status === 'connected') {
AWS.config.credentials = new AWS.WebIdentityCredentials({
RoleArn: awsRoleArn,
ProviderId: 'graph.facebook.com',
WebIdentityToken: response.authResponse.accessToken
});
// AWS region that we're working in
AWS.config.region = awsRegion;
doSomethingWithAwsSdk(response.authResponse.userID);
}
});
}
function doSomethingWithAwsSdk(userID) {
var detectedBrowser = identifyBrowser();
var params = {
TableName: 'user-browsers',
Key: {
userId: { S: userID},
browser: { S: detectedBrowser.n+'-'+detectedBrowser.v}
},
AttributeUpdates: {
count: { Action: 'ADD', Value: { N: '1'}}
},
ReturnValues: 'UPDATED_NEW'
}
// use DynamoDB's "Atomic Counter" function to update the
// count page views by the type of browser that we detected
window.db = new AWS.DynamoDB();
db.updateItem(params, function (err, data) {
if (err) {
console.log(err, err.stack);
return;
}
$('.fb_iframe_widget').hide();
updateBrowserCount(userID);
});
}
// display current detected browser count
function updateBrowserCount(userID) {
var params = {
TableName: 'user-browsers',
Select: 'SPECIFIC_ATTRIBUTES',
AttributesToGet: ['browser', 'count'],
KeyConditions: {
'userId': {
ComparisonOperator: 'EQ',
AttributeValueList: [{ S: userID}]
}
},
};
db.query(params, function (err, data) {
if (err) {
console.log(err, err.stack);
return;
}
var browsers = [];
$.each(data.Items, function() {
browsers.push({
label: this.browser.S,
value: this.count.N
});
});
// draw the chart using D3
drawChart(browsers);
});
var params = {
TableName: 'user-browsers',
Select: 'SPECIFIC_ATTRIBUTES',
AttributesToGet: ['browser']
}
db.scan(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
var list = $('#browser-list').html('');
$.each(data.Items, function() {
list.append('<li>'+this.browser.S+'</li>');
});
// de-dupe browser list
var seen = {};
list.find("li").each(function(index, elem) {
var txt = $(this).text().toLowerCase();
if (seen[txt]) {
$(this).remove();
} else {
seen[txt] = true;
}
});
}
});
// repeat...
setTimeout(function(){updateBrowserCount(userID)}, 1000 * 10);
}
// draw the chart with NVD3
function drawChart(browsers) {
nv.addGraph(function() {
var chart = nv.models.pieChart()
.x(function(d) { return d.label; })
.y(function(d) { return d.value; })
.showLabels(true)
.labelThreshold(.05)
.labelType("percent");
d3.select("#chart svg")
.datum(browsers)
.transition().duration(100)
.call(chart);
nv.utils.windowResize(chart.update);
});
}
// detect the web browser
function identifyBrowser(userAgent, elements) {
var regexps = {
'Chrome': [ /Chrome\/(\S)/ ],
'Firefox': [ /Firefox\/(\S)/ ],
'MSIE': [ /MSIE (\S);/ ],
'Opera': [ /Opera\/.*?Version\/(\S)/, /* Opera 10 */
/Opera\/(\S)/ /* Opera 9 and older */
],
'Safari': [ /Version\/(\S).*?Safari\// ],
'Silk': [ /Silk\/(\S)/ ]
}, re, m, browser, version;
if (userAgent === undefined) {
userAgent = navigator.userAgent;
}
if (elements === undefined) {
elements = 2;
} else if (elements === 0) {
elements = 1337;
}
for (browser in regexps) {
while (re = regexps[browser].shift()) {
if (m = userAgent.match(re)) {
version = (m[1].match(new RegExp('[^.](?:\.[^.]){0,'
+ (--elements) + '}')))[0];
return {n: browser, v: version};
}
}
}
return null;
}
// Load the SDK asynchronously
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id; js.async = true;
js.src = "//connect.facebook.net/ja_JP/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment