背景
個人ではあまりないことですが、企業だと複数のFacebookアカウントを持っていることがあると思います。縦割り組織の場合だと、商品のカテゴリーごとに勝手にアカウント作って運用していることはよくあることだと思います。それぞれのカテゴリー毎に発信することも重要ですが、まとめて閲覧できる場を作りたいと思い開発しました。
前準備
(1) facebook for developersでアカウント開設
(2) マイアプリを作成後、設定画面でapp secretとApp IDをコピー
(3) 無期限アクセストークンの取得
無期限APIの取得方法はこちらが参考になりました。
画面のキャプチャ付きでわかりやすいです。
Facebook API ページの無期限 Access Token 取得方法
構成
LambdaでTokenやFacebookのアカウント情報を記載し、GraphAPIを使用します
コード
import os
import json
import datetime
import requests
import boto3
from dateutil.parser import parse
from boto3.dynamodb.conditions import Key, Attr
endpoint = os.environ['endpoint']
# https://graph.facebook.com/v3.0/
aaaaAccount = {'123456789':'***************'}
bbbbAccount = {"987654321":"***************"}
# id : token
accountlist = aaaaAccount
accountlist.update(bbbbAccount)
def lambda_handler(event, context):
feedList = {}
for key, item in accountlist.items():
jsonData = get_accountList(key,item)
for feedData in jsonData['feed']['data']:
if 'message' in feedData.keys() and 'shares' in feedData.keys():
feedList[feedData['created_time']] = {'message':feedData['message'],'sharecount':feedData['shares']['count'],'name':jsonData['name'],'picture':jsonData['picture']['data']['url'],'link':jsonData['link']}
sortData = sorted(feedList.items(),reverse=True)
retrun sortData
def get_accountList(facebookId,token):
param = '?fields=about%2Cfeed.limit(3)%7Bmessage%2Ccreated_time%2Cshares%7D%2Cfan_count%2Cpicture%2Clink%2Cname&access_token=' + token
url = endpoint + facebookId + param
return requests.get(url).json()
改善したい点
・管理用のアカウントで無期限のtokenを発行 or 毎回tokenを取得できれば、管理下のアカウント毎にAPI実行しなくて済むので方法があればそちらに変更したい。
・API用のパラメーターをエンコードしたものを記述しているが、視認性向上のためプログラムでエンコードしたい。(下記コードだとlimit(3)の()がエンコードされたせいかうまくいかなかった。)
・dynamoDB or CloudFrontを使用して毎回APIをたたかないようにして、レスポンス向上したい
param = urllib.parse.quote('/?fields=about,feed.limit(3),fan_count,picture,link&access_token=') + token