Что нового

Ответ на вопрос (VK API)

louie1743shkirondo

Новичок
Сообщения
28
Репутация
0
Есть проблема - при запросе messages.getDialogs (так же и при запросе messages.get) response выдаёт мне почти всю информацию, кроме id юзера... Сама ирония в том, что чтобы отправить сообщение с помощью messages.send нужно знать id юзера (там так же есть и peer_id и chat_id, которые я пробовал взамен, но ничего не получилось, видимо руки не оттуда растут ;D)
В общем.. Сам код выглядит следующем образом: (Да, там некоторые момент алогичны и непонятны, но, тем не менее, это работает)
Код:
#include <String.au3>
#include <Array.au3>
#include <File.au3>
#include <IE.au3>
#include <Array.au3>

HotKeySet("{ESC}", "Close")

$Offset = 0

Global $File = @ScriptDir & "\Answers.txt"
If Not FileExists($File) Then _FileCreate($File)
Global $FileOpen = FileOpen($File, $FO_APPEND)

Global $Token = 'Токен'

While 1
   VK()
WEnd

Func VK()
   Global $dShell = "https://api.vk.com/method/messages.getDialogs?&count=6&" & $Offset & "&unread=1&access_token=" & $Token & "&v=5.57"

$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTTP.Open('GET', $dShell)
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0")
$oHTTP.Send('')
$oHTTP.WaitForResponse
$res = $oHTTP.ResponseText

VKJSON_GetItemsFromResponse($res)
Sleep(2000)

   $st_pos = StringInStr($res, """response""")
   $Ust_pos = StringInStr($res, '"user_id"')
   $Ust_pos = StringInStr($res, '"user_id":', 0, 1, $st_pos)
   $Uend_pos = StringInStr($res, ',"read_state"', 0, 1, 1)

   Global $User_Id = StringMid($res, $Ust_pos + 10, $Uend_pos - $Ust_pos - 11) + 2000000000  
#cs  
тут я прибавляю это число, так как это необходимо для групповой беседы(просто думал, вдруг поможет хоть это)
#ce

   $Ust_pos = StringInStr($res, '"count"')
   $Ust_pos = StringInStr($res, '"count":', 0, 1, $st_pos)
   $Uend_pos = StringInStr($res, ',"items"', 0, 1, 1)

   Global $DialogsCount = StringMid($res, $Ust_pos + 8, $Uend_pos - $Ust_pos - 8)

   $Offset += 1

   If $Offset = $DialogsCount Then
	  $Offset = 0
   EndIf
	  Global $Text = _StringBetween($res, '"body":"', '"')

	  For $i = 0 To $DialogsCount - 1
		 Global $Message = $Text[$i]
		 CheckKnowledge()
		 $i += 1
		 Sleep(3000)
		 Next
EndFunc

Func VKJSON_GetItemsFromResponse($res)
	Local $Obj = ObjCreate('scripting.Dictionary')
	Local $Last_Pos = 1
	Local $counter = 1
	Local $resp

	While 1
		$resp = VKJSON_GetItem($res, $Last_Pos)
		If $Last_Pos = 0 Then ExitLoop
		$Obj.add($counter, StringReplace($resp, '\"', ''))
		$counter += 1
	WEnd
	Return $Obj
EndFunc
;=======================================================================================
Func VKJSON_GetItem(ByRef $res, ByRef $lastSt_pos)

	Local $st_pos = $lastSt_pos, $end_pos = 0, $next_pos = 0, $return_Pos = 0

	$st_pos = StringInStr($res, "{", 0, 1, $st_pos)
	If $st_pos = 0 Then
		$lastSt_pos = 0
		Return 0
	EndIf

	$end_pos = StringInStr($res, "}", 0, 1, $st_pos)
	$next_pos = StringInStr($res, "{", 0, 1, $st_pos + 1)
	$lastSt_pos = $end_pos
	While ($next_pos < $end_pos)
		$lastSt_pos = $end_pos
		$end_pos = StringInStr($res, "}", 0, 1, $end_pos + 1)
		$next_pos = StringInStr($res, "{", 0, 1, $next_pos + 1)
	WEnd
	Return SetError(0, $return_Pos + 1, StringMid($res, $st_pos + 1, $end_pos - $st_pos - 1))

EndFunc
;=====================================================================================================================================
Func CheckKnowledge()
   Local $Knowledge
   $Knowledge = FileReadToArray($File)
   $aNumber = UBound($Knowledge)
   ;ConsoleWrite($aNumber)
   For $i = 0 To $aNumber - 1
	  $quest = ""
	  $answ = ""
	  $line = $Knowledge[$i]
	  $line = StringSplit($line, "|")
	  $quest = $line[1]
	  $answ = $line[2]
	  ;ConsoleWrite($answ & @CRLF)
	  If $Message = $quest Then
		 $aShell = "https://api.vk.com/method/messages.send?peer_id=" & $User_Id & "&message=" & $answ & "&access_token=" & $Token & "&v=5.57"
	        ConsoleWrite($answ)
	     $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
		 $oHTTP.Open('POST', $aShell)
		 $oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0")
		 $oHTTP.Send('')
	  Else
		 $ans = "Я не знаю ответа на этот вопрос, скажи его, и я зафиксирую его в базе данных"
		 $aShell = "https://api.vk.com/method/messages.send?peer_id=" & $User_Id & "&message=" & $ans & "&access_token=" & $Token & "&v=5.57"
		 FileWrite($FileOpen, $Message & "|" & @CRLF)  ; тут немного не доделал, ибо единственная идея, как определять, что юзер ответил на мою просьбу (Я не знаю ответа на этот вопрос, скажи его, и я зафиксирую его в базе данных) - это отправлять запрос и смотреть моё последенее сообщение, затем последнее сообщение юзера, сравнивать id сообщений(дабы удостовериться) и затем уже записывать его ответ...
	  EndIf
   Next
EndFunc
;======================================================================================================================================
Func Close()
   Exit
EndFunc

P.S.
Если есть предложения по оптимизации и по решению сие проблемы, буду только рад
 
Автор
L

louie1743shkirondo

Новичок
Сообщения
28
Репутация
0
Да, если вдруг кому интересно, то я разобрался, просто я не умею считать...

Код:
Global $User_Id = StringMid($res, $Ust_pos + 10, $Uend_pos - $Ust_pos - 10)

Надо вычитать 10, а не 11... Иначе он съедает одну цифру...
 
Верх