101

Re: AHK: Разбор ответа VK API или JSON

Об этом и разговор. Подразумевается, что раз программист разрабатывает программу, то не в Виндовом блокноте. Но Ваше:

DD пишет:

... несколько раз за последние два дня уже безуспешно занимался комбинаторикой

Натолкнуло именно на отсутствие нужного инструмента и понимания принципов исследования чужого кода. Хотя последнее, как раз таки чуть ли не ядро, в Вашей системе познания. Всё, что я узнавал когда-либо в программировании, основано на чужих примерах и, думаю, так у всех, или в подавляющем большинстве.

DD пишет:

... а там последних ключей оказалось достаточно). Вы бы хоть записку оставили).

Так бы я затёр все бонусы получаемые в результате Вашего "Brainstorm", а так, Вы это наверняка теперь запомните.

DD пишет:

касаемо edge_liked_by/edge_threaded_comments

Обратите внимание, что вложенные комментарии имеют схожую структуру, за исключением имён, отвечающих за наличие собственных вложенных "edges". В примерах выше, для обработки их содержимого функция вызывала сама себя, но Вы может так же описать дополнительную логику, проверяя:

edge_threaded_comments :=  v.node.edge_threaded_comments.count

Которое всегда содержит количество вложенных комментариев.

102

Re: AHK: Разбор ответа VK API или JSON

Я правильно понял, что если прописать здесь нужную иерархию, предварительно значения будут извлекаться? —

edges :=                   v.node.edge_threaded_comments.edges

103

Re: AHK: Разбор ответа VK API или JSON

Что Вас останавливает перед тем, чтобы взять и попробовать?
Ничего ведь не сломается, даже если результат не подтвердит ожидания.
Можно построить дополнительную обработку вложенных "edges", на основании их количества, например, так, получить все "id"

comments_count := v.node.edge_threaded_comments.count
Loop,% comments_count
	MsgBox % v.node.edge_threaded_comments.edges[ A_Index ].node.id

Или без участия этого счётчика:

For i, comment in v.node.edge_threaded_comments.edges
	MsgBox % comment.node.id

Вместо "id" может быть любое иное имя, которое Вам нужно, или путь, как, например:

For i, comment in v.node.edge_threaded_comments.edges
	MsgBox % comment.node.owner.username
+ DD

104 (изменено: DD, 2019-02-20 16:27:13)

Re: AHK: Разбор ответа VK API или JSON

Спасибо, алилуйя) —

edges := JSON.Parse(ResponseText).data.shortcode_media.edge_media_to_parent_comment.edges
MsgBox % ListValues(edges)
ListValues(edges) {
   list := ""
   For k, NDS1 in edges {
      text :=                    NDS1.node.text
      end_cursor :=              NDS1.node.edge_threaded_comments.page_info.end_cursor
      id :=                      NDS1.node.id
      created_at :=              NDS1.node.created_at
      username :=                NDS1.node.owner.username
      profile_pic_url :=         NDS1.node.owner.profile_pic_url
      edge_threaded_comments :=  NDS1.node.edge_threaded_comments.count
      edge_liked_by :=           NDS1.node.edge_liked_by.count
      edges :=                   NDS1.node.edge_threaded_comments.edges

      list .= created_at " | " edge_liked_by " | " edge_threaded_comments
       . " | " end_cursor " | " id " | " profile_pic_url " | " text " | " username "`n"

      For i, NDS2 in NDS1.node.edge_threaded_comments.edges {
         text :=                    NDS2.node.text
         end_cursor :=              NDS2.node.edge_threaded_comments.page_info.end_cursor
         id :=                      NDS2.node.id
         created_at :=              NDS2.node.created_at
         username :=                NDS2.node.owner.username
         profile_pic_url :=         NDS2.node.owner.profile_pic_url
         edge_threaded_comments :=  NDS2.node.edge_threaded_comments.count
         edge_liked_by :=           NDS2.node.edge_liked_by.count

         list .= "`t" created_at " | " edge_liked_by " | " edge_threaded_comments
          . " | " end_cursor " | " id " | " profile_pic_url " | " text " | " username "`n"
      }
   } Return list
}

105

Re: AHK: Разбор ответа VK API или JSON

Мои поздравления!

106

Re: AHK: Разбор ответа VK API или JSON

Почему ключ "pk" отображается в виде дробного числа? —

