var baseUrl = "https://graph.facebook.com/v2.11/"
var token = '' // tokenの取得方法は https://hirofukami.com/2017/06/30/facebook-page-access-token/ などを参考に
var postFieldList = [
"created_time",
"message",
"permalink_url",
"id",
"promotion_status",
"type",
"shares"
]
var videoMetricList = [
"post_reactions_by_type_total",
"post_impressions",
"post_impressions_unique",
"post_video_views",
"post_video_views_unique",
"post_video_views_10s",
"post_consumptions_by_type_unique"
]
function main() {
var posts = loadPosts('wowful.akstk')
var result = []
for(var x = 0; x < posts.length; x++) {
var post = posts[x]
var response = fetch(
baseUrl + post.id + "/insights" + metricParams('?') + tokenParams('&')
)
var postMetrics = response.data
for (var i = 0; i < postMetrics.length; i++) {
var metric = postMetrics[i]
var val = metric.values[0].value
if (
metric.name === "post_reactions_by_type_total" ||
metric.name === "post_consumptions_by_type_unique"
) {
var count = 0
for (var n in val) {
count += val[n]
}
post[metric.name] = count
} else {
post[metric.name] = val
}
if (postMetrics.length === i+1) {
result.push(post)
}
}
}
var targetSheet = getTargetSheet()
var headerColumns = getHeaderColumns()
targetSheet
.clear() // 一旦すべての内容をクリアする
.appendRow(headerColumns)
for(var r in result) {
var temp = []
for(var attr in headerColumns) {
Logger.log(headerColumns[attr])
temp.push(result[r][headerColumns[attr]])
}
targetSheet.appendRow(temp)
}
}
function getHeaderColumns() {
var base = postFieldList.concat(videoMetricList)
base.splice(base.indexOf('id'), 1)
return base
}
function getTargetSheet() {
var targetSheetId = '' // https://docs.google.com/spreadsheets/..?gid=xxx の値
var spreadSheet = SpreadsheetApp.openById('hoge')
var sheets = spreadSheet.getSheets()
var targetSheet;
for(var n in sheets){
if(sheets[n].getSheetId()+'' == targetSheetId){
targetSheet = sheets[n]
break
}
}
return targetSheet
}
function loadPosts() {
var hasNextPage = true
var url = baseUrl + "wowful.aktsk/posts" + tokenParams('?') + postFieldsParam('&')
var res = []
while (hasNextPage) {
Utilities.sleep(1000)
var response = fetch(url)
var data = response.data
var paging = response.paging
for (var i = 0; i < data.length; i++) {
var d = data[i]
d.created_time = formatDateTime(d.created_time) // 2017/12/01 12:00:00という形式にする。
try {
d.shares = d.shares.count // { share: { count: 100 } } という構造になっているのを取り出す。
} catch(e) {
d.shares = 0
}
res.push(data[i])
}
if (paging.next) {
url = paging.next
Logger.log(paging.next)
} else {
hasNextPage = false
}
}
return res
}
function formatDateTime(str) {
var date = new Date(str)
var ymd = [date.getYear(), date.getMonth(), date.getDay()].join('/')
var time = [date.getHours(), date.getMinutes(), date.getSeconds()].join(':')
return [ymd, time].join(" ")
}
function tokenParams(prefix) {
return prefix + "access_token=" + token
}
function metricParams(prefix) {
return prefix + "metric=" + videoMetricList.join(',')
}
function postFieldsParam(prefix) {
return prefix + "fields=" + postFieldList.join(',')
}
function fetch(url) {
return parseResponse(UrlFetchApp.fetch(url));
}
function parseResponse(response) {
return JSON.parse(response.getContentText("UTF-8"));
}
Last active
January 11, 2018 01:56
-
-
Save mamoru0217/968dfadc490e2e705858e8f4dc80e0d7 to your computer and use it in GitHub Desktop.
Facebook Page から投稿一覧を取得する Google App Script
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment