Dec 3rd, 2018: [KR][Logstash] Facebook 그룹의 글을 Elasticsearch 로 가져오기


(Jongmin Kim) #1

내가 개발할 웹 애플리케이션 또는 모바일 앱 등에서 Facebook에 있는 피드나 기타 정보들을 가져오려면 아래의 Facebook 개발자 사이트에서 Facebook 개발자 앱을 등록해야 합니다.

https://developers.facebook.com

앱을 생성하고 나면 필요한 여러가지 설정을 해 주어야 합니다. 저는 Elastic 한국 사용자 그룹의 글을 가져오기 위해서 만들었는데 Facebook Group의 글을 가져오기 위해서는 추가 검수가 필요합니다. 이 과정은 몇주의 기간이 필요합니다.

Facebook 개발자 앱이 완성되면 앱의 Access Token 코드를 확인할 수 있습니다. 이 토큰으로 Facebook의 Graph API를 사용할 수 있습니다. 이 API는 아래의 그래포 API 탐색기 페이지에서 테스트가 가능합니다.

https://developers.facebook.com/tools/explorer

액세스 토큰에 만든 앱의 토큰을 입력하고 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를 아래와 같은 링크로 브라우저에서 열면 그룹의 해당 글을 바로 열 수 있습니다.

https://www.facebook.com/{group_id}_{feed_id}

링크로 접근이 가능합니다. 아래처럼 Kibana 의 Scripted Field 로 해서 링크 값을 만들어 줄 수 있습니다. 이렇게 하면 위 대시보드에서 열기 링크를 클릭했을 때 새 탭에서 해당 글을 바로 열 수 있습니다.