1. 네이버카페 전체게시글에서 최신글을 가져오는 매크로입니다.

카페명을 입력하고 커피잔모양 아이콘을 누르면 됩니다.

시작페이지와 마지막페이지를 지정하여 범위를 지정할 수 있습니다.

또한 페이지당 글 수를 지정할 수 있습니다.

 

공지사항을 먼저 검색한 후에 일반 게시물을 검색합니다.

내부적으로 PC버전이 아닌 모바일 버전으로 접속하여 게시물목록을 가져옵니다.

PC버전은 HTML Table 구조로 문서를 모두 받아와야하지만

모바일 버전은 Json 데이터만 가져오면 되기 때문입니다.

매 페이지마다 1초식 지연시간을 두었습니다.

게시물 ArticleID 번호를 클릭하면 기본브라우저로 해당게시물로 링크합니다.

 

모바일 최신글 JSON 데이터는  아래와 같은 구조입니다.

 

코드는 아래와 같습니다.

더보기
'// Microsoft Scripting Runtime   체크 필수
'// Microsoft HTML Object Library 체크 필수

Option Explicit

Const DebugMode As Boolean = False
Const DebugMode2 As Boolean = False

Sub getCafeArticle()

    Dim http As Object
    Set http = CreateObject("MSXML2.ServerXMLHttp")
    Dim url As String, linkUrl As String
    Dim page As Integer
    Dim startRow As Long
    Dim sht As Worksheet
    Set sht = ThisWorkbook.ActiveSheet
    Dim Json As New Dictionary, Value As New Dictionary
    Dim r As Long
    