ResponseText =
(
{"comment_likes_enabled": true, "comments": [{"pk": 17849713558010739, "user_id": 198212294, "text": "Тире ставится, когда есть пробел", "type": 0, "created_at": 1440283999, "created_at_utc": 1440283999, "content_type": "comment", "status": "Active", "bit_flags": 0, "user": {"pk": 198212294, "username": "artijado", "full_name": "Igor Malinin", "is_private": false, "profile_pic_url": "https://scontent-arn2-1.cdninstagram.com/vp/cc261c5894efaa68c8e5e7d40c02f103/5DE7C76F/t51.2885-19/s150x150/60960188_330080244351723_7306559494501171200_n.jpg?_nc_ht=scontent-arn2-1.cdninstagram.com", "profile_pic_id": "2053930082462014902_198212294", "is_verified": false, "latest_reel_media": 1565204355}, "did_report_as_spam": false, "share_enabled": false, "has_liked_comment": false, "comment_like_count": 0, "inline_composer_display_condition": "never"}], "comment_count": 1, "caption": {"pk": 17852726821010739, "user_id": 1545290738, "text": "Уточнила написание числовых интервалов в \"Справочнике издателя и автора\" Мильчина и Чельцовой: между цифрами ставится широченное тире (а я ставил минус из скромности, он всё же не так режет глаз своей шириной). Забавно, что при этом на обложке самого справочника красуется дефис.\n\n#книжныйдизайн #emdash #мильчин #издал #artlebedev", "type": 1, "created_at": 1447723802, "created_at_utc": 1447723802, "content_type": "comment", "status": "Active", "bit_flags": 0, "user": {"pk": 1545290738, "username": "addaald", "full_name": "Adda Ald", "is_private": false, "profile_pic_url": "https://scontent-arn2-1.cdninstagram.com/vp/5244ed9c2b65d6d8e016149616e58e77/5DC8DF29/t51.2885-19/s150x150/62204076_2392406174113939_623129493279604736_n.jpg?_nc_ht=scontent-arn2-1.cdninstagram.com", "profile_pic_id": "2064098053023530828_1545290738", "is_verified": false}, "did_report_as_spam": false, "share_enabled": false}, "caption_is_edited": true, "has_more_comments": false, "has_more_headload_comments": false, "media_header_display": "none", "display_realtime_typing_indicator": true, "preview_comments": [], "can_view_more_preview_comments": false, "status": "ok"}
)

edges := JSON.Parse(ResponseText).comments
MsgBox % ListValues(edges)
ListValues(edges) {
   list := ""
   For k, NDS1 in edges {
      text :=                    NDS1.text
      created_at :=              NDS1.created_at
      pk :=                      NDS1.pk
      comment_like_count :=      NDS1.comment_like_count
      user_id :=                 NDS1.user_id
      username :=                NDS1.user.username
      full_name :=               NDS1.user.full_name
      profile_pic_id :=          NDS1.user.profile_pic_id
     ;profile_pic_url :=         NDS1.user.profile_pic_url

      list .= created_at " `n" text " `n▌" pk " `n" full_name " `n" username " `n" user_id " `n" profile_pic_id " `n" comment_like_count "`n"

   } Return list
}

class JSON
{
   static JS := JSON._GetJScripObject()
   
   Parse(JsonString)  {
      try oJSON := this.JS.("(" JsonString ")")
      catch  {
         MsgBox, Wrong JsonString!
         Return
      }
      Return this._CreateObject(oJSON)
   }

   _GetJScripObject()  {
      VarSetCapacity(tmpFile, (MAX_PATH := 260) << !!A_IsUnicode, 0)
      DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
      
      FileAppend,
      (
      <component>
      <public><method name='eval'/></public>
      <script language='JScript'></script>
      </component>
      ), % tmpFile
      
      JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "eval" )
      FileDelete, % tmpFile
      JSON._AddMethods(JS)
      Return JS
   }

   _AddMethods(ByRef JS)  {
      JScript =
      (
         Object.prototype.GetKeys = function () {
            var keys = []
            for (var k in this)
               if (this.hasOwnProperty(k))
                  keys.push(k)
            return keys
         }
         Object.prototype.IsArray = function () {
            var toStandardString = {}.toString
            return toStandardString.call(this) == '[object Array]'
         }
      )
      JS.("delete ActiveXObject; delete GetObject;")
      JS.(JScript)
   }

   _CreateObject(ObjJS)  {
      res := ObjJS.IsArray()
      if (res = "")
         Return ObjJS
      
      else if (res = -1)  {
         obj := []
         Loop % ObjJS.length
            obj[A_Index] := this._CreateObject(ObjJS[A_Index - 1])
      }
      else if (res = 0)  {
         obj := {}
         keys := ObjJS.GetKeys()
         Loop % keys.length
            k := keys[A_Index - 1], obj[k] := this._CreateObject(ObjJS[k])
      }
      Return obj
   }
}