├── .gitignore
├── requirements.txt
├── templates
└── index.html
├── fb_token.py
├── README.md
├── app.py
├── fb_crawling.py
└── JTBClove.csv
/.gitignore:
--------------------------------------------------------------------------------
1 | venv
2 | __pycache__
3 | app_id.json
4 | app_secret.json
5 | app_token.json
6 | long_token.json
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | certifi==2020.12.5
2 | chardet==4.0.0
3 | click==7.1.2
4 | Flask==1.1.2
5 | idna==2.10
6 | itsdangerous==1.1.0
7 | Jinja2==2.11.2
8 | MarkupSafe==1.1.1
9 | oauthlib==3.1.0
10 | requests==2.25.1
11 | requests-oauthlib==1.3.0
12 | urllib3==1.26.2
13 | Werkzeug==1.0.1
14 |
--------------------------------------------------------------------------------
/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | facebook crawler
5 |
6 |
7 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
Facebook Page Crawler
26 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/fb_token.py:
--------------------------------------------------------------------------------
1 | import json, os
2 |
3 | def get_appid():
4 | with open('app_id.json','r') as id:
5 | app_id = json.load(id)
6 | app_id = app_id['app_id']
7 | return app_id
8 |
9 | def get_secret():
10 | with open('app_secret.json','r') as sec:
11 | app_secret = json.load(sec)
12 | app_secret = app_secret['app_secret']
13 | return app_secret
14 |
15 | def set_long_token(token):
16 | long_token=dict()
17 | long_token['token'] = token
18 | with open('long_token.json','w') as t:
19 | json.dump(long_token,t)
20 |
21 | def set_app_token(token):
22 | app_token=dict()
23 | app_token['token'] = token
24 | with open('app_token.json','w') as t:
25 | json.dump(app_token,t)
26 |
27 | def get_long_token():
28 | with open('long_token.json','r') as long:
29 | long_token = json.load(long)
30 | long_token = long_token['token']
31 | return long_token
32 |
33 | def get_app_token():
34 | with open('app_token.json','r') as app:
35 | app_token = json.load(app)
36 | app_token = app_token['token']
37 | return app_token
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Facebook-Crawler
2 | This repository is for Facebook page crawlers. The Facebook crawler is based on Facebook Graph API 4.0. It can be execute by run the Web UI based on flask at a local server. The page URL is entered, crawls on the latest 100 posts on the page, and returns results in CSV (Changeable-post number and paging), which requires API tokens issued by the user directly registering the app, and works when saved as short-term and long-term token json files. Since code for exchanging short-term tokens for long-term tokens is implemented, it is recommended that short-term tokens be exchanged for long-term tokens before being used.
3 |
4 | [can see dev seq here]
5 | https://www.notion.so/hobbeskim/facebook-Crawler-0b584062b2ef4a46acc734d9839f394a
6 |
7 | ## Have to Prepare
8 |
9 | Facebook App id : app_id.json
10 | Facebook Access Token : long_token.json # doesn't matter long or short, but needs PPCA
11 |
12 | ## Requirements
13 |
14 | - have to get public page's latest post(default:100)
15 | - have to save each post's
16 | - title
17 | - published_time
18 | - type of contents
19 | - number of comments
20 | - number of contents
21 | - each reactions(ex like, love, haha,...)
22 |
23 |
24 | ## Usage
25 | #install dependcy
26 | pip3 install -r requirements.txt
27 |
28 | #flask run
29 | flask run -p 5000
30 |
31 | ## Execution
32 | 
33 | 
34 | 
35 |
36 |
--------------------------------------------------------------------------------
/app.py:
--------------------------------------------------------------------------------
1 | import flask
2 | from flask import Flask, render_template,request,send_from_directory,abort
3 | import json
4 | import os
5 | import requests_oauthlib
6 | from requests_oauthlib.compliance_fixes import facebook_compliance_fix
7 | import urllib.request
8 | import requests
9 | import fb_crawling
10 | from fb_token import *
11 | ###################################################################
12 |
13 | ### BASIC SETTING
14 | URL = "http://localhost:5000"
15 |
16 | ## FB OBJECT SETTING
17 | FB_CLIENT_ID = get_appid()
18 | FB_CLIENT_SECRET = get_secret()
19 | FB_AUTHORIZATION_BASE_URL = "https://www.facebook.com/dialog/oauth"
20 | FB_TOKEN_URL = "https://graph.facebook.com/oauth/access_token"
21 | FB_SCOPE = ["email"]
22 |
23 | # This allows us to use a plain HTTP callback
24 | os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
25 |
26 | app = flask.Flask(__name__)
27 |
28 | ###################################################################
29 | ### 사용자가 첫번째로 보는 페이지 - 장기토큰 발급, URL 입력 후 크롤링 개시
30 | @app.route("/")
31 | def index():
32 | return render_template('index.html')
33 |
34 | ####################################################################
35 | ### Facebook session 로그인 후 토큰 교환
36 | @app.route("/fb-login")
37 | def login():
38 |
39 | ## Facebook Object loads
40 | facebook = requests_oauthlib.OAuth2Session(
41 | FB_CLIENT_ID, redirect_uri=URL + "/fb-callback", scope=FB_SCOPE
42 | )
43 | authorization_url, _ = facebook.authorization_url(FB_AUTHORIZATION_BASE_URL)
44 |
45 | return flask.redirect(authorization_url)
46 |
47 |
48 | @app.route("/fb-callback")
49 | def callback():
50 | ##facebook OAuth session setting
51 | facebook = requests_oauthlib.OAuth2Session(
52 | FB_CLIENT_ID, scope=FB_SCOPE, redirect_uri=URL + "/fb-callback"
53 | )
54 |
55 | ## we need to apply a fix for Facebook here
56 | facebook = facebook_compliance_fix(facebook)
57 |
58 | ## SHORT TOKEN SETTING FOR TOKEN EXCHANGE
59 | short_token = facebook.fetch_token(
60 | FB_TOKEN_URL,
61 | client_secret=FB_CLIENT_SECRET,
62 | authorization_response=flask.request.url,
63 | )
64 | short_token=short_token['access_token']
65 | print("SHORT TOKEN:",short_token)
66 |
67 | # Fetch a protected resource, i.e. user profile, via Graph API
68 | facebook_user_data = facebook.get(
69 | "https://graph.facebook.com/me?fields=id,name,email,picture{url}"
70 | ).json()
71 |
72 | email = facebook_user_data["email"]
73 | name = facebook_user_data["name"]
74 | picture_url = facebook_user_data.get("picture", {}).get("data", {}).get("url")
75 |
76 | ## GETTING LONG TOKEN
77 | long_token = facebook.get(
78 | f"https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id={FB_CLIENT_ID}&client_secret={FB_CLIENT_SECRET}&fb_exchange_token={short_token}"
79 | ).json()
80 | long_token=long_token['access_token']
81 | set_long_token(long_token)
82 | print("LONG TOKEN:",long_token)
83 |
84 |
85 | ## GETTING APP TOKEN
86 | app_token = facebook.get(
87 | f"https://graph.facebook.com/oauth/access_token?client_id={FB_CLIENT_ID}&client_secret={FB_CLIENT_SECRET}&grant_type=client_credentials").json()
88 |
89 | app_token=app_token['access_token']
90 | set_app_token(app_token)
91 | print("app_token: ",app_token)
92 |
93 | return f"""
94 | TOKEN REFRESHED,
95 |
96 | """
97 |
98 | @app.route("/fb-crawling",methods=['POST'])
99 | def crawling():
100 |
101 | full_URL = request.form['url']
102 |
103 | ##URL 분해
104 | page_name = full_URL.split('facebook')[1].split('/')[1]
105 |
106 | ## 크롤러 객체 생성 및 실행
107 | crawler = fb_crawling.Facebook_Crawler(page_name)
108 | crawler.start()
109 |
110 | ## 파일 클라이언트로 전송
111 | filename = page_name + '.csv'
112 | try:
113 | return send_from_directory('./', filename=filename, as_attachment=True)
114 | except FileNotFoundError:
115 | abort(404)
116 |
117 | return flask.redirect('/')
118 |
119 |
120 | if __name__ == "__main__":
121 | app.run(debug=True)
--------------------------------------------------------------------------------
/fb_crawling.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import os
3 | import json
4 | import csv
5 | from fb_token import *
6 |
7 | ####### v1.0 FACEBOOK GRAPH API BASED FACEBOOK PUBLIC PAGE CRAWLER
8 | ####### developer : receiver@kakao.com
9 | ####### MIT license
10 | class Facebook_Crawler(object):
11 |
12 | def __init__(self,id):
13 |
14 | print("Crawler initiating...")
15 | self.token = get_long_token() # token : short or long token can run
16 | self._id = id # id : page URL to crawl
17 | self.data_list = [] # data_list : crawled data saved list
18 | self._page_limit = 10 # page_limit : API paging for single request
19 |
20 | @property
21 | def id(self):
22 | return self._page_limit
23 |
24 | @id.setter
25 | def id(self,value):
26 | self._id = value
27 |
28 | @property
29 | def page_limit(self):
30 | return self._page_limit
31 |
32 | @page_limit.setter
33 | def page_limit(self,value):
34 | self._page_limit = value
35 |
36 |
37 | # Creating URL for crawling
38 | # input token, id , return full_query
39 | def create_URL(self, token, id):
40 |
41 | BASE_URL = "https://graph.facebook.com/v4.0/"
42 |
43 | query_piece = [ # all this query depend on FACEBOOK GRAPH API v4.0
44 | 'created_time', 'attachments', 'comments.summary(total_count)', 'sares', 'reactions.type(LIKE).limit(0).summary(true).as(like)',
45 | 'reactions.type(LOVE).limit(0).summary(true).as(love)',
46 | 'reactions.type(WOW).limit(0).summary(true).as(wow)',
47 | 'reactions.type(HAHA).limit(0).summary(true).as(haha)',
48 | 'reactions.type(SAD).limit(0).summary(true).as(sad)',
49 | 'reactions.type(ANGRY).limit(0).summary(true).as(angry)',
50 | 'reactions.type(THANKFUL).limit(0).summary(true).as(thankful)'
51 | ]
52 |
53 | full_query = BASE_URL + id + f"/posts?limit={self._page_limit}&fields=" #page limit default is 10(posts)
54 | full_query = full_query + ",".join(query_piece) # query piece adding
55 | full_query = full_query + f"&access_token={token}" # token setting
56 |
57 | return full_query
58 |
59 | # 입력된 URL에 대해 request를 받고 response를 받는 함수
60 | # input URL , return response(json), next_page_link
61 | def request_URL(self, URL):
62 |
63 | try:
64 | # getting link from FACEBOOK API
65 | response = requests.get(URL)
66 | # logging
67 | print("request_URL : got response", response)
68 | # from response extract next page
69 | # page 끝에 도달하면 next 없음..!!
70 | if 'next' in response.json()['paging']:
71 | next_page_link = response.json()['paging']['next']
72 | else:
73 | next_page_link = None
74 |
75 | except:
76 | print("request_URL : some error occured!")
77 |
78 | # tuple로 반환
79 | return response.json(), next_page_link
80 |
81 | # 단일 페이지로부터 필요한 정보 parse하는 함수
82 | # input page(json), return page_data_list # on single page
83 | def parse_json(self, page_json):
84 |
85 | page_data_list = []
86 | page_json['data']
87 |
88 | for post in page_json['data']:
89 | post_created_time = post['created_time']
90 | # post 없는 경우 예외처리
91 | if 'title' in post['attachments']['data'][0]:
92 | post_title = post['attachments']['data'][0]['title'] # title
93 | else:
94 | # post_title
95 | if 'decription' in post['attachments']['data'][0]:
96 | post_title = post['attachments']['data'][0]['description']
97 | else:
98 | post_title = None
99 |
100 | post_type = post['attachments']['data'][0]['type'] # type
101 | # number of comments
102 | print(post['comments']['summary']['total_count'])
103 | if 'shares' in post:
104 | post_shares = post['shares']['count'] # number of shares
105 | else:
106 | post_shares = 0
107 | post_like = post['like']['summary']['total_count']
108 | post_love = post['love']['summary']['total_count']
109 | post_wow = post['wow']['summary']['total_count']
110 | post_haha = post['haha']['summary']['total_count']
111 | post_sad = post['sad']['summary']['total_count']
112 | post_angry = post['angry']['summary']['total_count']
113 | post_thankful = post['thankful']['summary']['total_count']
114 | data = [post_created_time, post_title, post_type, post_shares, post_like,
115 | post_love, post_wow, post_haha, post_sad, post_angry, post_thankful]
116 | page_data_list.append(data)
117 | print(page_data_list)
118 | return page_data_list
119 |
120 | # 페이지에서 얻어온 데이터 리스트를 병합하는 함수
121 | # input data_list, page_data_list, return data_list
122 | def combine_data_list(self, data_list, page_date_list):
123 | data_list = data_list + page_date_list
124 | return data_list
125 |
126 | # 최종적으로 생성된 데이터 리스트에 대해 CSV로 전환해주는 함수
127 | # input id, return data_list
128 | def convert_to_csv(self, id, data_list):
129 |
130 | with open(f'./{id}.csv', 'w', encoding='utf-8-sig', newline='') as f:
131 | writer = csv.writer(f)
132 | writer.writerow(['post_created_time', 'post_title', 'post_type', 'post_shares', 'post_like',
133 | 'post_love', 'post_wow', 'post_haha', 'post_sad', 'post_angry', 'post_thankful'])
134 | for data in enumerate(data_list):
135 | if(data[0] <= 100):
136 | writer.writerow(data[1])
137 | print("ALL DONE")
138 |
139 |
140 | # 크롤링 시작
141 | def start(self):
142 | try:
143 | #최초 URL 생성
144 | URL = self.create_URL(self.token, self._id)
145 | print("URL requesting :",URL)
146 |
147 | # 처음 페이지에 대해 request
148 | response, next_page_link = self.request_URL(URL)
149 | print("link : ",next_page_link)
150 | json_listed = self.parse_json(response)
151 | data_list =self.combine_data_list(self.data_list,json_listed)
152 |
153 | while True :
154 | # 다음 페이지 유효성 검사
155 | if (next_page_link != None)and(len(data_list)<=100):
156 | print("next page requesting...")
157 | response,next_page_link = self.request_URL(next_page_link)
158 | json_listed = self.parse_json(response)
159 | data_list = self.combine_data_list(data_list,json_listed)
160 | else:
161 | break
162 |
163 | self.convert_to_csv(self._id,data_list)
164 | except:
165 | print("some error occured!")
166 |
167 |
168 | if __name__ == "__main__":
169 | page_name = input()
170 | facebook_crawler = Facebook_Crawler(page_name)
171 | facebook_crawler.page_limit = 50
172 | facebook_crawler.start()
173 |
--------------------------------------------------------------------------------
/JTBClove.csv:
--------------------------------------------------------------------------------
1 | post_created_time,post_title,post_type,post_shares,post_like,post_love,post_wow,post_haha,post_sad,post_angry,post_thankful
2 | 2021-01-15T05:15:43+0000,,photo,0,1,0,0,0,0,0,0
3 | 2021-01-15T05:00:00+0000,"[괴물] 티저🦠 신하균x여진구, '만양'에서 만난 두 남자의 이야기 〈괴물〉 2월 첫 방송!",video_inline,0,5,0,0,0,0,0,0
4 | 2021-01-15T04:00:01+0000,[비긴어게인 오픈마이크] 이하이(LeeHi) 잔나비(JANNABI)의 첫 듀엣곡 '사랑하기 때문에'♬,video_inline,0,31,7,1,0,0,0,0
5 | 2021-01-15T03:00:00+0000,현재 이 콘텐츠를 이용할 수 없습니다,native_templates,0,10,3,1,0,0,0,0
6 | 2021-01-15T02:00:01+0000,[런 온] (드디어 1일🎉) 서로의 진심이 통한 임시완💗신세경의 입맞춤|JTBC 210114 방송,video_inline,0,19,1,0,0,0,0,0
7 | 2021-01-14T09:00:00+0000,[10회 예고] 오미주 씨의 감정이 연애 감정은 맞나? 나는 그런데..,video_inline,0,58,11,1,0,0,0,0
8 | 2021-01-14T06:00:01+0000,"[아는 형님-형.친.소] ♨️열정 가득♨️ 뜨거운 전학생들, 유노윤호 x 딘딘이 형님 학교에 전학 왔습니다~",video_inline,0,61,21,1,0,0,0,0
9 | 2021-01-14T05:00:01+0000,[허쉬] 7화 메이킹 | H.U.S.H 팀의 저 세상 맛🤯 체험기,video_inline,0,18,3,0,0,0,0,0
10 | 2021-01-14T04:00:00+0000,"[선배, 그 립스틱 바르지 마요] 메이킹💕 난이도 극상♨️ 원진아 X 로운의 '밸런스 게임' 둘 중 하나만 PICK!",video_inline,0,37,0,0,0,0,0,0
11 | 2021-01-14T03:00:02+0000,[런 온] Jtalk 인터뷰_겸미커플 편💕 임시완X신세경의 대유잼 밸런스 게임 (ft. 런 온 키워드),video_inline,0,54,4,1,0,0,0,0
12 | 2021-01-14T02:00:00+0000,"[런 온] 임시완의 직진 고백 "나 계속하고 있어요, 좋아해 달라면서요··"|JTBC 210113 방송",video_inline,0,39,2,1,0,0,0,0
13 | 2021-01-13T09:00:00+0000,"[9회 예고] 나, 계속 그거 하고 있어요. 좋아해 달라면서요...",video_inline,0,80,8,1,0,0,0,0
14 | 2021-01-13T08:49:41+0000,,photo,0,26,2,0,0,0,0,0
15 | 2021-01-13T04:00:00+0000,[런 온] 단화ON🔴코멘터리🏃 단화 커플의 이야기는 여기서부터 시작입니다❤️ 최수영X강태오의 7-8회 코멘터리!,video_inline,0,39,4,0,0,0,0,0
16 | 2021-01-13T03:00:00+0000,"[선배, 그 립스틱 바르지 마요] 메이킹💄 자아 혼동이 온 캐릭터 인터뷰!💜 #08호 의식의 흐름샤랄라",video_inline,0,48,4,1,0,0,0,0
17 | 2021-01-13T02:00:00+0000,[배달가요-신비한 레코드샵] 티저🎵 사연을 보내주시면 노래를 배달해드립니다💨 1월 22일 (금) 9시 첫 방송,video_inline,0,33,4,0,0,0,0,0
18 | 2021-01-12T09:30:00+0000,[허쉬] 메이킹💕 사직서에 싸늘해진 준혁💦과 지수🤨의 비하인드 | <허쉬> 6화 메이킹,video_inline,0,22,3,0,0,0,0,0
19 | 2021-01-12T09:00:01+0000,[라이브온] 최종회 예고,video_inline,0,82,18,1,0,0,0,0
20 | 2021-01-12T07:00:00+0000,[런 온] 메이킹💕 '박력' 신세경에 심쿵한 임시완🧡 영화관부터 뒷풀이까지 8회 비하인드!,video_inline,0,51,8,1,0,0,0,0
21 | 2021-01-12T03:00:02+0000,[런 온] 메이킹/셀프캠💕 제주도에서 제일 예쁜 건 '신세경'이라 답한 임시완! 제주도 셀프캠 Ep.3 겸미커플🧡,video_inline,0,76,10,1,0,0,0,0
22 | 2021-01-12T02:10:00+0000,[싱어게인] (단체 소름😱) 내한 공연을 보는 듯한 29호 가수의 〈못다핀 꽃한송이〉♬|JTBC 210111 방송,video_inline,0,733,18,3,0,1,0,0
23 | 2021-01-11T06:00:00+0000,"[선배, 그 립스틱 바르지 마요] 단독 하이라이트💕 ""더는 못 참겠어요 이제, 지키고 싶으니까"" | 2021년 1월 18일(월) 첫 방송!",video_inline,0,138,16,1,0,0,0,0
24 | 2021-01-11T05:00:00+0000,[뭉쳐야 찬다] 골대 구석을 노리고 정확히 들어가는 이대훈 쐐기 골⚽|JTBC 210110 방송,video_inline,0,62,3,1,0,0,0,0
25 | 2021-01-11T04:00:00+0000,[아는 형님] SM 신인 걸그룹 '에스파' 뮤비에 출연한 장윤주 (블랙맘바🐍)|JTBC 210109 방송,video_inline,0,211,7,0,0,0,0,0
26 | 2021-01-11T03:30:00+0000,[1호가 될 순 없어] 사돈 조작단 결성?! 짓궃은 이용식-임미숙의 동영 몰이 //_//|JTBC 210110 방송,video_inline,0,316,3,0,19,0,1,0
27 | 2021-01-11T03:00:00+0000,[허쉬] 황정민이 마주친 낯익은 여인의 정체 = 매일한국 사장의 조카...!|JTBC 210109 방송,video_inline,0,24,2,0,0,0,0,0
28 | 2021-01-11T02:00:00+0000,[갬성캠핑] 에필로그😢 캠퍼들의 마지막 밤💫 "우린 계속 볼 거니까…"|JTBC 210108 방송,video_inline,0,56,6,1,0,0,0,0
29 | 2021-01-10T08:00:00+0000,[1호가 될 순 없어] 33회 예고,video_inline,0,34,4,0,0,0,0,0
30 | 2021-01-10T06:00:00+0000,[뭉쳐야 찬다] 79회 예고,video_inline,0,25,4,0,0,0,0,0
31 | 2021-01-10T02:00:00+0000,"[다시봐야지] 천서진,, 완전 딴 사람 아냐,, 소신껏 할 말 다 하는 김소연 비정상회담 끌올🔼🔼|비정상회담|JTBC 150330 방송",video_inline,0,50,3,0,0,0,0,0
32 | 2021-01-09T06:00:00+0000,[아는 형님] 263회 예고,video_inline,0,129,6,1,2,0,0,0
33 | 2021-01-09T04:00:00+0000,[방구석1열] 139회 예고,video_inline,0,28,0,0,0,0,0,0
34 | 2021-01-08T10:00:01+0000,[7회 예고] 들이대신 김에… 끝까지 들이대시죠,video_inline,0,41,0,0,0,0,0,0
35 | 2021-01-08T09:00:01+0000,[갬성캠핑] 최종회 12회 예고,video_inline,0,30,6,0,0,0,0,0
36 | 2021-01-08T08:00:01+0000,"[아는 형님 | 훈수대통] 티저👨🏫 ""모든 훈수를 담다"" 서장훈 x 이수근의 <훈수대통> 1/16(토) 첫 공개!",video_inline,0,43,2,0,1,0,0,0
37 | 2021-01-08T07:00:01+0000,[팬텀싱어 올스타전] 메이킹🎆 시즌3 올스타팀 | 귀로 듣는 고품격 감성 멜로드라마 <레떼아모르>,video_inline,0,25,3,0,0,0,0,0
38 | 2021-01-08T06:00:00+0000,"[팬텀싱어 올스타전] 메이킹🎆 시즌3 올스타팀 | 한 편의 시 같은 울림, 성악 어벤져스 <라포엠>",video_inline,0,12,1,0,0,0,0,0
39 | 2021-01-08T05:30:00+0000,현재 이 콘텐츠를 이용할 수 없습니다,native_templates,0,16,2,0,0,0,0,0
40 | 2021-01-08T05:00:00+0000,"[선배, 그 립스틱 바르지 마요] 메이킹💄 현승이가 소개해 주는 회사 '끌라르'! 내돈내산 왓츠인마이오피스💜 #07호 나도 입사할래",video_inline,0,29,7,0,0,1,0,0
41 | 2021-01-08T04:30:00+0000,[런 온] 메이킹🏃 선긋는 임시완에 서운함 폭발한 신세경 7회 비하인드!,video_inline,0,36,4,0,0,0,0,0
42 | 2021-01-08T04:00:00+0000,"[런 온] 메이킹🏃 ""그건 이미 하고 있는데...🧡"" 임시완X신세경의 설렘 과다 6회 엔딩 비하인드!",video_inline,0,38,9,0,0,0,0,0
43 | 2021-01-08T03:00:01+0000,[런 온] (서럽ㅜ_ㅜ) 아픈 신세경 보호자 노릇 톡톡히! 하는 임시완💕|JTBC 210107 방송,video_inline,0,63,1,0,0,0,0,0
44 | 2021-01-08T01:35:00+0000,"[괴물] 신하균x여진구, 우리 중 괴물은 누구인가·· 〈괴물〉 2월 첫 방송!",video_inline,0,226,53,8,0,0,0,0
45 | 2021-01-07T09:00:00+0000,"[8회 예고] 기선겸 씨 싫다고 한거 아니에요, 나 싫어하지 마요···",video_inline,0,54,10,0,0,0,0,0
46 | 2021-01-07T08:30:01+0000,[런 온] 티저 무더빙 ver.🍷 화제의 카사블랑카신🧡 임시완X신세경 비주얼 포텐 터진 <런 온 RUN ON> 티저 비하인드!,video_inline,0,31,4,0,0,0,0,0
47 | 2021-01-07T08:00:01+0000,[허쉬] 메이킹✒ 사회부에 가면 퇴근은 없고😢 경우는 있다💕 | <허쉬> 5화 메이킹,video_inline,0,19,2,0,0,0,0,0
48 | 2021-01-07T07:30:01+0000,"[비긴어게인 오픈마이크] 소향(Sohyang)X신용재(Shin Yong Jae) '어떻게 이별까지 사랑하겠어, 널 사랑하는 거지'♬",video_inline,0,371,23,0,0,0,0,0
49 | 2021-01-07T07:00:00+0000,[아는 형님-형.친.소] ((예능 열정 ON)) ‘문소리 x 김선영 x 장윤주’ 세 자매가 형님 학교에 전학 왔습니다!,video_inline,0,43,2,0,0,0,0,0
50 | 2021-01-07T06:00:00+0000,[팬텀싱어 올스타전] 메이킹🎆 시즌2 올스타팀 | 유니크함으로 승부하는 크로스오버계의 아이돌 <포레스텔라>,video_inline,0,23,3,0,0,0,0,0
51 | 2021-01-07T05:30:00+0000,[팬텀싱어 올스타전] 메이킹🎆 시즌2 올스타팀 | 탄탄한 4성부의 호소력 짙은 하모니 <에델 라인클랑>,video_inline,0,17,3,0,0,0,0,0
52 | 2021-01-07T05:00:00+0000,[팬텀싱어 올스타전] 메이킹🎆 시즌2 올스타팀 | 파워와 에너지가 넘치는 압도적 클라스 <미라클라스>,video_inline,0,12,1,0,0,0,0,0
53 | 2021-01-07T04:00:00+0000,"[선배, 그 립스틱 바르지 마요] 송아's Vlog | 후배의 뜻밖의 사랑 고백😳..?! 회사 후배 현승씨를 소개합니다!",video_inline,0,67,4,0,0,0,0,0
54 | 2021-01-07T03:00:01+0000,[서울엔 우리집이 없다] 로망 of 로망 '다락방 침실'을 구현한 인테리어🌟|JTBC 210106 방송,video_inline,0,45,3,0,0,0,0,0
55 | 2021-01-07T02:00:00+0000,[런 온] 커져만 가는 오해… 툭하면 선 긋는 임시완에게 서운한 신세경😥|JTBC 210106 방송,video_inline,0,24,0,0,0,0,0,0
56 | 2021-01-06T10:00:01+0000,[서울엔 우리집이 없다] 11회 예고,video_inline,0,21,2,0,0,0,0,0
57 | 2021-01-06T09:00:00+0000,"[7회 예고] 서대표 결혼시킬 거야, 선겸이랑…",video_inline,0,63,3,0,0,0,0,0
58 | 2021-01-06T08:30:00+0000,[런 온] 단화ON🔴코멘터리💕 영화를 심쿵하게 만든 단아 대표님의 명대사 탄생⭐ 최수영X강태오의 5-6회 코멘터리!,video_inline,0,31,2,0,0,0,0,0
59 | 2021-01-06T08:30:00+0000,[런 온] 겸미ON🔴코멘터리💕 뭐야 뭐야 이 분위기 뭐야~@@ 6회 엔딩 과몰입 중❤️ 임시완X신세경의 5-6회 코멘터리!,video_inline,0,29,3,0,0,0,0,0
60 | 2021-01-06T08:00:02+0000,[런 온] 메이킹🏃🏻 미주네 입성한 선겸! 우리집으로 가자🧡 서로의 패턴을 맞춰나가는 6회 비하인드!,video_inline,0,45,5,0,0,0,0,0
61 | 2021-01-06T07:00:00+0000,"[라이브온] 메이킹💕 수련회 다녀온 6인방! 피자집, 육교 비하인드💚 LIVE ON #6",video_inline,0,55,31,1,0,0,0,0
62 | 2021-01-06T06:00:00+0000,[팬텀싱어 올스타전] 메이킹🎆 시즌1 올스타팀 | 한 편의 느와르가 떠오르는 강렬한 네 남자 <흉스프레소>,video_inline,0,15,1,0,0,0,0,0
63 | 2021-01-06T05:00:00+0000,현재 이 콘텐츠를 이용할 수 없습니다,native_templates,0,22,3,0,0,0,0,0
64 | 2021-01-06T04:00:00+0000,[팬텀싱어 올스타전] 메이킹🎆 시즌1 올스타팀 | 클래식 크로스오버의 장인 <포르테 디 콰트로>,video_inline,0,15,2,0,0,0,0,0
65 | 2021-01-06T03:00:01+0000,[팬텀싱어 올스타전] 티저🔥 시즌3 - 〈팬텀싱어 올스타전〉에서 부르고 싶은 노래는? 2021년 1월 첫 방송!,video_inline,0,21,1,0,0,0,0,0
66 | 2021-01-06T02:00:00+0000,"[선배, 그 립스틱 바르지 마요] 통합 3초 티저💕 '선배, 그 립스틱 바르지 마요💄' 3초 티저 개수는 몇 개?!",video_inline,0,70,3,1,0,0,0,0
67 | 2021-01-05T09:00:00+0000,[팬텀싱어 올스타전] 티저🔥 시즌2 - 〈팬텀싱어 올스타전〉에서 부르고 싶은 노래는? 2021년 1월 첫 방송!,video_inline,0,29,3,0,0,0,0,0
68 | 2021-01-05T08:00:00+0000,[팬텀싱어3 스페셜 콘서트] 예고,video_inline,0,39,1,3,0,0,0,0
69 | 2021-01-05T07:00:01+0000,[비긴어게인 오픈마이크] 감탄을 부르는 이하이(LeeHi)의 'Honey'♬,video_inline,0,111,1,0,0,0,0,0
70 | 2021-01-05T06:00:00+0000,[런 온] Jtalk 인터뷰_신세경 편😍 신세경이 뽑은 〈런 온〉 '겸미 커플'의 최고의 장면은?!,video_inline,0,45,11,1,0,0,0,0
71 | 2021-01-05T05:00:01+0000,[런 온] 겸미단화CAM💕 막내 찜쪄먹기에 진심인 제주도 셀프캠 Ep.2 임시완X신세경X최수영X강태오🧡,video_inline,0,41,4,1,0,0,0,0
72 | 2021-01-05T04:00:00+0000,"[허쉬] 스페셜✨ 예의 좀 잡수셔~ 임윤아 후배, 그런 눈깔👀로 쳐다보지 마요 | JTBC 201226 방송 외",video_inline,0,53,4,0,0,0,1,0
73 | 2021-01-05T03:00:00+0000,[싱어게인] (입이 쩌-억😱) 소름 돋는 고음 폭발↗ 29호 가수의 〈제발〉♬|JTBC 210104 방송,video_inline,0,950,20,2,0,0,0,0
74 | 2021-01-05T02:00:00+0000,[싱어게인] 하나의 멋진 공연 같은 '너도 나도 너드'의 〈우리의 밤은 당신의 낮보다 아름답다〉♬|JTBC 210104 방송,video_inline,0,589,36,0,0,0,0,0
75 | 2021-01-04T10:00:00+0000,[팬텀싱어 올스타전] 티저🔥 시즌1 - 〈팬텀싱어 올스타전〉에서 부르고 싶은 노래는? 2021년 1월 첫 방송!,video_inline,0,29,0,0,0,0,0,0
76 | 2021-01-04T09:00:01+0000,[싱어게인] 7회 예고,video_inline,0,79,2,0,0,0,0,0
77 | 2021-01-04T08:00:00+0000,[런 온] 메이킹🏃 신세경에게 한달음에 달려간 임시완🧡 겸미 커플 5회 비하인드!,video_inline,0,50,3,1,0,0,0,0
78 | 2021-01-04T07:00:00+0000,현재 이 콘텐츠를 이용할 수 없습니다,native_templates,0,31,0,0,0,0,0,0
79 | 2021-01-04T06:00:01+0000,[허쉬] 메이킹✒ 추우면 회사 안가🛌 직장인 연말연시ver.| <허쉬> 밸런스 게임🎮,video_inline,0,40,4,0,0,0,0,0
80 | 2021-01-04T05:00:00+0000,[1호가 될 순 없어] (울컥) 심형래가 부르는 가슴 뭉클한 〈하얀 나비〉♬|JTBC 210103 방송,video_inline,0,46,0,0,0,0,0,0
81 | 2021-01-04T04:00:01+0000,[뭉쳐야 찬다] (나이스😆) 사각지대마저 뚫어 버린 이대훈 ☆역전 골★|JTBC 210103 방송,video_inline,0,112,3,1,0,0,0,0
82 | 2021-01-04T03:00:00+0000,[아는 형님] 두 레전드의 만남🕺🏻 비x박진영의 〈나로 바꾸자〉🎵|JTBC 210102 방송,video_inline,0,961,34,5,1,0,0,0
83 | 2021-01-04T02:00:00+0000,[갬성캠핑] (역시 금손👍) 송민호의 개성 가득한 캐리커처 선물🎁|JTBC 210101 방송,video_inline,0,256,19,0,12,0,0,0
84 | 2021-01-03T08:00:00+0000,[1호가 될 순 없어] 32회 예고,video_inline,0,11,0,0,2,0,0,0
85 | 2021-01-03T06:00:01+0000,[뭉쳐야 찬다] 78회 예고,video_inline,0,6,3,0,0,0,0,0
86 | 2021-01-03T04:00:00+0000,[새벽시] 일 핑계로 나에게 소홀해진 남친과 다툰 후 #현명한_화해 #멜로가체질 #새벽시 #JTBC봐야지,video_inline,0,10,0,0,0,0,0,0
87 | 2021-01-03T02:00:02+0000,"[새벽시] ""매번 아름다울 순 없어"" 우울한 천우희 위로하는 안재홍 (feat. 미역국라면) #멜로가체질 #새벽시 #JTBC봐야지",video_inline,0,1,0,0,0,0,0,0
88 | 2021-01-02T06:00:00+0000,[아는 형님] 262회 예고,video_inline,0,34,3,0,0,0,0,0
89 | 2021-01-02T04:00:00+0000,현재 이 콘텐츠를 이용할 수 없습니다,native_templates,0,156,6,0,1,0,0,0
90 | 2021-01-02T02:00:00+0000,"[골라봐야지] 아는형님 외국어영역✍️ ""영어로 질문만 가능해요 저희는. 뭐래?"" 호동이가 제일 신난 수업 시간ㅋㅋㅋㅋ",video_inline,0,446,14,0,2,1,1,0
91 | 2021-01-01T07:00:00+0000,[갬성캠핑] 11회 예고,video_inline,0,97,2,0,0,0,0,0
92 | 2021-01-01T06:00:00+0000,"[제35회 골든디스크] 후보자 종합🏆 디지털 음원 부문, 음반 부문, 신인상",video_inline,0,27,3,2,0,0,0,0
93 | 2021-01-01T05:00:01+0000,[우주힙쟁이│10회 예고] 힙합 레전드들의 〈한량〉 뮤직비디오 리액션 大공개🤟🏻,video_inline,0,29,1,0,0,0,0,0
94 | 2021-01-01T04:00:01+0000,[런 온] 몰아보기 스페셜🎉 단 10분만 투자하면 🦊겸미커플🐰의 〈런 온〉 1-4회 완벽 정복 가능,video_inline,0,88,9,0,0,0,0,0
95 | 2021-01-01T03:00:01+0000,[런 온] 겸미ON🔴코멘터리👀 선겸이와 미주가 직접 이야기하는 겸미 관계의 터닝 포인트 장면! 임시완X신세경의 3-4회 코멘터리!,video_inline,0,29,0,0,0,0,0,0
96 | 2021-01-01T02:00:00+0000,[런 온] 겸미ON🔴코멘터리👀 선겸이와 미주가 직접 이야기하는 겸미 관계의 터닝 포인트 장면! 임시완X신세경의 3-4회 코멘터리!,video_inline,0,47,2,1,0,0,0,0
97 | 2021-01-01T00:00:28+0000,2021년 1월 1일 '신년'…JTBC와 함께,video_inline,0,13,1,0,0,0,0,0
98 | 2020-12-31T09:00:00+0000,"[6회 예고] 우리 집 가고 싶어서 왔구나? 갑시다, 우리 집",video_inline,0,71,5,1,0,0,0,0
99 | 2020-12-31T07:00:00+0000,[아는 형님-형.친.소] ★춤의 제왕들★ 박진영 x 비가 형님 학교에 전학 왔습니다!,video_inline,0,208,9,0,1,0,1,0
100 | 2020-12-31T06:00:00+0000,"[선배, 그 립스틱 바르지 마요] 메이킹🎉 캐릭터 포스터 촬영 현장 💜효주💜 #06호 숨겨도 트윙클 어쩌나",video_inline,0,38,3,1,0,0,0,0
101 | 2020-12-31T05:00:01+0000,"[선배, 그 립스틱 바르지 마요] 메이킹🎉 캐릭터 포스터 촬영 현장 💜재신💜 #05호 섹시큐티 알았엉",video_inline,0,22,2,1,0,0,0,0
102 | 2020-12-31T04:00:01+0000,[팬텀싱어 올스타전] 🎧 라포엠x흉스프레소x미라클라스의 '말하는 대로'♬ | 2021년 1월 첫 방송,video_inline,0,29,3,0,0,0,0,0
103 |
--------------------------------------------------------------------------------