On Error Resume Next

    'url = "https://cafe.naver.com/ArticleList.nhn?search.clubid=16854404"
    'url = "https://m.cafe.naver.com/ca-fe/gameppt?iframe_url=%2FArticleList.nhn%3Fsearch.clubid%3D16854404"
    If [B1] = "" Then MsgBox "카페이름을 입력하세요.", vbCritical: Exit Sub
    [B2] = getCafeID([B1])
    
    
    '//기존 내용 삭제
    Range("A4:Z" & Rows.Count).ClearContents
    sht.Hyperlinks.Delete
    
    Application.StatusBar = "Searching for notices..."
    '//공지사항
    'url = "https://apis.naver.com/cafe-web/cafe2/NoticeList.json?cafeId=" & [B2]
    url = "https://apis.naver.com/cafe-web/cafe2/NoticeListV3.json?cafeId=" & [B2] & "&ad=false&mobileWeb=true&adUnit=MW_CAFE_BOARD"
    If DebugMode Then Debug.Print url
    Set Json = JsonConverter.ParseJson(getHtml(http, url))
    If DebugMode2 Then Debug.Print getHtml(http, url)
    r = 0
    startRow = 3
    
    '//공지
    If [F2] = "포함" Then
        If DebugMode Then Debug.Print Json("message")("result")("mainNoticeList").Count
        If Json("message")("result").Exists("mainNoticeList") Then
            For Each Value In Json("message")("result")("mainNoticeList")
                r = r + 1
                Cells(startRow + r, 1) = "전체공지" & r
                Cells(startRow + r, 2) = Value("articleId")
                linkUrl = "https://m.cafe.naver.com/ArticleRead.nhn?boardtype=L"
                linkUrl = linkUrl & "&clubid=" & [B2] & "&articleid=" & Value("articleId")
                sht.Hyperlinks.Add Cells(startRow + r, 2), linkUrl
                Cells(startRow + r, 3) = Value("subject") 'message.result.articleList[0].subject
                Cells(startRow + r, "D") = Value("writerNickname")
                Cells(startRow + r, "E") = Value("readCount")
                Cells(startRow + r, "F") = Value("commentCount")
                Cells(startRow + r, "G") = Value("likeItCount")
                Cells(startRow + r, "H") = (Value("writeDateTimestamp") / 86400000 + 25569 + TimeSerial(9, 0, 0))
                Cells(startRow + r, "H").NumberFormat = "yyyy/mm/dd hh:mm:ss"
            Next Value
            Application.Wait Now + TimeSerial(0, 0, 1)
            
            startRow = startRow + r
        End If
    End If
    
    '//일반 게시글
    r = 0
    For page = [D1] To [D2]
        Application.StatusBar = "Searching for articles in page " & page & "..."
        'url = "https://apis.naver.com/cafe-web/cafe2/ArticleList.json?search.queryType=lastArticle&ad=false"
        url = "https://apis.naver.com/cafe-web/cafe2/ArticleListV2dot1.json?search.queryType=lastArticle&ad=false&adUnit=MW_CAFE_ARTICLE_LIST_RS"
        url = url & "&search.clubid=" & [B2]
        If [F1] = "" Then [F1] = 30
        url = url & "&search.perPage=" & [F1]
        
        If [D1] = "" Then [D1] = 1
        If [D2] = "" Then [D2] = [D1]
        url = url & "&search.page=" & page
        If DebugMode Then Debug.Print url
        Set Json = JsonConverter.ParseJson(getHtml(http, url))
        If DebugMode Then Debug.Print url
        If DebugMode Then Debug.Print getHtml(http, url)
        
        If Json("message")("result").Exists("articleList") Then
            For Each Value In Json("message")("result")("articleList")
                r = r + 1
                Cells(startRow + r, 1) = r
                Cells(startRow + r, 2) = Value("articleId")
                linkUrl = "https://m.cafe.naver.com/ArticleRead.nhn?boardtype=L"
                linkUrl = linkUrl & "&clubid=" & [B2] & "&articleid=" & Value("articleId")
                sht.Hyperlinks.Add Cells(startRow + r, 2), linkUrl
                Cells(startRow + r, 3) = Value("subject") 'message.result.articleList[0].subject
                Cells(startRow + r, "D") = Value("writerNickname")
                Cells(startRow + r, "E") = Value("readCount")
                Cells(startRow + r, "F") = Value("commentCount")
                Cells(startRow + r, "G") = Value("likeItCount")
                Cells(startRow + r, "H") = (Value("writeDateTimestamp") / 86400000 + 25569 + TimeSerial(9, 0, 0))
                Cells(startRow + r, "H").NumberFormat = "yyyy/mm/dd hh:mm:ss"
                
            Next Value
            '//대기
            Application.Wait Now + TimeSerial(0, 0, 1)
        End If
        
    Next page
    
    Set http = Nothing
    Set Json = Nothing
    Set Value = Nothing
    Application.StatusBar = False
    
End Sub

Function getCafeID(cafeName As String) As String
    
    Dim ohttp As Object
    Set ohttp = CreateObject("MSXML2.serverXMLHttp")
    Dim oJson As Dictionary
    Dim url As String
    
    url = "https://apis.naver.com/cafe-web/cafe2/CafeGateInfo.json?cluburl="
    url = url & cafeName
    Set oJson = JsonConverter.ParseJson(getHtml(ohttp, url))
    getCafeID = oJson("message")("result")("cafeInfoView")("cafeId")
    Set ohttp = Nothing
    
End Function

Function getHtml(ohttp As Object, strUrl As String) As String
    
    With ohttp
        .Open "get", strUrl, False
        .setRequestHeader "User-Agent", "Mobile"
        .send
        getHtml = .responseText
    End With
    
End Function

 

 

2. 이번에는 카페의 전체글이 아니라 특정 게시판내의 최신글 가져오기입니다.

 

카페 게시판 주소를 모바일 주소로 입력하고 커피잔 아이콘을 눌러 검색합니다.

https://m.cafe.naver.com/ca-fe/web/cafes/13764661/menus/162

주소는 https://m.cafe.naver.com/ca-fe/web/cafes/카페고유ID번호/menus/게시판번호와 같은 형식입니다.

마찬가지로 시작/종료페이지 및 페이지당 글개수를 지정할 수 있습니다.

 

판매게시판인경우 판매종류와 가격도 출력합니다.

Application.OnTime 을 이용해서 주기적으로 검색하고 특정 검색어가 포함된 경우

지정된 이메일주소로 알림 메일을 보내는 방법도 좋겠습니다.

 

아래는 코드내용입니다.

더보기
'// Microsoft Scripting Runtime   체크 필수
'// Microsoft HTML Object Library 체크 필수

Option Explicit

Const DebugMode As Boolean = False
Const DebugMode2 As Boolean = False

Sub getCafeBoard()

    Dim http As Object
    Set http = CreateObject("MSXML2.ServerXMLHttp")
    Dim url As String, linkUrl As String
    Dim page As Integer
    Dim startRow As Long
    Dim sht As Worksheet
    Set sht = ThisWorkbook.ActiveSheet
    Dim Json As New Dictionary, Value As New Dictionary
    Dim r As Long
    Dim cafeId As String, menuId As String
    
On Error Resume Next

    'url = "https://m.cafe.naver.com/ca-fe/web/cafes/13764661/menus/162"
    If [B1] = "" Then MsgBox "게시판 주소를 입력하세요.", vbCritical: Exit Sub
    
    '//기존 내용 삭제
    Range("A4:Z" & Rows.Count).ClearContents
    sht.Hyperlinks.Delete
    
    cafeId = Split([B1], "/")(6)
    menuId = Split([B1], "/")(8)
    menuId = Split(menuId, "#")(0)
    startRow = 3
    
    '공지 포함
    If [G2] = "포함" Then
        Application.StatusBar = "Searching for notices ..."
        '//공지사항
        'https://apis.naver.com/cafe-web/cafe2/NoticeList.json?cafeId=13764661&menuId=162
    
        'url = "https://apis.naver.com/cafe-web/cafe2/NoticeList.json?cafeId=" & cafeId & "&menuId=" & menuId
        'url = "https://apis.naver.com/cafe-web/cafe2/ArticleListV2dot1.json?search.clubid=26681849&search.queryType=lastArticle&search.menuid=130&search.page=1&search.perPage=50&ad=true&uuid=33aa6f17-c9d6-4eac-a6cc-47ab77b83e6a&adUnit=MW_CAFE_ARTICLE_LIST_RS"
        'https://apis.naver.com/cafe-web/cafe2/NoticeListV3.json?cafeId=26681849&menuId=130&ad=true&mobileWeb=true&adUnit=MW_CAFE_BOARD&uuid=33aa6f17-c9d6-4eac-a6cc-47ab77b83e6a
        url = "https://apis.naver.com/cafe-web/cafe2/NoticeListV3.json?cafeId=" & cafeId & "&menuId=" & menuId & "&ad=false&mobileWeb=true&adUnit=MW_CAFE_BOARD"
        If DebugMode Then Debug.Print url
        Set Json = JsonConverter.ParseJson(getHtml(http, url))
        [B2] = Json("message")("result")("menuInfo")("menuName")  '메뉴 이름
        r = 0
        If Json("message")("result").Exists("mainNoticeList") Then
            If DebugMode Then Debug.Print Json("message")("result")("mainNoticeList").Count
            For Each Value In Json("message")("result")("mainNoticeList")
                r = r + 1
                Cells(startRow + r, 1) = "전체공지" & r
                Cells(startRow + r, 2) = Value("articleId")
                'https://m.cafe.naver.com/ca-fe/web/cafes/26681849/articles/805630?fromList=true&menuId=130&tc=cafe_article_list
                linkUrl = "https://m.cafe.naver.com/ArticleRead.nhn?boardtype=L"
                linkUrl = linkUrl & "&clubid=" & cafeId & "&articleid=" & Value("articleId")
                sht.Hyperlinks.Add Cells(startRow + r, 2), linkUrl
                Cells(startRow + r, 3) = Value("subject") 'message.result.articleList[0].subject
                Cells(startRow + r, "D") = Value("writerNickname")
                Cells(startRow + r, "E") = Value("readCount")
                Cells(startRow + r, "F") = Value("commentCount")
                Cells(startRow + r, "G") = Value("likeItCount")
                Cells(startRow + r, "H") = (Value("writeDateTimestamp") / 86400000 + 25569 + TimeSerial(9, 0, 0))
                Cells(startRow + r, "H").NumberFormat = "yyyy/mm/dd hh:mm:ss"
            Next Value
            Application.Wait Now + TimeSerial(0, 0, 1)
            startRow = startRow + r
        End If
        
        '//게시판 필독공지
        r = 0
        If Json("message")("result").Exists("requiredNoticeList") Then
            For Each Value In Json("message")("result")("requiredNoticeList")
                r = r + 1
                Cells(startRow + r, 1) = "필독공지" & r
                Cells(startRow + r, 2) = Value("articleId")
                linkUrl = "https://m.cafe.naver.com/ArticleRead.nhn?boardtype=L"
                linkUrl = linkUrl & "&clubid=" & cafeId & "&articleid=" & Value("articleId")
                sht.Hyperlinks.Add Cells(startRow + r, 2), linkUrl
                Cells(startRow + r, 3) = Value("title") 'message.result.articleList[0].subject
            Next Value
            Application.Wait Now + TimeSerial(0, 0, 1)
            startRow = startRow + r
        End If
    End If  '//공지
    
    '//일반 게시글
    r = 0
    For page = [E1] To [E2]
        Application.StatusBar = "Searching for articles in page " & page & "..."
        'https://apis.naver.com/cafe-web/cafe2/ArticleList.json?search.clubid=13764661&search.queryType=lastArticle&search.menuid=162&search.page=1&search.perPage=50&ad=false
        'https://apis.naver.com/cafe-web/cafe2/ArticleList.json?search.clubid=13764661&search.queryType=lastArticle&search.menuid=162&search.page=4&search.perPage=50&ad=true&search.pageLastArticleId=3512480&search.replylistorder=&search.firstArticleInReply=false&lastItemIndex=156&lastAdIndex=144
        url = "https://apis.naver.com/cafe-web/cafe2/ArticleList.json?search.queryType=lastArticle&ad=false"
        url = url & "&search.clubid=" & cafeId & "&search.menuid=" & menuId
        url = "https://apis.naver.com/cafe-web/cafe2/ArticleListV2dot1.json?search.clubid=" & cafeId & "&search.queryType=lastArticle&search.menuid=" & menuId & "&ad=false&adUnit=MW_CAFE_ARTICLE_LIST_RS"

        If [G1] = "" Then [G1] = 30
        url = url & "&search.perPage=" & [G1]
        
        If [E1] = "" Then [E1] = 1
        If [E2] = "" Then [E2] = [E1]
        url = url & "&search.page=" & page
        If DebugMode Then Debug.Print url
        Set Json = JsonConverter.ParseJson(getHtml(http, url))
        If DebugMode Then Debug.Print getHtml(http, url)
        
        'message.result.articleList[0].item.subject
        If Json("message")("result").Exists("articleList") Then
            For Each Value In Json("message")("result")("articleList")
                r = r + 1
                Cells(startRow + r, 1) = r
                Cells(startRow + r, 2) = Value("articleId")
                'https://m.cafe.naver.com/ArticleRead.nhn?clubid=13764661&articleid=3513238&boardtype=L&menuid=162
                'https://cafe.naver.com/ArticleRead.nhn?clubid=13764661&page=3&menuid=162&boardtype=L&articleid=3513024&referrerAllArticles=false
                'linkUrl = "https://m.cafe.naver.com/ArticleRead.nhn?boardtype=L"
                linkUrl = "https://cafe.naver.com/ArticleRead.nhn?boardtype=L&menuid=" & menuId
                linkUrl = linkUrl & "&clubid=" & cafeId & "&articleid=" & Value("articleId")
                sht.Hyperlinks.Add Cells(startRow + r, 2), linkUrl
                Cells(startRow + r, 3) = Value("subject") 'message.result.articleList[0].subject
                Cells(startRow + r, "D") = Value("writerNickname")
                Cells(startRow + r, "E") = Value("readCount")
                Cells(startRow + r, "F") = Value("commentCount")
                Cells(startRow + r, "G") = Value("likeItCount")
                Cells(startRow + r, "H") = (Value("writeDateTimestamp") / 86400000 + 25569 + TimeSerial(9, 0, 0))
                Cells(startRow + r, "H").NumberFormat = "yyyy/mm/dd hh:mm:ss"
                Cells(startRow + r, "I") = Value("productSale")("saleStatus")
                Cells(startRow + r, "J") = Value("productSale")("cost")
                
            Next Value
            '//대기
            Application.Wait Now + TimeSerial(0, 0, 1)
        End If
    Next page
    
    Set http = Nothing
    Set Json = Nothing
    Set Value = Nothing
    Application.StatusBar = False
    
End Sub

 

첨부파일에는 게시판 3개, 카페 5개의 최신글 검색 샘플시트들이 포함되어 있습니다.

시트를 복사하고 카페이름이나 게시판 주소를 바꾸면 되겠습니다.

 

코드는 공개되어 있지만

부분별한 남용을 막기 위해 첨부파일 코드는 암호를 걸어놨습니다.

 

카페최신글_MOBILE2_Restricted.xlsm
0.28MB

 

안내1.

인터넷으로 받은 엑셀파일은 탐색기로 파일속성에서 '자단해제'를 적용해야 잘 열립니다.

또한 xlsm 파일은 열 때 매크로컨텐츠를 허용해야 매크로가 작동합니다.

Dictionary 를 사용하므로 Alt-F11 도구-참조에서 Microsoft Scripting Runtime 이 체크되어 있어야 합니다. 

 

안내2.

각 카페글의 저작권은 해당게시글 작성자와 네이버카페에 있으며

본 게시글은 VBA로 JSON데이터를 웹파싱하는 방법에 대한 교육적 용도로 작성되었습니다.

 

안내3. [2021.09.26 수정사항]

공지가 없는 경우 에러가 나지 않도록 수정했습니다.

JSON 데이터에 원하는 값이 없는 경우

If Json("message")("result").Exists("menuNoticeList") Then로 검사하도록 했습니다.

 

