Что нового

Передача капчи с одного компьютера на другой

iwak

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

Есть 2 компьютера. На первом происходит переход по страницам с капчей, после чего происходит отправка этих капч на второй компьютер, где они в последствии должны быть разгаданы.

Код:
_ienavigate($oIE, "www.site.com/login", 1) ; переход на страницу с капчей
_screencapture(0, 0, 100, 100) ; делаем скрин определенной области экрана где обычно появляется капча
; далее сохраняем файл в буфер или на компьютер
; передаем этот файл на второй компьютер, но вместе с ним нужно создать небольшой GUI на втором компе, с полем для ввода этой капчи
; тем временем, на втором компе производится ввод капчи и отправка на первый
; получаем результат обратно на первый комп. 
 $Captcha = _IEFormGetObjByName($oIE, "captcha_input") ; ищем на сайте поле для ввода капчи
 _IEFormElementSetValue($Captcha, "123456") ; заполняем полученный текст в форму для ввода капчи
$1 = _imagesearch('right_captcha.bmp', 1, $x, $y, 1) ; ищем текст или изображение, которое подтвердит то, что капча введена верно
if $1 = 0 then ; если не найдено то
send("{F5}") ; обновляем страницу вместе с капчей
do
; повторяет все действия - отправка капчи на компьютер, получение текста, ввод капчи, проверка...
until $1 = 1 ; до тех пор, пока не будет введена правильная капча

; продолжаем работу...



Что-то похожее вроде есть на сайтах по отгадыванию капч, только здесь идет отправка капчи на компьютер, а не на сайт.

Буду рад любой помощи. Советы, ссылки, примеры...
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Если 2 компьютера в локальной сети, то создавайте общую папку. Если нет, то проще через dropbox.
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
По сути, нужно получить капчу как изображение и отправить ее на другой комп.
Отправлять можно как угодно (файлом, кодом, любым другим способом), но только не той ссылкой, которую Вы получили.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
inververs [?]
Если 2 компьютера в локальной сети, то
Можно попробовать через TCP или UDP сокеты, пример был где-то в справке

А, вот они, нашёл.
Код:
; Этот скрипт - сервер, запускайте его первым! (Вторым запускайте второй пример из функции TCPRecv, который является клиентом).
#include <FileConstants.au3>

Example()

Func Example()
	Local $iError = 0
	; Примечание: Выберите файл более 4 kiB, иначе досточно первого примера
	Local $sFilePath = FileOpenDialog("Выбрать файл для передачи сервером", @MyDocumentsDir, "All types (*.*)", 1 + 2) ; Выбор через диалоговое окно

	If @error Then ; Если ошибка (например при нажатии "Отмена"), то выход
		$iError = @error
		MsgBox(4096 + 48, "", "Сервер:" & @CRLF & "Ошибка при выборе файла, @error = " & $iError)
		Return False
	EndIf

	TCPStartup() ; Запуск TCP служб.

	; Регистрация функции OnAutoItExit для остановки служб при завершении скрипта.
	OnAutoItExitRegister("OnAutoItExit")

	; Установка IP-адреса и порта
	Local $sIPAddress = "127.0.0.1" ; Этот IP-адрес работает только для теста на вашем компьютере.
	Local $iPort = 65432 ; Порт, используемый для соединения.

	; Создает сокет связанный с указанным IP-адресом и портом с максимальным количеством подключений на ожидании 100.
	Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)

	If @error Then ; Если ошибка, то выход
		; Кто-то возможно уже прослушивает этот IP-адрес и порт (ещё одна копия скрипта уже выполняется?).
		$iError = @error
		MsgBox(4096 + 16, "", "Сервер:" & @CRLF & "Не удалось прослушать сокет, @error = " & $iError)
		Return False
	EndIf

	; Переменная для клиентского сокета.
	Local $iSocket = 0

	Do ; Ожидание кого-то, кто подключится (Без ограничений).
		; Принимает входящие соединения, если имеются (Сокет закрывается, при завершении; один сокет на одного клиента).
		$iSocket = TCPAccept($iListenSocket)

		If @error Then ; Если ошибка, то выход
			$iError = @error
			MsgBox(4096 + 16, "", "Сервер:" & @CRLF & "Не удалось принять входящее соединение, @error = " & $iError)
			Return False
		EndIf
	Until $iSocket <> -1 ; Если не равно -1, это означает, что клиент подключен.

	; Закрывает прослушиваемый сокет, чтобы позволить соединение в дальнейшем.
	TCPCloseSocket($iListenSocket)

	Local $iFileSize = FileGetSize($sFilePath) ; Получает размер файла

	Local $hFile = FileOpen($sFilePath, 16) ; Открывает в бинарном режиме, возвращая дескриптор

	; Устанавливает смещение файла при чтении.
	Local $iOffset = 0

	; Устанавливает размер читаемого блока 4 KiB.
	Local Const $i4KiB = 4096

	; Примечание: Файл отправляется по частям 4 KiB.

	; Отправляет бинарные данные из файла на сервере.
	Do
		; Устанавливает позицию в файле по самещению.
		FileSetPos($hFile, $iOffset, 0)

		; Файл считывается от указанной позиции блоками по 4 КБ и высылается функцией TCPsend.
		TCPSend($iSocket, FileRead($hFile, $i4KiB))

		If @error Then ; Если ошибка, то выход
			$iError = @error
			MsgBox(4096 + 16, "", "Сервер:" & @CRLF & "Не удалось выслать данные, @error = " & $iError)

			TCPCloseSocket($iSocket) ; Закрывает сокет
			Return False
		EndIf

		; Делаем приращение смещения на величину высыланного блока 4 KiB, чтобы прочитать и выслать следующий блок данных 4 KiB.
		$iOffset += $i4KiB
	Until $iOffset >= $iFileSize ; Пока смещение не достигнет конца файла

	FileClose($hFile) ; Закрывает дескриптор файла.

	; Сообщает серверу, что файл полностью отправлен, с кодом.
	TCPSend($iSocket, @CRLF & "{EOF}")

	MsgBox(4096, "", "Сервер:" & @CRLF & "Файл выслан успешно.")

	TCPCloseSocket($iSocket) ; Закрывает сокет
