Skip to content

Instantly share code, notes, and snippets.

@shoko3168
Created May 18, 2016 05:27
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save shoko3168/5add1cb46b19d22013a4c70d0526b2ed to your computer and use it in GitHub Desktop.
Save shoko3168/5add1cb46b19d22013a4c70d0526b2ed to your computer and use it in GitHub Desktop.
var FB_BASE_URL = 'https://graph.facebook.com/v2.6/me/messages?access_token=CAAX...';
var fbBookUri = 'https://docs.google.com/spreadsheets/d/1Iu....PSo/edit';
var fbBook = SpreadsheetApp.openByUrl(fbBookUri);
var logSheet = fbBook.getSheetByName("log");
// ====================================
function testGetMobileOasisList() {
var lat = 35.622035562811;
var lng = 139.7311121691;
var mobileOasisList = getMobileOasisList(lat, lng);
Logger.log(mobileOasisList);
}
function getRequest(url) {
var options = {
method: 'GET'
}
var result = UrlFetchApp.fetch(url, options);
// リクエストに成功していたら結果を返す
if (result.getResponseCode() == 200) {
return result.getContentText();
}
throw new Error('getRequest failed');
}
/**
* lat, lng からMobileOasisListを取得
*/
function getMobileOasisList(lat, lng) {
var endPointUrl = 'http://oasis.mogya.com/api/v0/search?';
var n, w, s, e;
var adjust = 0.0025;
var url = endPointUrl + 'n=' + (lat + adjust) + '&w=' + (lng - adjust) + '&s=' + (lat - adjust) + '&e=' + (lng + adjust) + '&lat=' + lat + '&lng=' + lng;
var contentText = getRequest(url);
var ret = JSON.parse(contentText);
var idx, mos;
var oasisList = [];
for (idx in ret.results) {
// mos = new MobileOasisSpot(ret.results[idx]);
mos = ret.results[idx];
oasisList.push(mos);
}
return oasisList;
}
// ====================================
function doGet(e) {
// return ContentService.createTextOutput('hello');
return ContentService.createTextOutput(e.parameter['hub.challenge']);
}
// ====================================
function doPost(e) {
var message, msg, i, j, result, entry;
var contents = JSON.parse(e.postData.contents);
// Spread Sheetにログを出力します
logSheet.appendRow([new Date(), 'start', e, contents]);
var postData = e.postData;
for (i = 0; i < contents.entry.length; i++) {
entry = contents.entry[i];
for (j = 0; j < entry.messaging.length; j++) {
msg = entry.messaging[j];
logSheet.appendRow([new Date(), 'msg', msg, msg.sender.id, msg.recipient.id]);
// 受信した分だけハンドリング
handleContent(msg);
}
}
logSheet.appendRow([new Date(), 'end']);
return ContentService.createTextOutput('');
}
function handleContent(msg) {
// テキストメッセージがあるかどうか
if (msg.message) {
var attachments = msg.message.attachments;
var i, atStr;
for (i in attachments) {
// 添付情報がある分だけハンドリング
handleAttachment(msg, attachments[i]);
logSheet.appendRow([new Date(), 'atc', attachments[i]]);
}
var text = msg.message.text;
if (text) {
logSheet.appendRow([new Date(), 'text', text]);
handleTextMessage(msg);
}
}
}
function handleTextMessage(msg) {
sendFBTextMessage(msg.sender.id, "ぼくハカバくん。位置情報を送ってね!\n充電スポットを送るよ!");
}
function sendFBTextMessage(id, text) {
var url = FB_BASE_URL;
var payload = {
'recipient': {id: id},
'message': {text: text}
};
payload = JSON.stringify(payload);
var options = {
'method': 'post',
"headers": {
"Content-type": "application/json"
},
'payload': payload,
muteHttpExceptions: true
};
var result = UrlFetchApp.fetch(url, options);
return result;
}
function testSendFBTextMessage() {
sendFBTextMessage('86....126', 'hello');
}
function handleAttachment(msg, attachment) {
var payload = attachment.payload;
if (payload) {
var coordinates = payload.coordinates;
// 位置情報はcoordinatesにあります
if (coordinates) {
handleCoordinates(msg, attachment);
}
}
}
function handleCoordinates(msg, attachment) {
// 位置情報が送られたときのハンドリング
var payload = attachment.payload;
var coordinates = payload.coordinates;
logSheet.appendRow([new Date(), 'coordinates', coordinates]);
var message = attachment.title + 'から近い充電スポットを送るよ!';
// 一旦メッセージ送信
sendFBTextMessage(msg.sender.id, message);
// 探索開始
var oasisList = getMobileOasisList(coordinates.lat, coordinates.long);
logSheet.appendRow([new Date(), 'oasis', message, JSON.stringify(oasisList)]);
if (oasisList.length > 0) {
//http://maps.google.com/maps?q=35.65860811863414,139.7455318066551
var oasis = oasisList[0];
message = '';
var saddr = coordinates.lat + ',' + coordinates.long;
sendFBOasisMessage(msg.sender.id, oasisList, saddr);
} else {
sendFBTextMessage(msg.sender.id, '充電スポットは見つかりませんでした。。');
}
}
function sendFBOasisMessage(id, oasisList, saddr) {
var countI, oasis, button, buttons = [];
// 最大3件送信
for (countI = 0; (countI < 3) && (countI < oasisList.length); countI++) {
oasis = oasisList[countI];
button = {
type: 'web_url',
// url: 'comgooglemaps://?saddr=' + saddr + '&daddr=' + this.lat + ',' + this.lng + '&directionsmode=walking',
url: 'http://maps.google.com/maps?q=' + oasis.latitude + ',' + oasis.longitude,
title: oasis.title + '(' + oasis.powersupply + ')' + "\n" + oasis.address + "\n" + 'ここに行く!'
};
buttons.push(button);
}
var url = FB_BASE_URL;
var payload = {
'recipient': {id: id},
'message': {
"attachment":{
"type":"template",
"payload":{
"template_type":"button",
"text":"ここはどうかな?",
"buttons":buttons
}
}
}
};
payload = JSON.stringify(payload);
var options = {
'method': 'post',
"headers": {
"Content-type": "application/json"
},
'contentType': "application/json",
'payload': payload
// , muteHttpExceptions: true
};
var result = UrlFetchApp.fetch(url, options);
}
function testSendFBOasisMessage() {
var lat = 35.622035562811;
var lng = 139.7311121691;
var list = getMobileOasisList(lat, lng);
sendFBOasisMessage('86....126', list, lat + ',' + lng);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment