Здравствуйте.
Сегодня столкнулся с проблемой.После некоторой доработки кода одна функция начала зависать,хотя её я не трогал,а без остального кода она прекрасно работает.
Вот собственно функция:
А в связке с вот таким громоздким быдлокодом она просто зависает:
При этом,если вместо вызова этой функции сделать так:
То всё будет отлично работать.
Помогите пожалуйста!
Заранее благодарен.
Сегодня столкнулся с проблемой.После некоторой доработки кода одна функция начала зависать,хотя её я не трогал,а без остального кода она прекрасно работает.
Вот собственно функция:
Код:
Func _GetKey($iAppID)
$sAuth_url = "https://oauth.vk.com/authorize?client_id="&$iAppID&"&scope=8192&redirect_uri=http://oauth.vk.com/blank.html&display=wap&response_type=token"
Local $oIE = _IECreateEmbedded()
Local $hTimer = TimerInit()
$_hATgui = GUICreate("Вконтакте | Вход", 400, 300, -1, -1, $WS_SYSMENU)
GUICtrlCreateObj($oIE, 5, 5, 385, 260)
_IENavigate($oIE, $sAuth_url)
$sResponse = _IEBodyReadText($oIE)
If StringInStr($sResponse, "Пожалуйста") Then
$sURL = _IEPropertyGet($oIE, "locationurl")
ConsoleWrite($sURL&@CRLF)
Return __responseParse($sURL)
EndIf
GUISetState(@SW_SHOW)
While 1
If GUIGetMsg()=$GUI_EVENT_CLOSE Then
Exit
ElseIf TimerDiff($hTimer) > 50 Then
$sURL = _IEPropertyGet($oIE, "locationurl")
If StringInStr($sURL, 'user_id=') Then
GUISetState(@SW_HIDE)
GUIDelete($_hATgui)
Return __responseParse($sURL)
ElseIf StringInStr($sURL,'error') Or StringInStr($sURL,'cancel') Then
Exit
EndIf
$hTimer = TimerInit()
EndIf
WEnd
EndFunc ;==>_VK_SignIn
Func __responseParse($_sResponse)
$res_array = StringRegExp($_sResponse, '_token=(\w{1,})\&', 3)
Return $res_array[0]
EndFunc ;==>__responseParse
А в связке с вот таким громоздким быдлокодом она просто зависает:
Код:
#include-once
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <MenuConstants.au3>
#include <Array.au3>
#Include <Log.au3>
#include <IE.au3>
#include <File.au3>
Global $sCookie,$sLogin,$sPass,$sApp_id,$bWork,$hLog = _Log_Open(@ScriptDir & '\fbotlog.log', "###Лог файл fbot'а###"),$sAuth_key
$UserLog=FileOpen (@ScriptDir & '\User_log.txt', 2)
_Log_Report($hLog, 'Запустились.')
FileWrite($UserLog,'Запустились.'&@CRLF)
_Load()
#Region ### START Koda GUI section ###
$Form1_1 = GUICreate("lbot by LowSkiII", 381, 350, 195, 128)
$Login = GUICtrlCreateInput($sLogin, 16, 40, 137, 21)
$Pass = GUICtrlCreateInput($sPass, 16, 88, 137, 21)
$app_id = GUICtrlCreateInput($sApp_id, 16, 136, 137, 21)
$Label2 = GUICtrlCreateLabel("Пароль:", 17, 70, 45, 17)
$Label1 = GUICtrlCreateLabel("Логин:", 16, 22, 38, 17)
$Label3 = GUICtrlCreateLabel("Cookie:", 16, 157, 40, 17)
$Label4 = GUICtrlCreateLabel("ID приложения:", 16, 118, 83, 17)
$Start = GUICtrlCreateButton("Старт", 8, 312, 75, 25)
$Save = GUICtrlCreateButton("Сохранить", 296, 312, 75, 25)
$Log = GUICtrlCreateEdit("", 176, 16, 185, 281, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
GUICtrlSendMsg($Log, $EM_LIMITTEXT, -1, 0) ; снимает ограничение 32kб с поля Edit1
$Group1 = GUICtrlCreateGroup("Авторизация", 8, 0, 153, 305)
$Cookie = GUICtrlCreateEdit($sCookie, 16, 176, 137, 122, BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$WS_VSCROLL))
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Pause = GUICtrlCreateButton("Пауза", 153, 312, 75, 25)
$Group2 = GUICtrlCreateGroup("Лог", 168, 0, 201, 305)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
While 1
Sleep(100)
_LogUpdate()
If $bWork Then
$sUrl=_Redirectlot($sCookie)
if $sUrl<>'0' And $sUrl<>'1' Then
FileWrite($UserLog,'Получили ссылку.'&@CRLF)
$Likes=_VKlikesAdd($sAuth_key,_UrlToID($sUrl,1),_UrlToID($sUrl,3),_UrlToID($sUrl,2))
_Log_Report($hLog,"Ответ от _VKlikesAdd():"&$Likes)
$Check=_Check($sCookie)
EndIf
EndIf
WEnd
Func WM_SYSCOMMAND($hWmd, $Msg, $wParam, $lParam)
If $wParam = $SC_CLOSE Then
_Log_Report($hLog, 'Выход.')
Exit
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Switch $nNotifyCode
Case $BN_CLICKED
Switch $nID
Case $Start
$bWork=True
_Log_Report($hLog, 'Стартанули.')
FileWrite($UserLog,'Стартанули.'&@CRLF)
_Convert()
_Save()
$sAuth_key=_GetKey(3528812)
Case $Pause
$bWork=False
_Log_Report($hLog, 'Пауза.')
FileWrite($UserLog,'Пауза.'&@CRLF)
Case $Save
FileWrite($UserLog,'Сохранились.'&@CRLF)
_Convert()
_Save()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
#region
Func _Convert()
$sLogin = GUICtrlRead($Login)
$sPass = GUICtrlRead($Pass)
$sCookie = GUICtrlRead($Cookie)
$sApp_id = GUICtrlRead($app_id)
_Log_Report($hLog, '_Convert():$sLogin='&$sLogin&'$sPass='&$sPass&'$sCookie='&$sCookie&'$sApp_id='&$sApp_id)
EndFunc ;==>_Convert()
Func _Save()
$sIni=@ScriptDir & "\cfg.ini"
IniWrite($sIni, "", "Login", $sLogin)
IniWrite($sIni, "", "Password", $sPass)
IniWrite($sIni, "", "Cookie", $sCookie)
IniWrite($sIni, "", "app_id", $sApp_id)
_Log_Report($hLog, 'Сохранились.')
EndFunc ;==>_Save()
Func _Load()
$sIni=@ScriptDir & "\cfg.ini"
$sLogin=IniRead($sIni, "", "Login", "")
$sPass=IniRead($sIni, "", "Password", "")
$sCookie=IniRead($sIni, "", "Cookie", "")
$sApp_id=IniRead($sIni, "", "app_id", "")
_Log_Report($hLog, '_Load():$sLogin='&$sLogin&'$sPass='&$sPass&'$sCookie='&$sCookie&'$sApp_id='&$sApp_id)
EndFunc ;==>_Load()
Func _Check($sCookie)
$sDomain = 'olike.ru' ;домен или ip-адрес
$iPort = 80 ;порт
;Запрос, который будет отправлен серверу
$sRequest = 'GET /API/api.php?func=checkmylike HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17' & @CRLF
$sRequest &= 'Host: ' & $sDomain & @CRLF
$sRequest &= 'Referer: http://olike.ru/earn.php' & @CRLF
$sRequest &= 'Connection: keep-alive' & @CRLF
$sRequest &= 'Cookie: '&$sCookie & @CRLF & @CRLF
If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
Exit 1
EndIf
$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес
If @error Then
MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
Exit 2
EndIf
$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером
If @error Then
MsgBox(16, 'Ошибка', 'Не удалось соедениться с сервером.')
Exit 3
EndIf
TCPSend($iSocket, $sRequest) ;отправляем сообщение
If @error Then
MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
Exit 4
EndIf
$sData = Binary('')
$iTimer = TimerInit() ;запускаем таймер
Do
$sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
$iError = @error
If Not $sBuffer = '' Then ;если удалось получить сообщение
$sData &= $sBuffer ;сохраняем полученное сообщение
$iTimer = TimerInit() ;обнуляем таймер
EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла
TCPCloseSocket($iSocket)
TCPShutdown()
;_Log_Report($hLog, 'Полный пакет от _Check():'&$sData)
$res_array=StringRegExp($sData, '\d\r\n([0-9A-z]{1,})\r\n', 3)
if IsArray($res_array) Then
if StringIsDigit($res_array[0]) Then
_Log_Report($hLog,"Балл начислен.Текущий балланс:"&$res_array[0])
FileWrite($UserLog,"Балл начислен."&@CRLF&"Текущий балланс: "&$res_array[0]&@CRLF)
ElseIf StringInStr ($res_array[0], "toomuch") Then
_Log_Report($hLog,"Баллы скоро будут зачислены."&$res_array[0]&@CRLF)
FileWrite($UserLog,"Баллы скоро будут зачислены.")
ElseIf StringInStr ($res_array[0],"notfound") Then
_Log_Report($hLog,"Балл не защитан."&$res_array[0]&@CRLF)
FileWrite($UserLog,"Балл не защитан.")
EndIf
EndIf
if IsArray($res_array) Then
_Log_Report($hLog, '_Check():'&$res_array[0])
return $res_array[0]
Else
$res_array=StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')
If IsArray($res_array) Then
_Log_Report($hLog, '_Check():'&$res_array[1])
return $res_array[1]
Else
_Log_Report($hLog, '_Check(),странный ответ:'&$sData)
EndIf
EndIf
EndFunc ;<== _Check()
Func _Redirectlot($sCookie)
$sDomain = 'olike.ru' ;домен или ip-адрес
$iPort = 80 ;порт
;Запрос, который будет отправлен серверу
$sRequest = 'GET /redirectlot.php HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31' & @CRLF
$sRequest &= 'Host: ' & $sDomain & @CRLF
$sRequest &= 'Referer: http://olike.ru/earn.php' & @CRLF
$sRequest &= 'Connection: keep-alive' & @CRLF
$sRequest &= 'Cookie: '&$sCookie & @CRLF & @CRLF
;ConsoleWrite($sRequest & @LF)
If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
Exit 1
EndIf
$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес
If @error Then
MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
Exit 2
EndIf
$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером
If @error Then
MsgBox(16, 'Ошибка', 'Не удалось соедениться с сервером.')
Exit 3
EndIf
TCPSend($iSocket, $sRequest) ;отправляем сообщение
If @error Then
MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
Exit 4
EndIf
$sData = Binary('')
$iTimer = TimerInit() ;запускаем таймер
Do
$sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
$iError = @error
If Not $sBuffer = '' Then ;если удалось получить сообщение
$sData &= $sBuffer ;сохраняем полученное сообщение
$iTimer = TimerInit() ;обнуляем таймер
EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла
TCPCloseSocket($iSocket)
TCPShutdown()
;_Log_Report($hLog, 'Полный пакет от _Redirectlot():'&$sData)
$a=StringRegExp($sData,'Location:\s(.+)',3)
If IsArray($a) Then
_Log_Report($hLog, '_Redirectlot():'&$a[0])
return $a[0]
ElseIf StringInStr($sData,'заказов') Then
_Log_Report($hLog, 'Нет заказов.')
FileWrite($UserLog,"Нет заказов."&@CRLF)
return 1
;;;Нет заказов.
ElseIf Not StringInStr($sData,"заказов") AND Not StringInStr($sData,"vk") Then
$a = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')
_Log_Report($hLog, '_Redirectlot():'&$a[1])
FileWrite($UserLog,"Ошибка."&@CRLF)
return 0
;;;Что-то не так.
EndIf
EndFunc ;<== _Redirectlot()
Func _UrlToID($sUrl,$iFlag=1);1-тип,2-id автора,3-id поста;
$buf=StringRegExp($sUrl,"vk.com%2F([A-Za-z0-9._-]{7,})",3)
$sUrl=$buf[0]
;_Log_Report($hLog, 'Тип поста:'&$sType&@CRLF&'ID автора:'&$sAutorId&@CRLF&'ID поста:'&$sPostId))
Switch $iFlag
Case 1
$buf=StringRegExp($sUrl, '([A-Za-z]{4,})', 3)
$sType=$buf[0]
if $sType='wall' Then
$sType='post'
EndIf
return $sType
Case 2
$buf=StringRegExp($sUrl, '(\d{1,})', 3)
If StringInStr($sUrl,"-") Then
$sAutorId='-'&$buf[0]
Else
$sAutorId=$buf[0]
EndIf
return $sAutorId
Case 3
$buf=StringRegExp($sUrl, '_(\d{1,})', 3)
$sPostId=$buf[0]
return $sPostId
EndSwitch
EndFunc ;<== _UrlToID
Func _GetKey($iAppID)
$sAuth_url = "https://oauth.vk.com/authorize?client_id="&$iAppID&"&scope=8192&redirect_uri=http://oauth.vk.com/blank.html&display=wap&response_type=token"
$oIE = _IECreateEmbedded()
$hTimer = TimerInit()
$_hATgui = GUICreate("Вконтакте | Вход", 400, 300, -1, -1, $WS_SYSMENU)
GUICtrlCreateObj($oIE, 5, 5, 385, 260)
_IENavigate($oIE, $sAuth_url)
$sResponse = _IEBodyReadText($oIE)
If StringInStr($sResponse, "Пожалуйста") Then
$sURL = _IEPropertyGet($oIE, "locationurl")
Return __responseParse($sURL)
EndIf
GUISetState(@SW_SHOW)
While 1
If GUIGetMsg()=$GUI_EVENT_CLOSE Then
Exit
ElseIf TimerDiff($hTimer) > 100 Then
$sURL = _IEPropertyGet($oIE, "locationurl")
If StringInStr($sURL, 'user_id=') Then
GUISetState(@SW_HIDE)
GUIDelete($_hATgui)
Return __responseParse($sURL)
ElseIf StringInStr($sURL,'error') Or StringInStr($sURL,'cancel') Then
Exit
EndIf
$hTimer = TimerInit()
EndIf
WEnd
EndFunc ;==>_GetKey
Func __responseParse($_sResponse)
$res_array = StringRegExp($_sResponse, '_token=(\w{1,})\&', 3)
Return $res_array[0]
EndFunc ;==>__responseParse
Func _VKlikesAdd($_sAccessToken, $_sType, $_iItem_id, $_sOwnerID = "")
Local $sLikes, $sResponse
$sResponse = BinaryToString(InetRead("https://api.vkontakte.ru/method/likes.add.xml?"& _
"owner_id=" & $_sOwnerID & "&type=" & $_sType & "&item_id=" & $_iItem_id & "&access_token=" & $_sAccessToken), 4)
_Log_Report($hLog, 'Тип поста:'&$_sType&' ID автора:'&$_sOwnerID&' ID поста:'&$_iItem_id)
If _VK_CheckForError($sResponse) Then
Return SetError(1, 0, _VK_CheckForError($sResponse))
FileWrite($UserLog,'Не поставили лайк.'&@CRLF)
Else
$iLikes = _CreateArray($sResponse, "likes")
FileWrite($UserLog,'Поставили лайк.'&@CRLF)
Return $iLikes[0]
EndIf
EndFunc ;==>_VK_likesAdd
Func _VK_CheckForError($sResponse)
Local $error_Code, $error_Msg
$error_Code = _CreateArray($sResponse, "error_code")
$error_Msg = _CreateArray($sResponse, "error_msg")
If IsArray($error_Code) Then
Return "Error: " & $error_Code[0] & " - " & $error_Msg[0]
Else
Return 0
EndIf
EndFunc ;==>_VK_CheckForError
Func _CreateArray($sString, $sCodeWord)
Dim $aRetArray
$aRetArray = StringRegExp($sString, "<" & $sCodeWord & ">(.*?)</" & $sCodeWord & ">", 3)
Return $aRetArray
EndFunc ;==>_CreateArray
Func _LogUpdate()
$file = FileOpen(@ScriptDir & '\User_log.txt', 0) ; Открыть для чтения
$data = FileRead($file)
FileClose($file)
If $data = GUICtrlRead($Log) Then Return
GUICtrlSetData($Log, $data)
EndFunc ;==>_LogUpdate
#endregion
Код:
$sAuth_key='123'
То всё будет отлично работать.
Помогите пожалуйста!
Заранее благодарен.