├── .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 |
27 |

28 | 29 | 30 | 31 |
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 | ![ui](https://user-images.githubusercontent.com/57410044/104693306-c5a52e80-574c-11eb-96c3-e4155d5ac92d.png) 33 | ![runlog](https://user-images.githubusercontent.com/57410044/104693316-c938b580-574c-11eb-9eea-c6dfd036b76c.png) 34 | ![result](https://user-images.githubusercontent.com/57410044/104693330-cc33a600-574c-11eb-84db-68881a6c3361.png) 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 | --------------------------------------------------------------------------------