Что нового

cURL UDF - Выполнения сетевых запросов через библиотеку libcurl + wrapper

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
AutoIt: 3.3.12.0
Версия: 2.0

Категория: Интернет, Кодирование, Шифрование, Сеть

Описание: Набор функций для выполнения сетевых запросов с помощью libcurl.dll
Документация по cURL
Состав:
  • libcurl.dll - libcurl.dll v.7.42.1
  • cURL.dll - wrapper для AutoIT
  • msvcr120.dll - зависимость из C++ Redistributable (Если в системе установлен Microsoft Visual C++ Redistributable, то не нужна)
  • msvcr120d.dll - зависимость из C++ Redistributable (Если в системе установлен Microsoft Visual C++ Redistributable, то не нужна)
  • cURL.au3 - UDF
  • cURLConstants.au3 - Константы
  • Example_WriteFuncMode.au3 - Пример работы с Callback функцией приема ответа

Код/Пример: Example.au3
Код:
#include "cURL.au3"
#include "cURLConstants.au3"

$sHeaders = ''
$sBody = ''

_cURL_Startup()

$hCURL = _cURL_Easy_Init()

_cURL_Easy_SetOpt($hCURL, $cURL_OPT_URL, "http://google.com/")
_cURL_Easy_SetOpt($hCURL, $cURL_OPT_FOLLOWLOCATION, 1)

Dim $aHeaders[2] = ['Header1: Value1', 'Header2: Value2']
_cURL_Easy_SetOpt($hCURL, $cURL_OPT_HTTPHEADER, $aHeaders)

$sResponse = _cURL_Easy_Exec($hCURL)
_cURL_Easy_Cleanup($hCURL)

ConsoleWrite('Response: ' & @CRLF & $sResponse)

_cURL_Shutdown()
Код/Пример: Example_WriteFuncMode.au3
Код:
#include "cURL.au3"
#include "cURLConstants.au3"

$sHeaders = ''
$sBody = ''

_cURL_Startup()

$hCURL = _cURL_Easy_Init()

_cURL_Easy_SetOpt($hCURL, $cURL_OPT_URL, "http://google.com/")
_cURL_Easy_SetOpt($hCURL, $cURL_OPT_FOLLOWLOCATION, 1)

Dim $aHeaders[2] = ['Header1: Value1', 'Header2: Value2']
_cURL_Easy_SetOpt($hCURL, $cURL_OPT_HTTPHEADER, $aHeaders)

_cURL_Easy_SetWriteFuncMode($hCURL)
$callb = DllCallbackRegister('cURL_CallBack', 'int', $cURL_tagCALLBACKARGS)

$structHeaders = DllStructCreate($cURL_tagCALLBACKDATA)
DllStructSetData($structHeaders, 'func', DllCallbackGetPtr($callb))
DllStructSetData($structHeaders, 'data', 1)
_cURL_Easy_SetOpt($hCURL, $cURL_OPT_HEADERDATA, DllStructGetPtr($structHeaders))

$structBody = DllStructCreate($cURL_tagCALLBACKDATA)
DllStructSetData($structBody, 'func', DllCallbackGetPtr($callb))
DllStructSetData($structBody, 'data', 2)
_cURL_Easy_SetOpt($hCURL, $cURL_OPT_WRITEDATA, DllStructGetPtr($structBody))

_cURL_Easy_Perform($hCURL)
_cURL_Easy_Cleanup($hCURL)

_cURL_Shutdown()

ConsoleWrite('Headers:' & @CRLF & $sHeaders & @CRLF & '-------------------------' & @CRLF & @CRLF)
ConsoleWrite('Body:' & @CRLF & $sBody & @CRLF)

Func cURL_CallBack($pAddr, $iSize, $iCount, $pExtra)
    $struct = DllStructCreate('char val[' & ($iSize * $iCount) & ']', $pAddr)
    If $pExtra = 1 Then $sHeaders &= DllStructGetData($struct, 'val')
    If $pExtra = 2 Then $sBody &= DllStructGetData($struct, 'val')
    $struct = 0
    Return $iSize * $iCount
EndFunc   ;==>cURL_CallBack

Файл Include Runtime: cURL_UDF.zip
Файл External Runtime: cURL_UDF.zip

История версий:
1.0
  • _cURL_Startup
  • _cURL_Init
  • _cURL_SetOpt
  • _cURL_SetWriteFuncMode
  • _cURL_Perform
  • _cURL_Cleanup
  • _cURL_Shutdown
1.2
  • _cURL_Init => _cURL_Easy_Init
  • _cURL_SetOpt => _cURL_Easy_SetOpt
  • _cURL_SetWriteFuncMode => _cURL_Easy_SetWriteFuncMode
  • _cURL_Perform => _cURL_Easy_Perform
  • _cURL_Cleanup => _cURL_Easy_Cleanup
  • _cURL_Version
  • _cURL_Easy_Escape
  • _cURL_Easy_DupHandle
  • _cURL_Easy_Pause
  • _cURL_Easy_Recv
  • _cURL_Easy_Reset
  • _cURL_Easy_Send
  • _cURL_Easy_UnEscape
  • _cURL_Free
  • _cURL_GetDate
  • _cURL_VersionInfo
1.3
  • Добавил поддержку массивов для функции _cURL_Easy_SetOpt (Пока только для $cURL_OPT_HTTPHEADER)
  • Сделал копирование параметров при установке (часто libcurl "забывал" переданные параметры)
  • Исправил падения при некоторых вызовах с использованием ssl