안내4. [2022.01.27. 추가]

추가로 아이디가 함께 출력되는 버전입니다. 공개게시판이라 JSON데이터속에 아이디가 노출되기는 하지만 개인정보보호차원에서 압축파일에는 암호가 걸려있습니다. 사용자들의 개인정보는 제 소유가 아니기 때문에 부득이 공개하지 못하는 점 양해바랍니다. VBA를 수정하실 수 있는 분은 아이디를 출력하려면 위 소스에서 Value("writeId") 값만 추가되도록 한 열만 추가하면 됩니다.

 

카페최신글_MOBILE2_Restricted_ID우선.zip
0.32MB

 

 

 

안내5. [2024.01.07. 추가]

 

최근(2023년 말)에 JSON 주소와 데이터가 약간 변경되어 오류가 나는 것을 수정한 버전입니다.

공지를 제외할 수 있게 옵션을 추가했습니다.

이번에 변경된 주된 이유가 아마도 되도록 ID를 노출하지 않도록 바뀐 걸로 보입니다.

 

카페최신글_MOBILE3_Restricted.xlsm
0.27MB

 

 

아래 파일은 ID를 검색하도록 해보았으나 미완성이고 비공개입니다.

카페최신글_MOBILE3_Restricted_ID우선.zip
0.28MB