Многопоток и получение капчи в get запросе

  • Автор темы Автор темы Art4D
  • Дата начала Дата начала

Art4D

Client
Регистрация
22.08.2014
Сообщения
276
Реакции
48
Баллы
28
Получаю капчу гет запросом и после отправляю в капмонстр через снипет:
Код:
Развернуть Свернуть Копировать
//Отправка капчи из картинки
var captcha__get = project.Variables["captcha__get"].Value;
var image = System.Drawing.Image.FromFile(@captcha__get);
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 result = ZennoPoster.CaptchaRecognition("capmonster2.dll", base64String, "");
// отрезаем лишнее
var tmp = result.Split(new [] {"-|-"}, StringSplitOptions.None);
if (tmp.Length > 1) return tmp[0];
return result;
Далее пытаюсь удалить файл капчи (каждая капча хранится в отдельной рандомной папке) и пишет, что нет доступа т.к. файл используется другим процессом, это как вообще понимать? в каждом потоке папка, в которой лежит капча, имеет рандомное название. Можно конечно не удалять капчу и тогда все работает, но это тупо т.к. накапливается по 5-10к файлов, которые долго приходится вычищать. Можно ли это как-то исправить?
 
А зачем каждую капчу в отдельную папку если не секрет?
название капчи одинаковое "sendpic.php" и если их не класть в разные папки, то сыпятся ошибки про доступ
 
Первый вариант - прописывать дату в имени капчи. С допиской рандомной части имени.
Еще можно записывать имена капчи в список вместе с датой загрузки. Ну а при запуске соответсвенно проверять этот список и удалять в цикле капчи, в которых дата достаточно старая.
 
В смысле долго вычищать руками? Можно обрабатывать код, который удалит все содержимое папки после выполнения

Код:
Развернуть Свернуть Копировать
string[] filePaths = Directory.GetFiles(@"C:\");
foreach (string filePath in filePaths)
  File.Delete(filePath);
не исполняйте его в чистом виде, опасно, не забудьте прописать путь
 
В смысле долго вычищать руками? Можно обрабатывать код, который удалит все содержимое папки после выполнения

Код:
Развернуть Свернуть Копировать
string[] filePaths = Directory.GetFiles(@"C:\");
foreach (string filePath in filePaths)
  File.Delete(filePath);
не исполняйте его в чистом виде, опасно, не забудьте прописать путь
а как подписать имя рандомное к капче? она же берется из гет запроса, а там имя никак не изменить
 
В месте, где ты сохраняешь капчу на комп, ты по идее и должен прописывать имя сохраненному файлу. Ну или можешь в таком случае прописывать дату не в файл а в название своих рандомных папок и удалять их соответсвенно
 
В месте, где ты сохраняешь капчу на комп, ты по идее и должен прописывать имя сохраненному файлу. Ну или можешь в таком случае прописывать дату не в файл а в название своих рандомных папок и удалять их соответсвенно
не не не, вот смотри как тут поставить название свое:
82QZO0of1woldA.png
 
так если этот экшн отрабатывает несколько раз - он сам имя файла меняет, зачем папки городить то?
я так понимаю он не может сохранять файлы в одно и то же место с одним и тем же именем для замены ибо возникает конфликт доступа.

Как я писал выше, можно папки, которые ты городишь, создавать с именем типа 2015-12-31_random
 
Последнее редактирование:
зачем создавать папки в таком случае? первый поток скачивает капчу с именем captcha.jpg, кладёт путь в переменную, второй поток в эту же папку сохранит файл уже с именем captcha(1).jpg и так же успешно распознает свою личную капчу и так далее
 
зачем создавать папки в таком случае? первый поток скачивает капчу с именем captcha.jpg, кладёт путь в переменную, второй поток в эту же папку сохранит файл уже с именем captcha(1).jpg и так же успешно распознает свою личную капчу и так далее
а как определить какой поток какую капчу сохранил?
 
а как определить какой поток какую капчу сохранил?
зачем определять? в переменную кладётся путь к сохранённому файлу, сниппет работает дальше именно с ним.
 
зачем создавать папки в таком случае? первый поток скачивает капчу с именем captcha.jpg, кладёт путь в переменную, второй поток в эту же папку сохранит файл уже с именем captcha(1).jpg и так же успешно распознает свою личную капчу и так далее
Если бы было так как ты говоришь, я бы не писал сюда и папок не создавал бы, ошибку доступа он высвечивает если капчи так сохранять, сейчас вот прям еще раз проверю, скину, что получилось
 
Вот что получилось:
Vm669Lqux4aYRm.png

Причем, что интересно каптч столько сколько выполнений шаблона, т.е. они вроде как скачиваются, но что то мешает. Если раскидать капчи по папка отдельным и не удалять, то все норм.
UPD. До меня дошло вроде, ошибки эти из-за повторного взятия капчи(т.е. поток думает что файла нет и вторую капчу записывает именем secpic.php(2), но такое название уже есть у другого потока). Но все равно не ясно, какого хрена папки не удаляются рандомные после выполнения сниппета.
 
Пишите пути к использованным каптчам в отдельный список, например) Потом по шедулеру раз в N часов можно прогонять удаление.
 
  • Оценить
Реакции: Art4D

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