EndFunc   ;==>Example

Func OnAutoItExit()
	TCPShutdown() ; Останавливает TCP службу.
EndFunc   ;==>OnAutoItExit

Код:
; Этот скрипт - клиент, запускайте его после сервера! (Запускайте сначала второй пример функции TCPSend).

Example()

Func Example()
	TCPStartup() ; Запуск TCP служб.

	; Регистрация функции OnAutoItExit для остановки служб при завершении скрипта.
	OnAutoItExitRegister("OnAutoItExit")

	; Установка IP-адреса и порта
	Local $sIPAddress = "127.0.0.1" ; Этот IP-адрес работает только для теста на вашем компьютере.
	Local $iPort = 65432 ; Порт, используемый для соединения.

	; Подключает прослушиваение сокета, указанного IP-адреса и порта.
	Local $iSocket = TCPConnect($sIPAddress, $iPort)
	Local $iError = 0

	If @error Then ; Если ошибка, то выход
		; Сервер, вероятно, в офлайне, или порт не открыт на сервере.
		$iError = @error
		MsgBox(4096 + 16, "", "Клиент:" & @CRLF & "Не удалось подключиться, @error = " & $iError)
		Return False
	EndIf

	; Получает путь к файлу, в который будут сохранёны переданные данные
	Local $sFilePath = FileSaveDialog("Сохранить как", @MyDocumentsDir, "Все (*.*)", 2 + 16)

	If @error Then ; Если ошибка, то выход
		$iError = @error
		MsgBox(4096 + 48, "", "Клиент:" & @CRLF & "Ошибка при выборе файла, @error = " & $iError)
		Return False
	EndIf

	Local $hFile = FileOpen($sFilePath, 16 + 2) ; Открывает в бинарном режиме для записи, возвращая дескриптор

	; Устанавливает размер читаемого блока 4 KiB, бинарный код для конца файла и длина этого кода.
	Local Const $i4KiB = 4096, $bEOF = Binary(@CRLF & "{EOF}"), $iEOFLen = BinaryLen($bEOF)

	; Переменная, которая будет содержать бинарные данные файла.
	Local $bData = Binary("")

	; Переменная, содержащая длину полученных данных
	Local $iDataLen = 0

	; Триггер достижения конца файла
	Local $fEOFReached = False

	Do
		$bData = TCPRecv($iSocket, $i4KiB, 1) ; Получает данные с подключенного сокета.

		If @error Then ; Если ошибка, то выход
			$iError = @error
			MsgBox(4096 + 16, "", "Клиент:" & @CRLF & "Соединение потеряно, @error = " & $iError)
			Return False
		EndIf

		$iDataLen = BinaryLen($bData)

		; Если ничего не будет получено, то повторяет попытку получения данных.
		If $iDataLen = 0 Then ContinueLoop

		; Если достигнут конец файла (в конце данных код EOF).
		If BinaryMid($bData, 1 + $iDataLen - $iEOFLen, $iEOFLen) = $bEOF Then
			; Отрезает код EOF от файловых данных.
			$bData = BinaryMid($bData, 1, $iDataLen - $iEOFLen)

			; Устанавливает триггер EOFReached в True.
			$fEOFReached = True
		EndIf

		FileWrite($hFile, $bData)
	Until $fEOFReached ; Завершает цикл, когда получены все данные

	FileClose($hFile) ; Закрывает дескриптор файла.

	MsgBox(4096, "", "Клиент:" & @CRLF & "Файл получен.")

	TCPCloseSocket($iSocket) ; Закрывает сокет
EndFunc   ;==>Example

Func OnAutoItExit()
	TCPShutdown() ; Останавливает TCP службу.
EndFunc   ;==>OnAutoItExit
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
alex33 [?]
Можно попробовать через TCP или UDP сокеты, пример был где-то в справке
Ага, только что бы так передавать файлы, должна быть постоянная связь между приемником и получателем.
И в этом случае одному из компьютеров нужно будет присваивать роль сервера, который слушает входящие подключения. А второму - роль клиента, который пытается подключится к серверу. И все бы хорошо, только к примеру добавьте еще несколько функций, на проверку доступности клиента/сервера, на авто запуск сервера, дописать пару строк на тот случай если клиент стартует первым, а сервера еще нету.

Ну сюда еще добавь настройку фаервола.

Вообще, я считаю, что это не очень вариант.
 
Автор
I

iwak

Новичок
Сообщения
28
Репутация
0
Все ещё актуально.

К сожалению, компьютеры не имеют общей локальной сети.

По сути, нужно реализовать возможность отправки капч с нескольких компьютеров на один, где эти капчи впоследствии будут разгаданы и отправлены обратно. А вот способов это реализовать, как я понимаю, может быть множество.
Может попробовать грузить эти капчи средствами autoit на собственный сайт, откуда их через инет будет разгадывать первый (главный) компьютер и отправлять результат обратно.

Есть у кого-нибудь идеи?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
iwak,
Вариантов много, например, Яндекс.Диск API или любой платный (бесплатный) хостинг с FTP, и т.д. и т.п...
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Или вообще можно Dropbox...


Добавлено:
Сообщение автоматически объединено:

А как хостинг - могу посоветовать или uCoz или Hostinger
 
Верх