“API & Services”에 최근 “Google OAuth consent screen” 메뉴가 추가되어 Test User에 해당 사용자 전자우편을 추가하는 것이 추가되었다. 그외 다음 두가지 방식으로 “Youtube Data API v3” 사용이 가능하다.
library(tidyverse)
library(tuber)
yt_oauth(app_id = Sys.getenv("yt_client_id"),
app_secret = Sys.getenv("yt_secret"),
token = '')
get_stats(video_id = "N708P-A45D0")
먼저 경기도 성남시 분당을 선거구의 국회의원 김병욱 의원의 유튜브 채널을 살펴보자.
tuber::get_channel_stats(channel_id = "UCkKmE-matF_3iwaw-Q7BjZA")
yt_channel_info <-
yt_channel_info$statistics %>%
yt_channel_tbl <- enframe() %>%
mutate(value = map_chr(value, unlist)) %>%
pivot_wider() %>%
mutate(의원명 = "김병욱") %>%
select(의원명, everything())
yt_channel_tbl
유튜브 채널을 갖고 있는 국회의원 전체에 대해서 조회수(viewCount), 구독자(subscriberCount), 동영상수(videoCount)를 데이터로 만들어 살펴보자.
# 유튜브 채널 마스터 ---------------------------
read_rds("data/congressman/SNS_tbl.rds")
SNS_tbl <-
SNS_tbl %>%
youtube_link_raw <- filter(str_detect(링크, pattern = "youtube")) %>%
select(-사이트)
https://www.youtube.com/c/김병욱TV
와 같이 채널명(“김병욱TV”)를 채널 ID로 변환시켜야 제대로된 유튜브 채널에 대한 통계 정보를 얻을 수 있다.
https://www.youtube.com/c/김병욱TV
https://www.youtube.com/channel/UCkKmE-matF_3iwaw-Q7BjZA
library(httr)
function(channel_name = "김병욱TV") {
get_channel_id_from_channel <-
glue::glue("https://www.googleapis.com/youtube/v3/search?key={Sys.getenv('YOUTUBE_CHANNEL_APIKEY')}&part=snippet&q={channel_name}&type=channelId")
channel_request <-
GET(url = channel_request)
req_result <-
content(req_result)
req_result_list <-
# channel_id <- req_result_list$items[[1]]$id$channelId
req_result_list$items[[1]]$snippet$channelId
channel_id <-
return(channel_id)
}
get_channel_id_from_channel("황운하_국회의원")
function(user_name = "iljiam") {
get_channel_id_from_user <-
glue::glue("https://www.googleapis.com/youtube/v3/channels?key={Sys.getenv('YOUTUBE_CHANNEL_APIKEY')}&forUsername={user_name}&part=id")
channel_request <-
GET(url = channel_request)
req_result <-
content(req_result)
req_result_list <-
return(req_result_list$items[[1]]$id)
}
get_channel_id_from_user()
youtube_link_raw %>%
youtube_link_tbl <- mutate(raw_channel_id =
case_when(str_detect(링크, "channel") ~ str_remove(링크, pattern = "https://www.youtube.com/channel/"),
str_detect(링크, "user") ~ str_remove(링크, pattern = "https://www.youtube.com/user/"),
str_detect(링크, "/c/") ~ str_remove(링크, pattern = "https://www.youtube.com/c/"),
TRUE ~ str_remove(링크, pattern = "https://www.youtube.com/"))
%>%
) mutate(channel_id = ifelse(str_length(raw_channel_id) >= 24,
str_sub(raw_channel_id, start = 1L, end = 24),
%>%
raw_channel_id)) mutate(channel_type = case_when(str_length(channel_id) == 24 ~ "채널ID",
str_detect(링크, "user") ~ "사용자명",
TRUE ~ "채널명"))
## 1. https://www.youtube.com/channel/UCDFPB0rbbcRF8rgf4S1WTrQ 유형의 유튜브채널 -----
%>%
youtube_link_tbl filter(str_detect(channel_type, "채널ID")) %>%
select(의원명, channel_id) %>%
write_csv("data/congressman/channel_id.csv")
## 2. https://www.youtube.com/c/강대식tv 유형의 유튜브채널 -----
youtube_link_tbl %>%
channel_name <- filter(str_detect(channel_type, "채널명"))
map(channel_name$channel_id, get_channel_id_from_channel)
channel_name_list <-names(channel_name_list) <- channel_name$의원명
channel_name_list %>%
channel_name_tbl <- plyr::compact() %>%
enframe(name = "의원명") %>%
mutate(channel_id = map_chr(value, as.character))
%>%
channel_name_tbl select(의원명, channel_id) %>%
write_csv("data/congressman/channel_name.csv")
## 3. 문제 유형의 유튜브채널 -----
%>%
channel_name anti_join(channel_name_tbl, by = "의원명")
read_csv("data/congressman/channel_id.csv")
channel_id_tbl <- read_csv("data/congressman/channel_name.csv")
channel_name_tbl <- read_csv("data/congressman/channel_problem.csv")
channel_problem_tbl <-
bind_rows(channel_id_tbl, channel_name_tbl) %>%
yt_channel_tbl <- bind_rows(channel_problem_tbl)
%>%
youtube_link_raw anti_join(yt_channel_tbl, by = "의원명")
%>%
yt_channel_tbl write_csv("data/congressman/youtube_congress_channel_id.csv")
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com