Привести метод HttpGet в соответствие возможностям действия «Get-запрос»

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
В Project Maker в свойствах действия «Get запрос» для прокси я могу выбирать и протокол, и детали авторизации, и кучу всего другого.
А в HttpGet этого всего нет, так что я не могу этот функционал перенести в сниппет.
Кроме того, когда я пытаюсь скачивать этим методом капчу вот таким способом:

Код:
                //                    captchaFileFullname = ZennoPoster.HttpGet(captchaRequestURL, project.Variables["proxy"].Value,
                        //"utf-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 60000, "", "", true, 5, null, downloadPath);
то скачанные файлы лочатся, и я не могу их ниже в сниппете переименовать или передвинуть куда-нибудь. В многопоточной работе в итоге я не могу в итоге в папке для скачивания даже прибраться за собой... так что предлагаю ещё перегрузить метод, чтобы он возвращал не путь к файлу, а массив byte[], который я мог бы сразу из памяти в анти-капчу отправить.

И я не могу задать сразу название файла, а только папку, куда его скачать! Хочу такой необязательный аргумент к этому методу!

В итоге приходится морочиться с WebClient и WebProxy и какими-то сторонними библиотеками пользоваться. Печалька.
 

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
291
Баллы
63
В Project Maker в свойствах действия «Get запрос» для прокси я могу выбирать и протокол, и детали авторизации, и кучу всего другого.
А в HttpGet этого всего нет, так что я не могу этот функционал перенести в сниппет.
Это все можно задать и в коде. Предварительно взять прокси и сформировать, а потом уже использовать в гет-запросе.
Задаем прокси - тык. Видим, что входной параметр такой: [protocol://][(login):(password)@](ip):(port)
Формируем сами протокол, например, задаем во входных настройках. И берем прокси из файла в таком формате - login:[email protected]:80
C#:
string proxy = project.Variables["proxyType"].Value; // Тут можно связать список с файлом и взять строку из списка
string proxyType = project.Variables["proxyType"].Value; // HTTP, SOCKS4, SOCKS5
proxy = proxyType  + "://" + proxy ; // Получилось, например, вот так - HTTP://login:[email protected]:80

// Ставим для инстанса
instance.SetProxy(proxy);
// Используем в запросе
string response = ZennoPoster.HttpGet(URL, proxy, "utf-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 30000);
Кроме того, когда я пытаюсь скачивать этим методом капчу вот таким способом:

Код:
                //                    captchaFileFullname = ZennoPoster.HttpGet(captchaRequestURL, project.Variables["proxy"].Value,
                        //"utf-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 60000, "", "", true, 5, null);
то скачанные файлы лочатся, и я не могу их ниже в сниппете переименовать или передвинуть куда-нибудь. В многопоточной работе в итоге я не могу в итоге в папке для скачивания даже прибраться за собой... так что предлагаю ещё перегрузить метод, чтобы он возвращал не путь к файлу, а массив byte[], который я мог бы сразу из памяти в анти-капчу отправить.
Можно не качать картинки, а сразу конвертить в нужный формат
C#:
string captcha_img = ZennoPoster.HttpGet(URL, proxy, "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 30000);
var image = System.Drawing.Image.FromFile(@captcha_img);
string base64String = String.Empty;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        byte[] imageBytes = ms.ToArray();
        base64String = Convert.ToBase64String(imageBytes);
}
var answer = ZennoPoster.CaptchaRecognition(captchaModule, base64String, "");
 
Последнее редактирование:
  • Спасибо
Реакции: Crate и Atomic

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
Большое спасибо за ответ! Про первое я не знал, полезно знать.

Про вторую часть - всё-таки, HttpGet тебе отдаёт путь к файлу, в котором ты можешь только папку задать, но не название файла. В итоге тебе все пять потоков сохраняют капчу в файл captcha.png, из них только один поток - успешно. Не зря же у тебя потом идёт вызов FromFile - самое неудобное, что вот это название файла нельзя заранее задать и потом его изменить.
 

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
291
Баллы
63
Про вторую часть - всё-таки, HttpGet тебе отдаёт путь к файлу, в котором ты можешь только папку задать, но не название файла. В итоге тебе все пять потоков сохраняют капчу в файл captcha.png, из них только один поток - успешно. Не зря же у тебя потом идёт вызов FromFile - самое неудобное, что вот это название файла нельзя заранее задать и потом его изменить.
HttpGet не отдаёт путь к файлу, он получает само содержимое картинки, т.е. мы просим дать нам ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File
Содержимое картинки в данном случае помещается в переменную captcha_img. И уже вместо пути к файлу мы работаем с этим содержимым, перегоняем его в base64 и отправляем на распознавание. Каждый поток работает со своими данными и не мешает другим.
Обрати внимание, что я не указываю downloadPath в самом запросе.
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
Я думаю, ты ошибаешься. Я смотрел в отладке, что возвращает HttpGet, правда, указывая downloadPath - он возвращает именно что путь к файлу. И именно путь ты отдаёшь потом методу System.Drawing.Image.FromFile, потому что ничего кроме пути он не принимает. Если бы возвращалось само содержимое, то оно было бы в byte[], либо в string, но уже закодированное в base64, чего тоже не наблюдается.

Ты сам пробовал тот сниппет, что ты привёл, запускать многопоточно? У меня это не сработало.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)