내가 개발할 웹 애플리케이션 또는 모바일 앱 등에서 Facebook에 있는 피드나 기타 정보들을 가져오려면 아래의 Facebook 개발자 사이트에서 Facebook 개발자 앱을 등록해야 합니다.
앱을 생성하고 나면 필요한 여러가지 설정을 해 주어야 합니다. 저는 Elastic 한국 사용자 그룹의 글을 가져오기 위해서 만들었는데 Facebook Group의 글을 가져오기 위해서는 추가 검수가 필요합니다. 이 과정은 몇주의 기간이 필요합니다.
Facebook 개발자 앱이 완성되면 앱의 Access Token 코드를 확인할 수 있습니다. 이 토큰으로 Facebook의 Graph API를 사용할 수 있습니다. 이 API는 아래의 그래포 API 탐색기 페이지에서 테스트가 가능합니다.
액세스 토큰에 만든 앱의 토큰을 입력하고 GET 부분에
/{그룹ID(숫자열)}/feed?=(가져올 필드들을 쉼표로 구분)
을 명시하면 아래와 같이 그룹의 글을 JSON 형식으로 가져올 수 있습니다.
참고로 2018년 4월 부터 정책이 바뀌어 글쓴 사람의 정보는 가져올 수 없도록 변경되었습니다.
Logstash 의 http_poller
input 을 이용해서 주기적으로 피드의 글들을 가져올 수 있습니다. 아래에서 601348271241531
는 가져올 페이스북 그룹의 ID 이고 access_token=${FB_ACCESS_TOKEN}
에는 Facebook 앱의 토큰이 들어갑니다. 그룹 피드의 글을 10분마다 한번씩 ( schedule => { every => "10m" }
) 상위 20개 &limit=20"
를 가져오도록 설정했습니다.
input {
http_poller {
urls => {
es => "https://graph.facebook.com/601348271241531/feed?fields=id,name,picture,updated_time,created_time,link,from,message,story&access_token=${FB_ACCESS_TOKEN}&limit=20"
}
request_timeout => 60
schedule => {
every => "10m"
}
}
}
가져온 상위 20개의 피드 정보는 JSON 데이터의 DATA[ ]
안에 배열로 들어갑니다. 이것을 하나씩 분리 해 주기 위해 아래와 같이 Logstash filter를 설정합니다.
filter {
split {
field => "data"
}
date {
match => [ "[data][created_time]", "yyyy-MM-dd'T'HH:mm:ssZ"]
}
mutate {
remove_field => ["host","@version","request","paging","path","permalink"]
}
}
이제 output 에서 Elasticsearch 로 데이터를 입력합니다. 저는 document_id
값을 피드 글의 ID 값으로 해서 10분마다 데이터를 가져올 때 중복되는 글을 가져오게 되면 같은 ID의 글은 기존 ID에 덧씌워 지도록 했습니다.
output {
elasticsearch {
hosts => ["${ES_HOST}"]
user => "${ES_USER}"
password => "${ES_PASSWORD}"
index => "facebook-community"
document_type => "doc"
document_id => "%{[data][id]}"
}
}
이제 Facebook 의 글들이 Elasticsearch 로 색인되었기 때문에 아래와 같은 대시보드를 만들 수 있습니다.
페이스북 그룹의 개별 글들은 601329796619531_1953698474715983
와 같은 {group_id}_{feed_id}
형식의 고유 값을 가지고 있는데, 이것은 data.id
필드에 저장이 됩니다. 이 ID를 아래와 같은 링크로 브라우저에서 열면 그룹의 해당 글을 바로 열 수 있습니다.
링크로 접근이 가능합니다. 아래처럼 Kibana 의 Scripted Field 로 해서 링크 값을 만들어 줄 수 있습니다. 이렇게 하면 위 대시보드에서 열기
링크를 클릭했을 때 새 탭에서 해당 글을 바로 열 수 있습니다.