louie1743shkirondo
Новичок
- Сообщения
- 28
- Репутация
- 0
Есть проблема - при запросе messages.getDialogs (так же и при запросе messages.get) response выдаёт мне почти всю информацию, кроме id юзера... Сама ирония в том, что чтобы отправить сообщение с помощью messages.send нужно знать id юзера (там так же есть и peer_id и chat_id, которые я пробовал взамен, но ничего не получилось, видимо руки не оттуда растут ;D)
В общем.. Сам код выглядит следующем образом: (Да, там некоторые момент алогичны и непонятны, но, тем не менее, это работает)
P.S.
В общем.. Сам код выглядит следующем образом: (Да, там некоторые момент алогичны и непонятны, но, тем не менее, это работает)
Код:
#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.
Если есть предложения по оптимизации и по решению сие проблемы, буду только рад