엑셀에서 실시간으로 유튜브 채널들의 구독자수, 조회수 등을 모니터링하는 예제입니다.
>> 관련: 지식인
유튜브 구독자수를 구글 API를 이용해서 가져와서 60초, 5분 등 특정 시간마다 갱신하도록 할 수 있습니다.
일반적인 크롤링으로는 45K, 1.6M 등 정확한 구독자수가 안나오기도 하고 서버에 접속하는데도 시간이 더 걸리기 때문에 구글에서 제공하는 정식 API를 이용하는 것이 좋겠습니다.
1.일단 https://console.cloud.google.com/apis/dashboard 에서 구글 API 키를 발급받아야 합니다.
참고 : 링크
- 라이브러리에서 'YouTube Data API v3' 를 선택하고 '사용'을 눌러 활성화시켜야 합니다.
- 그리고 사용자 인증정보 > +사용자 인증정보 만들기 를 눌러서 API키를 발급받으세요.
2. 엑셀에서 B2 셀부터 아래로 유튜브 계정아이디를 쭉 적습니다.
API로 조회할 때 채널ID로도 조회할 수 있지만 계정 아이디가 좀 더 알기 쉽습니다.
3. 코드를 추가합니다.
Alt-F11 을 누르고 개발도구 코드창을 엽니다.
1) JSON 라이브러리를 사용하므로
링크의 파일에서 JsonBag.cls 파일의 압축을 풀어서 클래스 모듈로 드래그&드랍합니다.
JsonBag Treeview.zip 파일을 다운 받아서 JsonBag.cls 파일을 압축을 풀어서 프로젝트 창으로 드래그 합니다.
2) 현재 통합 문서를 누르고 아래 코드를 넣습니다.
엑셀파일이 열리자 마자 정보를 가져오고 반복 갱신하도록 타이머를 추가하는 역할입니다.
Option Explicit
Private Sub Workbook_Open()
zStartTimer
End Sub
3) 삽입 > 모듈을 추가하고 아래 코드를 붙여넣습니다.
Option Explicit
Const API_KEY = "Your Google API KEY ==== 40 Chars ====="
'Const API_KEY = "***************************************" '40 Chars
'1) Visit 'https://console.cloud.google.com/apis/dashboard.'
'2) Create a project with the default name.
'3) Allow the library called 'YouTube Data API v3'
'4) Generate your API KEY by 'Add user authentification.'
Dim Http As Object 'MSXML2.ServerXMLHTTP60 ' Object
'Dim Html As New MSHTML.HTMLDocument
Dim JSON As New JsonBag
Dim LastCall As Date '가장 최근 실행시간
Sub getYoutubeStats()
Dim sht As Worksheet
Dim lastRow As Range, rng As Range
Set Http = CreateObject("MSXML2.ServerXMLHttp")
Set sht = ActiveSheet
Set lastRow = sht.Cells(sht.Rows.Count, "B").End(xlUp)
If lastRow.Row < 2 Then Exit Sub
For Each rng In sht.Range("B2:B" & lastRow.Row)
If getStat(rng) = -1 Then Exit For
Next rng
sht.Columns.AutoFit
sht.Columns("H").ColumnWidth = 100
sht.Rows.AutoFit
'Set Html = Nothing
Set Http = Nothing
End Sub
Function getStat(acc As Range) As Integer
Dim oSht As Worksheet
Dim sUrl As String
Dim cID$, Views$, SubCount$, Videos$, Title$, Descr$, Since$
sUrl = "https://www.googleapis.com/youtube/v3/channels?part=snippet,statistics&key=" & API_KEY & "&forHandle=@" & acc.Text
'sUrl = "https://m.youtube.com/channel/<YOUTUBE_CHANNEL_ID_LONG_STRING>/about"
'sUrl = "https://m.youtube.com/@USER_ACOUNT_NAME/about"
'sUrl = "https://www.youtube.com/@" & acc
With Http
.Open "Get", sUrl, False
.setRequestHeader "User-Agent", "Mozilla/5.0 (Linux; Android 6.0;) AppleWebKit/537.36 Chrome/120.0.0.0 Mobile Safari/537.36"
.setRequestHeader "Content-Type", "application/json"
.send
'Html.body.innerHTML = .responseText
JSON.JSON = .responseText
End With
'Debug.Print JSON.JSON
If JSON.Exists("error") Then
If MsgBox("[ Error!! " & JSON("error")("code") & " ] " & JSON("error")("message") & _
vbNewLine & vbNewLine & "Stop now?", vbYesNo + vbCritical) = vbYes Then
getStat = -1
Else
getStat = 0
End If
Exit Function
End If
cID = JSON("items")(1)("id")
Views = JSON("items")(1)("statistics")("viewCount")
SubCount = JSON("items")(1)("statistics")("subscriberCount")
Videos = JSON("items")(1)("statistics")("videoCount")
'Debug.Print cID, SubCount, Views, Videos
Title = JSON("items")(1)("snippet")("title")
Descr = JSON("items")(1)("snippet")("description"): Descr = Replace(Descr, Chr(10), " ")
Since = JSON("items")(1)("snippet")("publishedAt"): Since = Left(Since, 10)
acc.Offset(, -1) = Title
Set oSht = acc.Parent
acc.Offset(, 1) = cID
oSht.Hyperlinks.Add acc.Offset(, 1), "https://m.youtube.com/channel/" & cID & "/about", , "About"
acc.Offset(, 2) = Views
acc.Offset(, 2).NumberFormat = "###,###,###,###"
acc.Offset(, 3) = SubCount
acc.Offset(, 3).NumberFormat = "###,###,###,###"
acc.Offset(, 4) = Videos
acc.Offset(, 4).NumberFormat = "###,###,###,###"
acc.Offset(, 5) = Since
acc.Offset(, 6) = Descr
getStat = 1
End Function
Sub zStartTimer()
getYoutubeStats
Application.StatusBar = "Last update: " & Format(Now, "MM/DD(ddd) HH:NN:SS")
'60초마다 갱신
LastCall = Now + TimeValue("00:01:00")
Application.OnTime LastCall, "zStartTimer"
End Sub
Sub zStopTimer()
On Error Resume Next
With Application
.OnTime LastCall, "AddTimer", , False
.StatusBar = Application.StatusBar & " >> Stopped"
.OnTime Now + TimeValue("00:00:05"), "zStatusOff"
End With
End Sub
Sub zStatusOff(Optional T As Boolean)
Application.StatusBar = False
End Sub
핵심 부분은 https://www.googleapis.com/youtube/v3/channels?part=snippet,statistics&key= API_KEY&forHandle=@계정아이디로 조회하면 아래와 같은 JSON 데이터가 돌아오거나 에러메시지가 뜹니다. 이 JSON 정보를 파싱해서서 화면에 보여주고 갱신하는 것입니다.
' {
' "kind": "youtube#channelListResponse",
' "etag": "vdXkdxBKA5DKypndZTEWUM_tBPQ",
' "pageInfo": {
' "totalResults": 1,
' "resultsPerPage": 5
' },
' "items": [
' {
' "kind": "youtube#channel",
' "etag": "R5sb6hhxom_vkPLE9izol0WBeVg",
' "id": "UC1gi4ynIYAcd_BmFlJsLOWg",
' "statistics": {
' "viewCount": "35960",
' "subscriberCount": "242",
' "hiddenSubscriberCount": false,
' "videoCount": "26"
' }
' }
' ]
' }
'//error
'{"error":{"code":400,"message":"API key not valid. Please pass a valid API key.","errors":[{"message":"API key not valid. Please pass a valid API key.","domain":"global","reason":"badRequest"}],"status":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","reason":"API_KEY_INVALID","domain":"googleapis.com","metadata":{"service":"youtube.googleapis.com"}}]}}
4. 현재는 60초마다 갱신합니다. 갱신할 때마다 상태표시줄에 갱신 시간을 보여줍니다.
채널ID 링크를 클릭하면 해당 유투브의 채널 about 페이지로 하이퍼링크됩니다.
샘플 첨부합니다.
※ 첨부한 샘플 파일을 처음 열면 오류가 발생합니다. 반드시 작동하는 API KEY를 입력해야 작동합니다.
참고:
구글 API는 여러 Method 들을 미리 실행해볼 수 있습니다.
https://developers.google.com/youtube/v3/docs?apix=true&hl=ko
파란 글씨의 여러 Method 를 선택하고 오른쪽 Try this method 창에서 각종 인수를 입력하고 Execute 를 눌러서 돌아오는 JSON 결과값을 확인할 수 있습니다.
channel 외에도 특정 영상의 정보를 가져올 수도 있고
가장 많은 조회수, 구독자수를 조회해볼 수도 있고
여러가지 다양한 작업이 가능합니다.
물론 API KEY에 할당된 제한 회수내에서 이용 가능합니다.
'XLS+VBA' 카테고리의 다른 글
엑셀연동] 방배정 명단 출력 1 (0) | 2024.05.23 |
---|---|
교보문고 ISBN 도서 검색(JSON) (1) | 2024.05.15 |
모든 행 값을 랜덤으로 섞기 (1) | 2024.03.01 |
네이버 API를 이용한 '네이버 쇼핑' 검색 결과 수집 (0) | 2024.02.20 |
온라인 이미지를 다운로드하여 아래로 이어 붙인 상품 이미지 일괄 생성 (0) | 2024.02.14 |
엑셀에서 ppt의 특정 페이지를 링크 (0) | 2023.11.21 |
juso.go.kr이용 한글주소 ↔ 영어주소 변환 (0) | 2023.06.15 |
영어단어와 뜻 OCR인식 결과 정리하기 (0) | 2023.06.12 |
최근댓글