1

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

Всем привет. Проблема такая - не могу разобрать ответ от VK API.
Загружаю файл через UrlDownloadToFile посредством запроса к VK.
Ответ загружаю в %ID группы%.txt
Пробывал через RegExMatch и через RegExReplace, но так как в ответе приходит слишком много запрещенных символов, то AHK постоянно выдает ошибки по поводу запрещенных символов или вовсе неправильно понимает меня.
Пример файла ответа прикрепляю ниже.

+ открыть спойлер

{"response":{"count":8132,"items":[{"id":65166,"from_id":230663862,"date":1495702509,"text":"[id15397810|Кирилл], и пусть весь мир подождет, мы же тут свадьбу фотаем))) Наверное, автоматически включается бессмертие и подключается разрешение на нарушения))","reply_to_user":15397810,"reply_to_comment":65066,"pid":440481750},{"id":65066,"from_id":15397810,"date":1495619512,"text":"Типичный переход дороги в неположенном месте.","pid":440481750},{"id":64686,"from_id":62897079,"date":1495299141,"text":"Пробег 17500, 2016 г.в. цена 510тыс.руб. По всем вопросам в личку","pid":456254153},{"id":64532,"from_id":200417393,"date":1495127968,"text":"Пятнашка","pid":400840174},{"id":64530,"from_id":200417393,"date":1495127932,"text":"Пятнашка","pid":400826413},{"id":64465,"from_id":408535812,"date":1495038511,"text":"Прям на фоне трека выгледит клас","pid":456252859},{"id":64464,"from_id":408535812,"date":1495038507,"text":"","attachments":[{"type":"sticker","sticker":{"id":4483,"product_id":143,"photo_64":"https:\/\/vk.com\/images\/stickers\/4483\/64.png","photo_128":"https:\/\/vk.com\/images\/stickers\/4483\/128.png","photo_256":"https:\/\/vk.com\/images\/stickers\/4483\/256.png","photo_352":"https:\/\/vk.com\/images\/stickers\/4483\/352.png","photo_512":"https:\/\/vk.com\/images\/stickers\/4483\/512.png","width":256,"height":256}}],"pid":456252859},{"id":63669,"from_id":12305785,"date":1494511135,"text":"Антон, на 10 до 200разметка","reply_to_user":108744649,"reply_to_comment":63446,"pid":456252930},{"id":63510,"from_id":410054677,"date":1494417393,"text":"800","pid":456252930},{"id":63446,"from_id":108744649,"date":1494324744,"text":"10","pid":456252930},{"id":63269,"from_id":20008734,"date":1494169687,"text":"Еще бы)) он крут","pid":456252860},{"id":63267,"from_id":393615385,"date":1494159412,"text":"сам выложил ....сам лайкнул... красавчик","pid":456252877},{"id":63254,"from_id":31855993,"date":1494149322,"text":"Продам ВАЗ 21093 2003 год выпуска; карбюратор; 240000 пробег; музыка пионер; сигнализация; стоимость 65 000 ( торг уместен). Обращаться по телефону 8-982-320-34-68.","pid":456252656},{"id":63218,"from_id":358605259,"date":1494132071,"text":"Дебилы","pid":456252849},{"id":63217,"from_id":33478310,"date":1494132071,"text":"Автомобиль, ехавший по трассе, на все деньги!!!

Skype: darya281293
(Не обращайте внимания на логин)

2

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

Извиняюсь за мультитему. Выходила ошибка о невозможности отправить сообщение.

Skype: darya281293
(Не обращайте внимания на логин)

3

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

Вк даёт ответ в формате json. Ищи библиотеки для его парса на ахк

4

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

Apache пишет:

AHK постоянно выдает ошибки по поводу запрещенных символов

Разве в AHK есть запрещённые символы?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5

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

Нашел json.ahk библиотеку. Код прикладываю:

/**
 * Lib: JSON.ahk
 *     JSON lib for AutoHotkey.
 * Version:
 *     v2.1.3 [updated 04/18/2016 (MM/DD/YYYY)]
 * License:
 *     WTFPL [http://wtfpl.net/]
 * Requirements:
 *     Latest version of AutoHotkey (v1.1+ or v2.0-a+)
 * Installation:
 *     Use #Include JSON.ahk or copy into a function library folder and then
 *     use #Include <JSON>
 * Links:
 *     GitHub:     - https://github.com/cocobelgica/AutoHotkey-JSON
 *     Forum Topic - http://goo.gl/r0zI8t
 *     Email:      - cocobelgica <at> gmail <dot> com
 */


/**
 * Class: JSON
 *     The JSON object contains methods for parsing JSON and converting values
 *     to JSON. Callable - NO; Instantiable - YES; Subclassable - YES;
 *     Nestable(via #Include) - NO.
 * Methods:
 *     Load() - see relevant documentation before method definition header
 *     Dump() - see relevant documentation before method definition header
 */
class JSON
{
	/**
	 * Method: Load
	 *     Parses a JSON string into an AHK value
	 * Syntax:
	 *     value := JSON.Load( text [, reviver ] )
	 * Parameter(s):
	 *     value      [retval] - parsed value
	 *     text    [in, ByRef] - JSON formatted string
	 *     reviver   [in, opt] - function object, similar to JavaScript's
	 *                           JSON.parse() 'reviver' parameter
	 */
	class Load extends JSON.Functor
	{
		Call(self, ByRef text, reviver:="")
		{
			this.rev := IsObject(reviver) ? reviver : false
		; Object keys(and array indices) are temporarily stored in arrays so that
		; we can enumerate them in the order they appear in the document/text instead
		; of alphabetically. Skip if no reviver function is specified.
			this.keys := this.rev ? {} : false

			static quot := Chr(34), bashq := "\" . quot
			     , json_value := quot . "{[01234567890-tfn"
			     , json_value_or_array_closing := quot . "{[]01234567890-tfn"
			     , object_key_or_object_closing := quot . "}"

			key := ""
			is_key := false
			root := {}
			stack := [root]
			next := json_value
			pos := 0

			while ((ch := SubStr(text, ++pos, 1)) != "") {
				if InStr(" `t`r`n", ch)
					continue
				if !InStr(next, ch, 1)
					this.ParseError(next, text, pos)

				holder := stack[1]
				is_array := holder.IsArray

				if InStr(",:", ch) {
					next := (is_key := !is_array && ch == ",") ? quot : json_value

				} else if InStr("}]", ch) {
					ObjRemoveAt(stack, 1)
					next := stack[1]==root ? "" : stack[1].IsArray ? ",]" : ",}"

				} else {
					if InStr("{[", ch) {
					; Check if Array() is overridden and if its return value has
					; the 'IsArray' property. If so, Array() will be called normally,
					; otherwise, use a custom base object for arrays
						static json_array := Func("Array").IsBuiltIn || ![].IsArray ? {IsArray: true} : 0
					
					; sacrifice readability for minor(actually negligible) performance gain
						(ch == "{")
							? ( is_key := true
							  , value := {}
							  , next := object_key_or_object_closing )
						; ch == "["
							: ( value := json_array ? new json_array : []
							  , next := json_value_or_array_closing )
						
						ObjInsertAt(stack, 1, value)

						if (this.keys)
							this.keys[value] := []
					
					} else {
						if (ch == quot) {
							i := pos
							while (i := InStr(text, quot,, i+1)) {
								value := StrReplace(SubStr(text, pos+1, i-pos-1), "\\", "\u005c")

								static tail := A_AhkVersion<"2" ? 0 : -1
								if (SubStr(value, tail) != "\")
									break
							}

							if (!i)
								this.ParseError("'", text, pos)

							  value := StrReplace(value,  "\/",  "/")
							, value := StrReplace(value, bashq, quot)
							, value := StrReplace(value,  "\b", "`b")
							, value := StrReplace(value,  "\f", "`f")
							, value := StrReplace(value,  "\n", "`n")
							, value := StrReplace(value,  "\r", "`r")
							, value := StrReplace(value,  "\t", "`t")

							pos := i ; update pos
							
							i := 0
							while (i := InStr(value, "\",, i+1)) {
								if !(SubStr(value, i+1, 1) == "u")
									this.ParseError("\", text, pos - StrLen(SubStr(value, i+1)))

								uffff := Abs("0x" . SubStr(value, i+2, 4))
								if (A_IsUnicode || uffff < 0x100)
									value := SubStr(value, 1, i-1) . Chr(uffff) . SubStr(value, i+6)
							}

							if (is_key) {
								key := value, next := ":"
								continue
							}
						
						} else {
							value := SubStr(text, pos, i := RegExMatch(text, "[\]\},\s]|$",, pos)-pos)

							static number := "number", integer :="integer"
							if value is %number%
							{
								if value is %integer%
									value += 0
							}
							else if (value == "true" || value == "false")
								value := %value% + 0
							else if (value == "null")
								value := ""
							else
							; we can do more here to pinpoint the actual culprit
							; but that's just too much extra work.
								this.ParseError(next, text, pos, i)

							pos += i-1
						}

						next := holder==root ? "" : is_array ? ",]" : ",}"
					} ; If InStr("{[", ch) { ... } else

					is_array? key := ObjPush(holder, value) : holder[key] := value

					if (this.keys && this.keys.HasKey(holder))
						this.keys[holder].Push(key)
				}
			
			} ; while ( ... )

			return this.rev ? this.Walk(root, "") : root[""]
		}

		ParseError(expect, ByRef text, pos, len:=1)
		{
			static quot := Chr(34), qurly := quot . "}"
			
			line := StrSplit(SubStr(text, 1, pos), "`n", "`r").Length()
			col := pos - InStr(text, "`n",, -(StrLen(text)-pos+1))
			msg := Format("{1}`n`nLine:`t{2}`nCol:`t{3}`nChar:`t{4}"
			,     (expect == "")     ? "Extra data"
			    : (expect == "'")    ? "Unterminated string starting at"
			    : (expect == "\")    ? "Invalid \escape"
			    : (expect == ":")    ? "Expecting ':' delimiter"
			    : (expect == quot)   ? "Expecting object key enclosed in double quotes"
			    : (expect == qurly)  ? "Expecting object key enclosed in double quotes or object closing '}'"
			    : (expect == ",}")   ? "Expecting ',' delimiter or object closing '}'"
			    : (expect == ",]")   ? "Expecting ',' delimiter or array closing ']'"
			    : InStr(expect, "]") ? "Expecting JSON value or array closing ']'"
			    :                      "Expecting JSON value(string, number, true, false, null, object or array)"
			, line, col, pos)

			static offset := A_AhkVersion<"2" ? -3 : -4
			throw Exception(msg, offset, SubStr(text, pos, len))
		}

		Walk(holder, key)
		{
			value := holder[key]
			if IsObject(value) {
				for i, k in this.keys[value] {
					; check if ObjHasKey(value, k) ??
					v := this.Walk(value, k)
					if (v != JSON.Undefined)
						value[k] := v
					else
						ObjDelete(value, k)
				}
			}
			
			return this.rev.Call(holder, key, value)
		}
	}

	/**
	 * Method: Dump
	 *     Converts an AHK value into a JSON string
	 * Syntax:
	 *     str := JSON.Dump( value [, replacer, space ] )
	 * Parameter(s):
	 *     str        [retval] - JSON representation of an AHK value
	 *     value          [in] - any value(object, string, number)
	 *     replacer  [in, opt] - function object, similar to JavaScript's
	 *                           JSON.stringify() 'replacer' parameter
	 *     space     [in, opt] - similar to JavaScript's JSON.stringify()
	 *                           'space' parameter
	 */
	class Dump extends JSON.Functor
	{
		Call(self, value, replacer:="", space:="")
		{
			this.rep := IsObject(replacer) ? replacer : ""

			this.gap := ""
			if (space) {
				static integer := "integer"
				if space is %integer%
					Loop, % ((n := Abs(space))>10 ? 10 : n)
						this.gap .= " "
				else
					this.gap := SubStr(space, 1, 10)

				this.indent := "`n"
			}

			return this.Str({"": value}, "")
		}

		Str(holder, key)
		{
			value := holder[key]

			if (this.rep)
				value := this.rep.Call(holder, key, ObjHasKey(holder, key) ? value : JSON.Undefined)

			if IsObject(value) {
			; Check object type, skip serialization for other object types such as
			; ComObject, Func, BoundFunc, FileObject, RegExMatchObject, Property, etc.
				static type := A_AhkVersion<"2" ? "" : Func("Type")
				if (type ? type.Call(value) == "Object" : ObjGetCapacity(value) != "") {
					if (this.gap) {
						stepback := this.indent
						this.indent .= this.gap
					}

					is_array := value.IsArray
				; Array() is not overridden, rollback to old method of
				; identifying array-like objects. Due to the use of a for-loop
				; sparse arrays such as '[1,,3]' are detected as objects({}). 
					if (!is_array) {
						for i in value
							is_array := i == A_Index
						until !is_array
					}

					str := ""
					if (is_array) {
						Loop, % value.Length() {
							if (this.gap)
								str .= this.indent
							
							v := this.Str(value, A_Index)
							str .= (v != "") ? v . "," : "null,"
						}
					} else {
						colon := this.gap ? ": " : ":"
						for k in value {
							v := this.Str(value, k)
							if (v != "") {
								if (this.gap)
									str .= this.indent

								str .= this.Quote(k) . colon . v . ","
							}
						}
					}

					if (str != "") {
						str := RTrim(str, ",")
						if (this.gap)
							str .= stepback
					}

					if (this.gap)
						this.indent := stepback

					return is_array ? "[" . str . "]" : "{" . str . "}"
				}
			
			} else ; is_number ? value : "value"
				return ObjGetCapacity([value], 1)=="" ? value : this.Quote(value)
		}

		Quote(string)
		{
			static quot := Chr(34), bashq := "\" . quot

			if (string != "") {
				  string := StrReplace(string,  "\",  "\\")
				; , string := StrReplace(string,  "/",  "\/") ; optional in ECMAScript
				, string := StrReplace(string, quot, bashq)
				, string := StrReplace(string, "`b",  "\b")
				, string := StrReplace(string, "`f",  "\f")
				, string := StrReplace(string, "`n",  "\n")
				, string := StrReplace(string, "`r",  "\r")
				, string := StrReplace(string, "`t",  "\t")

				static rx_escapable := A_AhkVersion<"2" ? "O)[^\x20-\x7e]" : "[^\x20-\x7e]"
				while RegExMatch(string, rx_escapable, m)
					string := StrReplace(string, m.Value, Format("\u{1:04x}", Ord(m.Value)))
			}

			return quot . string . quot
		}
	}

	/**
	 * Property: Undefined
	 *     Proxy for 'undefined' type
	 * Syntax:
	 *     undefined := JSON.Undefined
	 * Remarks:
	 *     For use with reviver and replacer functions since AutoHotkey does not
	 *     have an 'undefined' type. Returning blank("") or 0 won't work since these
	 *     can't be distnguished from actual JSON values. This leaves us with objects.
	 *     Replacer() - the caller may return a non-serializable AHK objects such as
	 *     ComObject, Func, BoundFunc, FileObject, RegExMatchObject, and Property to
	 *     mimic the behavior of returning 'undefined' in JavaScript but for the sake
	 *     of code readability and convenience, it's better to do 'return JSON.Undefined'.
	 *     Internally, the property returns a ComObject with the variant type of VT_EMPTY.
	 */
	Undefined[]
	{
		get {
			static empty := {}, vt_empty := ComObject(0, &empty, 1)
			return vt_empty
		}
	}

	class Functor
	{
		__Call(method, ByRef arg, args*)
		{
		; When casting to Call(), use a new instance of the "function object"
		; so as to avoid directly storing the properties(used across sub-methods)
		; into the "function object" itself.
			if IsObject(method)
				return (new this).Call(method, arg, args*)
			else if (method == "")
				return (new this).Call(arg, args*)
		}
}

К библиотеке написан пример: Value := JSON.load (text, [reviever]
Мой код:

#include json.ahk
Fileread, JSON, 1.txt
content := JSON.Load (JSON)

msgbox %Content%

В msgbox приходит обычный JSON файл без изменений.
Не совсем дружу с работами с библиотекой.

Skype: darya281293
(Не обращайте внимания на логин)

6 (изменено: Apache, 2017-05-27 15:42:19)

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

был бы рад получить хоть 1 пример с получением text и pid в переменную и ее выводом на msgbox с помощью библиотеки.

Код программы загрузки комментариев на всякий случай:

gfile=группы.txt
B=0
Filereadline, token, token.txt, 1
Loop, Read, %gfile%
{
urldownloadtofile, https://api.vk.com/method/photos.getAllComments?v=5.4&owner_id=-%A_LoopReadLine%&access_token=%token%, %A_LoopReadLine%.txt
B++
}
msgbox Загружено %B% групп
return
GuiClose:
ExitApp
Skype: darya281293
(Не обращайте внимания на логин)

7

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

Apache, вы уже тут столько ненужных буквы понаписали, а требуется-то всего лишь имеющийся JSON (тот, что вы привели в первом посте — не валидный), и чёткое объяснение, что именно вам из него нужно получить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

8

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

Пришлось самому писать парс для JSON, полученным UrlDownloadToFile.

Fileread, line, 1.txt ; Чтение файла-ответа JSON c однострочным форматом, полученным UrlDownloadToFile (ПОД ЗАМЕНУ)
FoundPos := 1 ; Обнуляем позицию для CommentsID
FoundPosID := 1 ; Обнуляем позицию для From_ID
;foundpos := RegExMatch, (Line, "\Q{\E.id.:(.*?)\Q,\E", subpart)
;Поиск и запись ID комментария
Loop
	{
	FoundPos := RegExMatch(line, """id"":(.*?),""from_id""\:", SubPat, Foundpos) ; Поиск CommentsID
	FoundPosID := RegExMatch(line, """from_id"":(.*?),""date"":", FromID, FoundposID) ; Поиск From_ID
msgbox, subpat1 - %subpat1%`n subpat2 - %subpat2%`n subpat - %subpat% `n foundpos - %foundpos% ; Выводим результаты
IfInString, Subpat1, "" ;Проверяем на пустую строку
	{
	Msgbox Запись окончена ; Если строка пуста
	exitapp ; Выодим отсюда
	}
	else ; Если строка не пуста
		{
		IniWrite, %subpat1%, 1.ini, %SubPat1%, Commentid ; Записываем CommentID в INI-Файл 
		Foundpos := Foundpos+10
		}
		IfInString, From_ID1, "" ;Проверяем на пустую строку From_ID
	{
	Msgbox Запись окончена ; Если строка пуста
	exitapp ; Выодим отсюда
	}
	else ; Если строка не пуста
		{
		IniWrite, %FromID1%, 1.ini, %SubPat1%, From_ID ; Записываем CommentID в INI-Файл 
		FoundposID := FoundposID+10
		}
	}

Если есть мысли облегчения поиска - выслушаю. А так все работает и пишет в Ini-файл.

Skype: darya281293
(Не обращайте внимания на логин)

9 (изменено: ypppu, 2017-05-29 18:32:10)

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

Еще проблема: Через раз выдает неверные данные из различныx параметров.
Код:

+ открыть спойлер

FoundPos := 1

Loop, %A_WorkingDir%\pars\*.txt
	{
		
		;If (Size>100)
		;	{
				
				GroupID = %A_LoopFileName%
				RegExMatch(A_LoopFileName, "(.*).txt", GroupID)
				;MsgBox, %GroupID1%
				
				Loop
					{
						FileRead, line, %A_WorkingDir%\pars\%A_LoopFileName%
						FoundPos := RegExMatch(line, "{""id"":(.*?),""from_id"":(.*?),""date"":(.*?),""text"":""(.*?)"",""pid"":(.*?)}", pat, Foundpos) ; Поиск CommentsID
			
						msgbox %pat1%`n`n %pat2%`n `n %pat3%`n`n %pat4%`n`n %pat5%`n`n %pat6%`n`n %pat7%`n`n %FoundPos%`n %A_LoopFileName% 
						FoundPos := FoundPos+1
						
						if !pat1
							Goto, Label1
						else
							IniWrite, %pat1%, %A_WorkingDir%\Ini\%GroupID1%.ini, Comment, CommentID
						
					}
		;	}
		
		Label1:
		;MsgBox, %CommentsID1% %A_LoopFileName% %CommentsID%
		
	}

Пример файла недоJSON'a:

+ открыть спойлер
{"response":{"count":46,"items":[{"id":861,"from_id":-100039716,"date":1486129352,"text":"","attachments":[{"type":"photo","photo":{"id":456241399,"album_id":-8,"owner_id":-100039716,"user_id":100,"photo_75":"https:\/\/pp.userapi.com\/c626416\/v626416742\/504f0\/Og0xQc3_u8g.jpg","photo_130":"https:\/\/pp.userapi.com\/c626416\/v626416742\/504f1\/zKSNzaGaFSo.jpg","photo_604":"https:\/\/pp.userapi.com\/c626416\/v626416742\/504f2\/yY7rxXQ4UfY.jpg","photo_807":"https:\/\/pp.userapi.com\/c626416\/v626416742\/504f3\/sha1_cYDxRI.jpg","width":628,"height":709,"text":"","date":1486129353,"access_key":"ad3a291f0985e374f5"}}],"pid":456240757},{"id":859,"from_id":9508742,"date":1484481219,"text":"Магазин расположен по адресу: https:\/\/laluna.com.ua\/","pid":456240683},{"id":757,"from_id":-100039716,"date":1468651686,"text":"Победитель: https:\/\/vk.com\/id280623449","pid":420766709},{"id":753,"from_id":-100039716,"date":1467359388,"text":"","attachments":[{"type":"photo","photo":{"id":418772290,"album_id":-8,"owner_id":-100039716,"user_id":100,"photo_75":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18995\/ZdWcIaIVb64.jpg","photo_130":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18996\/w8RzfjkPZGs.jpg","photo_604":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18997\/SMCVRNe4e_4.jpg","photo_807":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18998\/BcaFpiWEX1w.jpg","width":725,"height":758,"text":"","date":1467359391,"access_key":"a92d1477496bcc3b34"}}],"pid":418638891},{"id":752,"from_id":-100039716,"date":1467358122,"text":"","attachments":[{"type":"photo","photo":{"id":418770175,"album_id":-8,"owner_id":-100039716,"user_id":100,"photo_75":"https:\/\/pp.userapi.com\/c626619\/v626619742\/1898d\/bOT44f6Ly7A.jpg","photo_130":"https:\/\/pp.userapi.com\/c626619\/v626619742\/1898e\/uv1piux9izw.jpg","photo_604":"https:\/\/pp.userapi.com\/c626619\/v626619742\/1898f\/It3J6TQnu7k.jpg","photo_807":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18990\/ZGyTRT6UMug.jpg","width":725,"height":646,"text":"","date":1467358122,"access_key":"cb7ac5a7df16a138f9"}}],"pid":418639265},{"id":750,"from_id":-100039716,"date":1467272359,"text":"","attachments":[{"type":"photo","photo":{"id":418637936,"album_id":-8,"owner_id":-100039716,"user_id":100,"photo_75":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18771\/x5NFtv5odt0.jpg","photo_130":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18772\/_M6Yz-DUX3Q.jpg","photo_604":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18773\/EXFs5-MK-BY.jpg","photo_807":"https:\/\/pp.userapi.com\/c626619\/v626619742\/18774\/UvYWrin5fJw.jpg","width":733,"height":568,"text":"","date":1467272358,"access_key":"ad0ce9382e0c6277fa"}}],"pid":414998677},{"id":739,"from_id":-100039716,"date":1465755035,"text":"Победитель: *Оля Друзь (https:\/\/vk.com\/id200487815)","pid":414998677},{"id":738,"from_id":-100039716,"date":1465754752,"text":"Видео розыгрыша: https:\/\/vk.com\/video-91401362_456239568","attachments":[{"type":"video","video":{"id":456239568,"owner_id":-91401362,"title":"любой из представленных подарков 
Skype: darya281293
(Не обращайте внимания на логин)

10 (изменено: ypppu, 2017-05-29 18:32:56)

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

Проблема в том, что он ищет, например:
"ID":323,"From_id":-9382993......."ID":324,"From_id":-9382992......
Скрипт то наxодит в %pat1% "323", то ,"From_id":-9382993......."ID":324, то "-9382993......."ID":".
Выxодит, что он может начать поиск верно, но закончить на следующем ответе, бывает вовсе верно ищет, а бывает что вовсе в месте поиска ID выводит From_id.

Начал искать с from_id до Нужного мне id.

+ открыть спойлер

http://imgdepo.com/id/10695193.jpg

Нашел вообще параметры с прикрепленного видео

z=video9508742_456239023
+ открыть спойлер

http://imgdepo.com/id/10695194.jpg

pat1 тоже перепрыгнул и закинул все в переменную, pat4 (Текст сообщения) начала писать с 1-го и закончил вторым ответом.

+ открыть спойлер

http://imgdepo.com/id/10695195.jpg

Пример поиска из файла примера на скриншотаx.

Skype: darya281293
(Не обращайте внимания на логин)

11

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

Apache, прочитайте еще раз внимательно сообщение номер 8.

12

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

Уважаемые, а возможно распарсить следующий JSON


{"response":{"count":1327,"items":[{"id":456239092,"album_id":43057155,"owner_id":-4410189,"user_id":468722286,"photo_75":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499d\/-WVOjdnpJZI.jpg","photo_130":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499e\/uQcruFXFMdk.jpg","photo_604":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499f\/y43rEl-TAkA.jpg","width":450,"height":600,"text":"","date":1516419054,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239078,"album_id":42994275,"owner_id":-4410189,"user_id":178805115,"photo_75":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c2\/zjw36aXGsrg.jpg","photo_130":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c3\/6pqM4Ptzqzo.jpg","photo_604":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c4\/bVjh384ZaLs.jpg","width":600,"height":300,"text":"http:\/\/fas.st\/UF5a3","date":1498331078,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239077,"album_id":203534724,"owner_id":-4410189,"user_id":178805115,"photo_75":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bb\/jUH3jjLme28.jpg","photo_130":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bc\/dvTzcguDpI0.jpg","photo_604":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bd\/6uf84mYlyu8.jpg","width":600,"height":300,"text":"http:\/\/fas.st\/UF5a3","date":1498331077,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239049,"album_id":43023085,"owner_id":-4410189,"user_id":100,"photo_75":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe0\/8F1vthi-tjo.jpg","photo_130":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe1\/KxtmhBBZuY4.jpg","photo_604":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe2\/ZoT63tAPvHg.jpg","photo_807":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe3\/zbDlM4tkBS8.jpg","photo_1280":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe4\/sKgl1iXF-5o.jpg","width":877,"height":561,"text":"Эскиз к роману в стихах А.С.Пушкина \"Евгений Онегин\". Автор Lena Ashraf.","date":1492174953,"likes":{"user_likes":0,"count":1},"reposts":{"count":0}}]}}

и получить список из выборочных значений в следующем формате


"id":456239092
"owner_id":-4410189
https:\/\/pp.userapi.com\/c840126\/v840126582\/7499f\/y43rEl-TAkA.jpg
"text":""

"id":456239078
"owner_id":-4410189
https:\/\/pp.userapi.com\/c639429\/v639429115\/286c4\/bVjh384ZaLs.jpg
"text":"http:\/\/fas.st\/UF5a3"

"id":456239077
"owner_id":-4410189
https:\/\/pp.userapi.com\/c639429\/v639429115\/286bd\/6uf84mYlyu8.jpg
"text":"http:\/\/fas.st\/UF5a3"

"id":456239049
"owner_id":-4410189
https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe4\/sKgl1iXF-5o.jpg
"text":"Эскиз к роману в стихах А.С.Пушкина \"Евгений Онегин\". Автор Lena Ashraf."

где первый "count" попадает в отдельную переменную, а ссылки на изображения представляют собой их увеличенные версии? А то я сам и в получении одного значения не преуспел)).

13 (изменено: KusochekDobra, 2018-02-03 18:57:12)

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

Пользуюсь для работы с JSON, вот этой приспособой, немного модифицированного примера, исходник которого можно посмотреть по ссылке в примере:


;-----------------------------------------------------------------------------------------------------------------------------------------
; JSON.ahk (Определение класса)
; Слегка переделаный src -> https://community.spiceworks.com/scripts/show/3203-autohotkey-json-encoder-decoder
; by CaptainCode on Jun 20, 2015
; Методы:
;		Decode(принимает строковое представление JSON) - возвращает объект AHK
;		Encode(принимает AHK объект) - Возвращает строку JSON
; JScript -> https://docs.microsoft.com/en-us/scripting/javascript/reference/javascript-reference
;-----------------------------------------------------------------------------------------------------------------------------------------

Class JSON {
	SC := "", jsCode := ""
	__New() {	; Создать COM-объект, который будет использоваться для декодирования строки
		this.SC				:= ComObjCreate("ScriptControl") 
		this.SC.Language	:= "JScript"
		ComObjError(false)
		; Описание тела функции JScript (похож на JavaScript), не AHK.
		this.jsCode			:=
		(Join`r`n
		"function arrangeForAhkTraversing(obj) {
			if(obj instanceof Array) {
				for(var i=0 ; i < obj.length ; ++i)
					obj[i] = arrangeForAhkTraversing(obj[i]) ;
				return ['array',obj] ;
			} else if(obj instanceof Object) {
				var keys = [], values = [] ;
				for(var key in obj){
					keys.push(key) ;
					values.push(arrangeForAhkTraversing(obj[key])) ;
				}
				return ['object',[keys,values]] ;
			} else
				return [typeof obj,obj] ;
		}"
		)
	}
	
	; Декодирует JSON-строку в массив, вызывая функцию JS с помощью COM-объекта и
	; возвращает объект AHK.
	Decode(jsonStr) {
		this.SC.ExecuteStatement(this.jsCode "; obj=" jsonStr)
		return this.convertJScriptObjToAhks( this.SC.Eval("arrangeForAhkTraversing(obj)") )
	}
	
	convertJScriptObjToAhks(jsObj){
		if(jsObj[0]="object") {
			obj := {}, keys := jsObj[1][0], values := jsObj[1][1]
			loop % keys.length
				obj[keys[A_INDEX-1]] := this.convertJScriptObjToAhks( values[A_INDEX-1] )
			return obj
		} else if(jsObj[0]="array") {
			array := []
			loop % jsObj[1].length
				array.insert(this.convertJScriptObjToAhks( jsObj[1][A_INDEX-1] ))
			return array
		} else
			return jsObj[1]
	}
	
	Encode(obj) {
		str := ""
		array := true
		for k in obj {
			if (k == A_Index)
				continue
			array := false
			break
		} if (array)
			for a, b in obj
				str .= (IsObject(b) ? this.Encode(b) :  b) . ","
		else
			for a, b in obj
				str .= ("""" a """:") . (IsObject(b) ? this.Encode(b) : """" b """") . ","
		str := RTrim(str, " ,")
		return (array ? "[" str "]" : "{" str "}")
	}
}

Сохраните в файле "JSON.ahk"
Пример извлечения значений из четвёртого элемента в массиве "items":


#SingleInstance, Force
#NoEnv
SetWorkingDir, A_ScriptDir

#Include <JSON>
oJson := New JSON()

jText = {"response":{"count":1327,"items":[{"id":456239092,"album_id":43057155,"owner_id":-4410189,"user_id":468722286,"photo_75":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499d\/-WVOjdnpJZI.jpg","photo_130":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499e\/uQcruFXFMdk.jpg","photo_604":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499f\/y43rEl-TAkA.jpg","width":450,"height":600,"text":"","date":1516419054,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239078,"album_id":42994275,"owner_id":-4410189,"user_id":178805115,"photo_75":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c2\/zjw36aXGsrg.jpg","photo_130":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c3\/6pqM4Ptzqzo.jpg","photo_604":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c4\/bVjh384ZaLs.jpg","width":600,"height":300,"text":"http:\/\/fas.st\/UF5a3","date":1498331078,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239077,"album_id":203534724,"owner_id":-4410189,"user_id":178805115,"photo_75":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bb\/jUH3jjLme28.jpg","photo_130":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bc\/dvTzcguDpI0.jpg","photo_604":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bd\/6uf84mYlyu8.jpg","width":600,"height":300,"text":"http:\/\/fas.st\/UF5a3","date":1498331077,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239049,"album_id":43023085,"owner_id":-4410189,"user_id":100,"photo_75":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe0\/8F1vthi-tjo.jpg","photo_130":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe1\/KxtmhBBZuY4.jpg","photo_604":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe2\/ZoT63tAPvHg.jpg","photo_807":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe3\/zbDlM4tkBS8.jpg","photo_1280":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe4\/sKgl1iXF-5o.jpg","width":877,"height":561,"text":"Эскиз к роману в стихах А.С.Пушкина \"Евгений Онегин\". Автор Lena Ashraf.","date":1492174953,"likes":{"user_likes":0,"count":1},"reposts":{"count":0}}]}}

oJ		 := oJson.Decode(jText)		; Превратить в объект AHK
frElem	 := oJ.response.items[4]	; Четвёртый элемент из запроса

; Доступ к полям объекта через точку, или квадратные скобки
textItem := Format("id = {1}`nalbum_id = {2}`nowner_id = {3}`nphoto_75 = {4}`ntext = {5}"
				, frElem["id"], frElem.album_id, frElem.owner_id, frElem.photo_75, frElem["text"])

MsgBox,,Title,% textItem

return

Escape::
	ExitApp

UPD:
Единственное, метод Encode() не устанавливает escape символы, так что может не везде быть применим, но для контекста AHK годится более чем.

+ DD

14

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

KusochekDobra
Спасибо! А можно ли извлечь одномоментно все элементы, не определяя по номеру? И есть ли настройка извлечения именно последнего фото с бОльшим разрешением и случайным номером ключа — внутри каждого элемента? Или настройка извлечения всех изображений — которые можно будет уже потом очистить от уменьшенных копий?

15 (изменено: KusochekDobra, 2018-02-03 19:19:16)

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

Как Вы это себе представляете? Это ведь стандартный синтаксис AHK. Используется содержимое массива, с доступом через ключ "items". В Вашем примере 4 элемента, чтобы перебрать поочерёдно все элементы этого массива используйте цикл, например:


Loop,% oJ.response.items.Length() {
	item := oJ.response.items[A_Index]
	MsgBox,,Title,% Format("id = {1}`nalbum_id = {2}`nowner_id = {3}`nphoto_75 = {4}`ntext = {5}"
				, item["id"], item.album_id, item.owner_id, item.photo_75, item["text"])
}

UPD:
Чтобы перебрать вообще все поля всех элементов:


oJ := oJson.Decode(jText)		; Превратить в объект AHK
allItemsText := ""
Loop,% oJ.response.items.Length() {
	item := oJ.response.items[A_Index], txt := "`nItem № " . A_Index . "`n"
	for k, v in item {
		txt .= k " = " v "`n"
	}
	allItemsText .= txt
}
MsgBox,,Title,% allItemsText

16

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

А как думаете: для сотни элементов будет ли эффективней заменами регулярными выражениями перевести нужные ключи на новую строку с уникальным символом в начале, и потом извлечь всё начинающееся этим символом, — или использовать метод разбора JSON, которым, как я понял, получить определенные фото (либо все фото) нельзя?

17

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

Вы видимо плохо представляете себе, что такое JSON. Советую почитать об этом в Гугле.
Если очень коротко, то JSON-строка помещается всем своим содержимым в переменную и всё, что Вы видите в текстовом представлении до её преобразования, доступно из объекта, в который она превращается. Нужно только указать индекс для элементов-массивов, или имя ключа, для полей объектов.

18

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

На мой взгляд, использование объекта более оправданно, нежели парсинг. Так Вы получаете удобный, структурированный объект в памяти программы, которым можно манипулировать в процессе, извлекая из него нужные значения, как при использовании любой переменной.

19

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

По-моему, парсинг в любом случае придется использовать, поскольку вариации имён ключей у фотографий не постоянные. Тут лучше наверно сразу парсить.

20

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

А что это изменит?
В случае с парсингом Вы будете искать в тексте конкретные вхождения последовательности символов, точно так же представляющих имя соответствующего имени ключа в объекте. Разве нет?

Ещё раз, поясните пожалуйста, что конкретно нужно получать из элементов массива "items"?

21 (изменено: DD, 2018-02-03 20:36:36)

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

Требовалось получать следующие четыре ключа,

"id":456239092
"owner_id":-4410189
https:\/\/pp.userapi.com\/c840126\/v840126582\/7499f\/y43rEl-TAkA.jpg
"text":""

со ссылкой на последнюю фотографию внутри каждого элемента. Фотографии в каждом элементе даны в нескольких разрешениях, а нужна последняя, бОльшего формата. С этой целью добавил к коду рег. шаблон, перед обработкой оставляющий только крупные фото:


#SingleInstance, Force
#NoEnv
SetWorkingDir, A_ScriptDir

#Include JSON.ahk
oJson := New JSON()

jText = {"response":{"count":1327,"items":[{"id":456239092,"album_id":43057155,"owner_id":-4410189,"user_id":468722286,"photo_75":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499d\/-WVOjdnpJZI.jpg","photo_130":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499e\/uQcruFXFMdk.jpg","photo_604":"https:\/\/pp.userapi.com\/c840126\/v840126582\/7499f\/y43rEl-TAkA.jpg","width":450,"height":600,"text":"","date":1516419054,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239078,"album_id":42994275,"owner_id":-4410189,"user_id":178805115,"photo_75":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c2\/zjw36aXGsrg.jpg","photo_130":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c3\/6pqM4Ptzqzo.jpg","photo_604":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286c4\/bVjh384ZaLs.jpg","width":600,"height":300,"text":"http:\/\/fas.st\/UF5a3","date":1498331078,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239077,"album_id":203534724,"owner_id":-4410189,"user_id":178805115,"photo_75":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bb\/jUH3jjLme28.jpg","photo_130":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bc\/dvTzcguDpI0.jpg","photo_604":"https:\/\/pp.userapi.com\/c639429\/v639429115\/286bd\/6uf84mYlyu8.jpg","width":600,"height":300,"text":"http:\/\/fas.st\/UF5a3","date":1498331077,"likes":{"user_likes":0,"count":0},"reposts":{"count":0}},{"id":456239049,"album_id":43023085,"owner_id":-4410189,"user_id":100,"photo_75":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe0\/8F1vthi-tjo.jpg","photo_130":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe1\/KxtmhBBZuY4.jpg","photo_604":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe2\/ZoT63tAPvHg.jpg","photo_807":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe3\/zbDlM4tkBS8.jpg","photo_1280":"https:\/\/pp.userapi.com\/c638723\/v638723276\/2bfe4\/sKgl1iXF-5o.jpg","width":877,"height":561,"text":"Эскиз к роману в стихах А.С.Пушкина \"Евгений Онегин\". Автор Lena Ashraf.","date":1492174953,"likes":{"user_likes":0,"count":1},"reposts":{"count":0}}]}}

     jText := RegExReplace(jText, """photo_\d+""[^\}]*""photo_\d+""", """photo_big""")

oJ		 := oJson.Decode(jText)		; Превратить в объект AHK

Loop,% oJ.response.items.Length() {
	item := oJ.response.items[A_Index]
	MsgBox,,Title,% Format("id = {1}`nowner_id = {2}`nphoto_big = {3}`ntext = {4}"
				, item["id"], item.owner_id, item.photo_big, item["text"])
}
return

22 (изменено: KusochekDobra, 2018-02-03 21:23:33)

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

Поскольку все разрешения имеют фиксированные имена ключей(это видно из примера), можно перечислить их в убывающем порядке в массиве и перебирать ключи текущего элемента массива из этого перечисления:


oJ := oJson.Decode(jText)		; Превратить в объект AHK
photoKeys := ["photo_1280","photo_807","photo_604","photo_130","photo_75"]
Loop,% oJ.response.items.Length() {
	item := oJ.response.items[A_Index],  i := 1
	while (!item.HasKey(photoKeys[i++]))
		Continue
	MsgBox,,Title,% Format("id = {1}`nowner_id = {2}`nphoto_big = {3}`ntext = {4}"
					, item["id"], item.owner_id, item[photoKeys[i-1]], item["text"])
}

Если в перечислении из примера не все варианты, их наверняка можно найти в документации и включить в массив.

23

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

Интересный вариант, спасибо!