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

**URL:** <https://discuss.elastic.co/t/dec-3rd-2018-kr-logstash-facebook-elasticsearch/158977>\
**Category:** Advent Calendar\
**Created:** [December 3, 2018, 8:00am UTC](https://discuss.elastic.co/t/dec-3rd-2018-kr-logstash-facebook-elasticsearch/158977 "2018-12-03T08:00:14Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![kimjmin](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/kimjmin/32/15223_2.png) [@kimjmin](https://discuss.elastic.co/u/kimjmin)\
**Post date:** [December 3, 2018, 8:00am UTC](https://discuss.elastic.co/t/dec-3rd-2018-kr-logstash-facebook-elasticsearch/158977/1 "2018-12-03T08:00:14Z")

</div>

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

> [https://developers.facebook.com](https://developers.facebook.com)

> **[Meta for Developers](https://developers.facebook.com)**
>
> Code to connect people with Facebook for Developers. Explore AI, business tools, gaming, open source, publishing, social hardware, social integration, and virtual reality. Learn about Facebook’s global programs to educate and connect developers.

 ![08](https://us1.discourse-cdn.com/elastic/original/3X/7/f/7f75efc816e017240459036e8bb47876a14bf0c8.jpeg)

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

 ![40](https://us1.discourse-cdn.com/elastic/original/3X/c/1/c1eaca74fa245c897652d255cfa654f74a6aa542.png)

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

> [Graph API Explorer - Meta for Developers](https://developers.facebook.com/tools/explorer)

액세스 토큰에 만든 앱의 토큰을 입력하고 GET 부분에

> /{그룹ID(숫자열)}/feed?=(가져올 필드들을 쉼표로 구분)

을 명시하면 아래와 같이 그룹의 글을 JSON 형식으로 가져올 수 있습니다.

 ![49](https://us1.discourse-cdn.com/elastic/original/3X/2/1/21e11e024449a0aedde1a3cf91679a072090b6d0.png)

참고로 2018년 4월 부터 정책이 바뀌어 글쓴 사람의 정보는 가져올 수 없도록 변경되었습니다.

Logstash 의 `http_poller` input 을 이용해서 주기적으로 피드의 글들을 가져올 수 있습니다. 아래에서 `601348271241531` 는 가져올 페이스북 그룹의 ID 이고 `access_token=${FB_ACCESS_TOKEN}` 에는 Facebook 앱의 토큰이 들어갑니다. 그룹 피드의 글을 10분마다 한번씩 (` schedule => { every => "10m" }`) 상위 20개 `&limit=20"` 를 가져오도록 설정했습니다.

```auto
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를 설정합니다.

```auto
﻿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에 덧씌워 지도록 했습니다.

```auto
output {
  elasticsearch {
    hosts => ["${ES_HOST}"]
    user => "${ES_USER}"
    password => "${ES_PASSWORD}"
    index => "facebook-community"
    document_type => "doc"
    document_id => "%{[data][id]}"
  } 
}

```

이제 Facebook 의 글들이 Elasticsearch 로 색인되었기 때문에 아래와 같은 대시보드를 만들 수 있습니다.

 ![08](https://us1.discourse-cdn.com/elastic/original/3X/0/3/032abfa449f6383bf2f95f95d65399f6f5ed2e81.png)

페이스북 그룹의 개별 글들은 `601329796619531_1953698474715983` 와 같은 `{group_id}_{feed_id}` 형식의 고유 값을 가지고 있는데, 이것은 `data.id` 필드에 저장이 됩니다. 이 ID를 아래와 같은 링크로 브라우저에서 열면 그룹의 해당 글을 바로 열 수 있습니다.

> [Facebook](https://www.facebook.com/%7Bgroup_id%7D_%7Bfeed_id%7D)

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

 ![37](https://us1.discourse-cdn.com/elastic/original/3X/0/3/03fe4e2fb880fe7300ce864c3177805a09cb8ff2.png)

---

<div class="post-metadata">

**Author:** ![warkolm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/warkolm/32/39224_2.png) [@warkolm](https://discuss.elastic.co/u/warkolm)\
**Post date:** [December 1, 2019, 10:36pm UTC](https://discuss.elastic.co/t/dec-3rd-2018-kr-logstash-facebook-elasticsearch/158977/2 "2019-12-01T22:36:17Z")

</div>


