Что нового

Зависание функции в коде и нормальная работа вне его.

Gzzk

Новичок
Сообщения
104
Репутация
1
Здравствуйте.
Сегодня столкнулся с проблемой.После некоторой доработки кода одна функция начала зависать,хотя её я не трогал,а без остального кода она прекрасно работает.
Вот собственно функция:
Код:
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'

То всё будет отлично работать.
Помогите пожалуйста!
Заранее благодарен.
 
Верх