2.0
  • _cURL_Easy_Exec
  • _cURL_Multi_AddHandle
  • _cURL_Multi_Cleanup
  • _cURL_Multi_InfoRead
  • _cURL_Multi_Init
  • _cURL_Multi_Perform
  • _cURL_Multi_RemoveHandle
  • _cURL_Multi_SetOpt
  • _cURL_Multi_SetTimerFuncMode

P.S. Архивы отличаются количеством и весом dll.

Источник: autoit-script.ru
Автор(ы): BIOS
 
Последнее редактирование модератором:

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
BIOS,
При запуске Example_WriteFuncMode.au3 у меня пишет в консоль пустые строки. Пробовал менять адрес - то же самое. :scratch:
 
Автор
B

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Автор
B

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
madmasles [?]
пишет в консоль пустые строки
Обновил архив с UDF, добавил две dll зависимостей из C++ Redistributable


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

Обновил библиотеку

1.3
  • Добавил поддержку массивов для функции _cURL_Easy_SetOpt (Пока только для $cURL_OPT_HTTPHEADER)
  • Сделал копирование параметров при установке (часто libcurl "забывал" переданные параметры)
  • Исправил падения при некоторых вызовах с использованием ssl
 
Автор
B

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Обновление библиотеки
Добавлен "Multi" функционал
Добавил функцию _cURL_Easy_Exec - Аналог PHP функции curl_exec
Добавил пример с _cURL_Easy_Exec

Работу над библиотекой можно считать законченной, т.к. реализованы "все" функции

2.0
  • _cURL_Easy_Exec
  • _cURL_Multi_AddHandle
  • _cURL_Multi_Cleanup
  • _cURL_Multi_InfoRead
  • _cURL_Multi_Init
  • _cURL_Multi_Perform
  • _cURL_Multi_RemoveHandle
  • _cURL_Multi_SetOpt
  • _cURL_Multi_SetTimerFuncMode
 

Naisho

Знающий
Сообщения
86
Репутация
12
попробовал запустить пример к UDF, но получил : "Приложению не удалось запуститься, поскольку Normaliz.dll не был найден. Повторная установка приложения может исправить эту проблему. "
все файлы в одной папке...
кстати (в связи с ошибкой не могу проверить) - как UDF отнесётся к новым версиям библиотеки (7.49.1) и 64х-битности?
 
Автор
B

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Naisho
Попробуй установить C++ Redistributable

С новыми версиями, увы, не будет дружить

Как найду свободное время - пересоберу с новой версией и поддержкой SSL и SSH
 

Naisho

Знающий
Сообщения
86
Репутация
12
Установить C++ Redistributable - имеется в виду полный комплект VC Redistributable? Какого года? У меня стоит до 2013.
Или достаточно msvcr120.dll и msvcr120d.dll в папке скрипта?
Normaliz.dll у меня действительно нет... (у меня ХР)
 
Автор
B

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Naisho
Нашел что ему нужно, эта библиотека для преобразования национальных доменных имен (IDN), идет в поставке с системой версии Vista и выше
Для XP надо установить пакет https://www.microsoft.com/en-us/download/details.aspx?id=734
 

Naisho

Знающий
Сообщения
86
Репутация
12
установил, теперь выдаёт: "Точка входа в процедуру InitializeCriticalSectionEx не найдена в библиотеке DLL KERNEL32.dll."
я думаю скорее всего сборка сделана без учёта совместимости с ХР...
 

iltmpz

Новичок
Сообщения
23
Репутация
0
Да, на девелоперской Win7 все работает, а на релизной XP - падает с невнятной ошибкой: скрипт завершился по нажатию ctrl-c, в момент вызова _cURL_Startup()

UP: скачал curl с официального сайта последнюю версию, собрал под vstudio 2015, установив набор инструментов v140_xp, все собралось, но получился curl.exe и libcurl.dll. Как собирать curl.dll я не нашел, но вроде и не нужно:
подключил вместо него libcurl.dll, а там все функции называются по-другому, например не easy_setopt_void, easy_setopt_str, easy_setopt_long, а curl_easy_setopt, но работает как все эти 3.
Example из UDF в итоге у меня заработал, но кроме той строки, где _cURL_Easy_SetOpt передается массив. Эта строка его крашит. Для меня пока не проблема.
А вот под XP этот свежесобранный libcurl точно так же выдает завершение по ctrl-c.
Зато сейчас пока нашел свой древний cubcurl.dll, который собирал под совсем другой проект, с ним под XP все работает. В чем там был нюанс при сборке - уже не помню, но по-моему, в чем-то был...

UP2: с моей подключенной libcurl.dll вместо curl.dll _cURL_Easy_Perform работает, но данные выводит в stdout, а вот _cURL_Easy_Exec - крашится.
Послез в _cURL_Easy_Exec - там какая-то очень мудреная чехарда из callback-функции, структур, которые туда цепляются, и все это завязано совершенно не очевидными для меня способами через dll-функции. Крашится в момент вызова curl_easy_perform. Ковырялся, ковырялся и решил пока признать, что решение под XP нерабочее.
Чего мне не хватает, это перенаправление вывода curl_easy_perform куда-нибудь в другое место, иногда надо в переменную иногда в файл.
Придется вернуться к схеме "$_iPidCurl=Run("curl.exe с параметрами"), StdoutRead($_iPidCurl)".
 
Верх