- Регистрация
- 28.12.2018
- Сообщения
- 732
- Благодарностей
- 343
- Баллы
- 63
Данная статья технического характера. Много теории и частичное описание практик работы, которые когда-то были использованы при создании шаблонов.
ZennoPoster отличный инструмент для решения широкого круга задач. Универсальный и достаточно популярный язык программирования C# позволяет создать шаблон любой сложности.
Хотя сложность ничем не ограничена, время необходимое на реализацию, сложность отладки и недостаток знаний для разработки с нуля часто заставляет нас использовать готовые программы, скрипты и библиотеки чужой разработки.
Так появляются гибридные решения, когда кроме шаблона, вместе с ZennoPoster работают другие программы и скрипты.
Связь двух или более программ возможна различными способами, которые возможно сгруппировать по используемым физическим устройствам:
Всё это заставляет нас дальше искать готовое, получая программу над программой управляемые другой программой.
Типовой обмен информацией происходит через:
Необходимо учитывать особенности, связанные с кодировками текста и размерами передаваемых данных.
Не получится прочитать вывод (ошибка или будет не читаем) с русскими буквами из консольной программы в MS DOS (cp866), если попытаться запустить из-под Windows (cp1251) без перекодировки. Так же сюрприз может ожидать при запуске скрипта на Python 3 (utf8, bytes)
Ограничение длины строки в cmd 8191 символ, означает, что мы не можем передать огромный текст в виде параметра для обработки и получить обратно соответственно. Точнее Windows передаст больше, но вернет только часть.
Все особенности невозможно учесть, но понимая общие принципы хотя бы понимаешь, где возможна ошибка и какие пути для обхода.
Например, ограничение на длину строки возможно обойти читая данные из файла или развернув локальный веб-сервер, в случае скрипта. Для кодировки часто бывает достаточно добавить дополнительный параметр, указывающий на кодировку.
Часть инструментов уже готова и встроена в ZennoPoster, например кубик «Запуск программы».
При использовании действия запуска, нужно учитывать тип программы. Аргументы передаются простой строкой, всё остальное на усмотрение программы, разделителем может быть как пробел, так и тире или другой тип разделителя.
Консольные
Так консольные, возвращают результат, в виде стандартного текстового потока вывода STD OUT, из которого можем получить результат выполнения запущенной программы. Поток ошибок STD ERR при успешном выполнении чаще всего пустой, но не обязательно, там могут быть предупреждения, ориентироваться на его длину для определения ошибки можно только, если точно знаешь, что там должно быть пусто.
Для примера, попробуем архивировать файлы, через консольную утилиту RAR.
Прочитав документацию, видим примерно такой способ использования консольного rar архиватора, чтобы архивировать все текстовые файлы в папке.
Попробовав запустить шаблон, получаем интересный результат. Архив создан, только где его найти, не понятно.
Файл архива создался рядом с исполняемым файлом Rar.exe, а не в папке шаблона.
Существует несколько способов указания пути для сохранения:
Когда программу делали мы сами, например, при использовании скрипта на python, php – то вначале возможно зашифровать данные в base64, для расшифровки использовать обратные функции дешифрования. Таким образом возможно передать строку, обычно html код.
Запуск консольных скриптов на Python, PHP, JavaScript
Единственной особенностью, для запуска скриптов является необходимость запуска интерпретатора.
Т.е. вначале запускаем программу интерпретатор, после скрипт, которому задаем параметры запуска. Единственным отличием будет то, что имя скрипта мы задаем в строке параметры запуска.
Все выше сказанное по поводу директории выполнения программы верно и для скрипта, но за счет гибкости уже внутри скрипта мы можем задать необходимые пути.
Для запуска JavaScript использовать node или v8, для python соответствующую версию интерпретатора.
Большинство скриптов возможно объединить в виде исполняемого EXE файла. При этом теряем в скорости выполнения, т.к. это просто архив, который сам выполняется, но можем спокойно передавать клиенту, не нужно думать, что у него установлено.
В случае скриптов у нас есть возможности просто читать их из файла и исполнять внутри программы, например JavaScript. Так не получится сделать со сложными скриптами, завязанными на особенности системы и другие скрипты, но простые скрипты, например скачать с сайта скрипт, отвечающий за контрольную строку, выполнить в зенопостере и получить результат бывает возможно.
Оконные программы
Оконные программы очень редко проектируются для возможного запуска из консоли, поэтому не возвращают данных в стандартный ввод-вывод, обычно только код запуска.
Поэтому в настройках шаблона нужно выставлять флаг – не ждать завершения работы, иначе шаблон выдаст ошибку, действие будет выполнено почти моментально, но таймаут никак не повлияет на правильность, т.к. нет стандартного вывода.
С оконным интерфейсом существует сложность с обратным получением данных. Без особого труда можно получить заголовки, но для исследования содержимого нужно использовать WinAPI, распознавание с экрана или обмен через файлы и базы данных.
Файловый обмен с другими программами из ZennoPoster
При обмене информацией через файлы, одна программа должна успеть записать данные полностью, другая узнать, что данные появились. Особенно актуальным становится данное действие при многопоточном выполнении.
Чтобы узнать о появлении данных, самый простой вариант, это проверить существует ли данный файл или папка. Но данные могут записываться достаточно долго, когда файл уже создан. Контрольную сумму просчитать чаще всего невозможно, поэтому решение данной проблемы – это дополнительный файлы маркеры.
Данный способ очень часто используется в браузерах, пока файл полностью не скачан, рядом с ним лежит другой файл. По нему мы можем узнать, завершена ли загрузка.
Таким же образом, через C# создаем вначале файл маркер, например с расширением *.zpblocked,
и проверяем наличие именного его в папке. Пока файл не будет удален, то не читаем данные.
Аналогично можем ориентироваться на временные файлы других программ.
Часто бывает, что упираемся в скорость жесткого диска, когда процессор еще свободен.
По умолчанию ZennoPoster пишет данные в текстовом виде. Это удобно и в большинстве случаев вполне приемлемо по скорости. Но когда скорости начинает не хватать, нужно переходить с текстовой на бинарную запись данных или использовать архиваторы, которая гораздо быстрее, т.к. требует меньшее количество преобразований и компактнее. Запись и чтение в специальных форматах не самое простое занятие, особенно при интеграции, так мы переходим к базам данных.
О базах данных
Не вдаваясь в тонкости строения баз, можно разделить их по способу хранения информации на жестком диске и в оперативной памяти.
Базы на жестком диске, так же будут упираться в его производительность, которой может не хватать, поэтому не всегда переход с файлов на базы решает проблемы.
Некоторые из баз данных в памяти – для надежности скидывают данные на жесткий диск. В результате, когда данных слишком много, начинаются тормоза, хотя их и не ждали.
На чтение, почти все базы данных работают без задержек. Для записи используются различные блокировки, которые бывают:
Блокировка на уровне таблицы, например в MySQL для некоторых типов движков, позволяет записывать достаточно быстро данные, но чем больше таблица, тем медленнее скорость записи.
Переход на другой движок таблицы внутри MySQL решает проблему, путем блокировки конкретной строки. Данные пишутся быстрее, но и ресурсов расходуется больше.
Для записи в многопоточном режиме даже с учетом блокировок самой базой возникают проблемы, когда нужно контролировать, чтобы одна запись не была изменена несколько раз.
Самый простой способ контроля – временная метка, или метка в другой таблице базы, когда вначале резервируем место, после записываем.
Особенности буфера обмена
Буфер обмена Windows позволяет хранить форматированные данные и текстовые. При запросе информации из буфера, это определяется в параметрах вызова.
В ZennoPoster нет кубика для работы с буфером, но есть C#, на котором прочитать и записать данные в буфер обмена достаточно легко.
Данные могут попадать в буфер не только с помощью программы, но и человек за компьютером может что-то скопировать, так что данный способ очень ненадежный.
Для работы в несколько потоков, буфер обмена почти не пригоден. Скорость обмена хотя и высокая, но из-за двух действий копировать-вставить и вызова с небольшими задержками не самый быстрый вариант. Какой поток вызвал действие, и кто скопировал данные, возможно понять только с метками, но, чтобы считать метку, нужно постоянно заниматься запросами данных.
Сетевой обмен данными
Когда приложение работает на одном компьютере или внутри одной сети, то для обмена данными между программами, возможно использовать сокеты, как самый быстрый и хорошо документированный способ. В C# уже есть класс HttpListener для прослушивания сообщений, как и готовые клиенты. Относительная сложность появляется уже в процессе работы, когда приходится обрабатывать исключения и ошибки, т.к. тестовые данные почти всегда отличаются от тех, что реально приходят. Многопоточный обработчик обрабатывающий множество запросов сделать еще сложнее, нужно многое знать и вдаваться в тонкости.
Поэтому чаще всего берут уже готовый веб-сервер или базу данных и на них перекладывают обработку запросов.
Ограничения cmd тут уже не действуют, поэтому мы можем запустить наши скрипты как сайты и обрабатывать любой по размеру объём информации. Внутри будут тоже ограничения на размер фрагмента данных, но за счет пакетной передачи данных, разницу уже не увидим.
В ZennoPoster уже есть всё необходимое для работы с веб (http запросы, браузер, подключение к базам), с множеством примеров в официальной документации и на форуме.
Взаимодействие с NoSQL базами данных рассмотрено менее подробно.
У большинства из них есть интерфейс взаимодействия через HTTP запросы. Есть официальные драйвера для C# которые по факту только создают запросы через обертку. Поэтому, когда нужна производительность, посмотрите быстро исходники драйверов, если там запросы, лишнее тащить в шаблон не нужно.
Особенности сети в Windows
В Windows в системной директории C:\Windows\System32\drivers\etc находится файл hosts который позволяет вручную сопоставлять IP адрес и доменное имя в сети.
Чаще всего этот файл используют при разработке сайтов, перенаправления трафика на нужные сервера. Но его можно использовать и для того, чтобы снизить затраты трафика у себя. Например, заблокировать рекламу или не очень важные сервера со скриптами, оставив только нужные.
В примерах часто пишут только 127.0.0.1 указывая на локальный компьютер, но на самом деле это диапазон 127.0.0.1 — 127.255.255.255, множество потоков можем запустить без пересечения, только указывая разные IP (проверять хост всё равно нужно).
Когда мы отправляем запросы на другие сервера уже вне локальной сети, нам не нужны принтеры, видимость других компьютеров. Поэтому в настройках подключения, если убрать всё лишнее, оставив только IPv4, IPv6 (тоже можно убрать, если не используем) получим очень небольшой прирост производительности за счёт снижения нагрузки на оборудование.
В реестре осталось достаточно много параметров для настройки, например количество ошибок и таймауты, которые можно изменить.
Тема обмена и ускорения работы достаточно широкая, сложно описать всё что знаешь, поэтому жду вопросов в комментариях, на которые постараюсь ответить.
ZennoPoster отличный инструмент для решения широкого круга задач. Универсальный и достаточно популярный язык программирования C# позволяет создать шаблон любой сложности.
Хотя сложность ничем не ограничена, время необходимое на реализацию, сложность отладки и недостаток знаний для разработки с нуля часто заставляет нас использовать готовые программы, скрипты и библиотеки чужой разработки.
Так появляются гибридные решения, когда кроме шаблона, вместе с ZennoPoster работают другие программы и скрипты.
Связь двух или более программ возможна различными способами, которые возможно сгруппировать по используемым физическим устройствам:
- Жесткий диск
- Оперативная память
- Сетевая карта
Всё это заставляет нас дальше искать готовое, получая программу над программой управляемые другой программой.
Типовой обмен информацией происходит через:
- Файлы
- Базы данных
- Сеть
- Буфер обмена
- Жесткий диск в оперативной памяти
- Прямое чтение из участка памяти или жесткого диска
- Распознавание изображений с экрана
Необходимо учитывать особенности, связанные с кодировками текста и размерами передаваемых данных.
Не получится прочитать вывод (ошибка или будет не читаем) с русскими буквами из консольной программы в MS DOS (cp866), если попытаться запустить из-под Windows (cp1251) без перекодировки. Так же сюрприз может ожидать при запуске скрипта на Python 3 (utf8, bytes)
Ограничение длины строки в cmd 8191 символ, означает, что мы не можем передать огромный текст в виде параметра для обработки и получить обратно соответственно. Точнее Windows передаст больше, но вернет только часть.
Все особенности невозможно учесть, но понимая общие принципы хотя бы понимаешь, где возможна ошибка и какие пути для обхода.
Например, ограничение на длину строки возможно обойти читая данные из файла или развернув локальный веб-сервер, в случае скрипта. Для кодировки часто бывает достаточно добавить дополнительный параметр, указывающий на кодировку.
Часть инструментов уже готова и встроена в ZennoPoster, например кубик «Запуск программы».
При использовании действия запуска, нужно учитывать тип программы. Аргументы передаются простой строкой, всё остальное на усмотрение программы, разделителем может быть как пробел, так и тире или другой тип разделителя.
Консольные
Так консольные, возвращают результат, в виде стандартного текстового потока вывода STD OUT, из которого можем получить результат выполнения запущенной программы. Поток ошибок STD ERR при успешном выполнении чаще всего пустой, но не обязательно, там могут быть предупреждения, ориентироваться на его длину для определения ошибки можно только, если точно знаешь, что там должно быть пусто.
Для примера, попробуем архивировать файлы, через консольную утилиту RAR.
Прочитав документацию, видим примерно такой способ использования консольного rar архиватора, чтобы архивировать все текстовые файлы в папке.
C#:
rar a backup.rar c:\work\doc\*.txt
Файл архива создался рядом с исполняемым файлом Rar.exe, а не в папке шаблона.
Существует несколько способов указания пути для сохранения:
- Самый простой, это указание полного пути для сохранения данных, если программа позволяет это сделать.
- Если позволяет структура шаблона и способ работы запускаемой программы, то файл достаточно положить рядом с шаблоном, тогда и файлы будут рядом.
- Использовать более гибкий вариант через C# или BAT файл, когда вначале меняется директория выполнения, после запускается программа.
- Добавить программу в системные пути, тогда сможем запускать только указав имя программы и параметры.
Когда программу делали мы сами, например, при использовании скрипта на python, php – то вначале возможно зашифровать данные в base64, для расшифровки использовать обратные функции дешифрования. Таким образом возможно передать строку, обычно html код.
Запуск консольных скриптов на Python, PHP, JavaScript
Единственной особенностью, для запуска скриптов является необходимость запуска интерпретатора.
Т.е. вначале запускаем программу интерпретатор, после скрипт, которому задаем параметры запуска. Единственным отличием будет то, что имя скрипта мы задаем в строке параметры запуска.
Все выше сказанное по поводу директории выполнения программы верно и для скрипта, но за счет гибкости уже внутри скрипта мы можем задать необходимые пути.
Для запуска JavaScript использовать node или v8, для python соответствующую версию интерпретатора.
Большинство скриптов возможно объединить в виде исполняемого EXE файла. При этом теряем в скорости выполнения, т.к. это просто архив, который сам выполняется, но можем спокойно передавать клиенту, не нужно думать, что у него установлено.
В случае скриптов у нас есть возможности просто читать их из файла и исполнять внутри программы, например JavaScript. Так не получится сделать со сложными скриптами, завязанными на особенности системы и другие скрипты, но простые скрипты, например скачать с сайта скрипт, отвечающий за контрольную строку, выполнить в зенопостере и получить результат бывает возможно.
Оконные программы
Оконные программы очень редко проектируются для возможного запуска из консоли, поэтому не возвращают данных в стандартный ввод-вывод, обычно только код запуска.
Поэтому в настройках шаблона нужно выставлять флаг – не ждать завершения работы, иначе шаблон выдаст ошибку, действие будет выполнено почти моментально, но таймаут никак не повлияет на правильность, т.к. нет стандартного вывода.
С оконным интерфейсом существует сложность с обратным получением данных. Без особого труда можно получить заголовки, но для исследования содержимого нужно использовать WinAPI, распознавание с экрана или обмен через файлы и базы данных.
Файловый обмен с другими программами из ZennoPoster
При обмене информацией через файлы, одна программа должна успеть записать данные полностью, другая узнать, что данные появились. Особенно актуальным становится данное действие при многопоточном выполнении.
Чтобы узнать о появлении данных, самый простой вариант, это проверить существует ли данный файл или папка. Но данные могут записываться достаточно долго, когда файл уже создан. Контрольную сумму просчитать чаще всего невозможно, поэтому решение данной проблемы – это дополнительный файлы маркеры.
Данный способ очень часто используется в браузерах, пока файл полностью не скачан, рядом с ним лежит другой файл. По нему мы можем узнать, завершена ли загрузка.
Таким же образом, через C# создаем вначале файл маркер, например с расширением *.zpblocked,
и проверяем наличие именного его в папке. Пока файл не будет удален, то не читаем данные.
Аналогично можем ориентироваться на временные файлы других программ.
Часто бывает, что упираемся в скорость жесткого диска, когда процессор еще свободен.
По умолчанию ZennoPoster пишет данные в текстовом виде. Это удобно и в большинстве случаев вполне приемлемо по скорости. Но когда скорости начинает не хватать, нужно переходить с текстовой на бинарную запись данных или использовать архиваторы, которая гораздо быстрее, т.к. требует меньшее количество преобразований и компактнее. Запись и чтение в специальных форматах не самое простое занятие, особенно при интеграции, так мы переходим к базам данных.
О базах данных
Не вдаваясь в тонкости строения баз, можно разделить их по способу хранения информации на жестком диске и в оперативной памяти.
Базы на жестком диске, так же будут упираться в его производительность, которой может не хватать, поэтому не всегда переход с файлов на базы решает проблемы.
Некоторые из баз данных в памяти – для надежности скидывают данные на жесткий диск. В результате, когда данных слишком много, начинаются тормоза, хотя их и не ждали.
На чтение, почти все базы данных работают без задержек. Для записи используются различные блокировки, которые бывают:
- На уровне всей базы
- На уровне таблицы
- На уровне строки или колонки
Блокировка на уровне таблицы, например в MySQL для некоторых типов движков, позволяет записывать достаточно быстро данные, но чем больше таблица, тем медленнее скорость записи.
Переход на другой движок таблицы внутри MySQL решает проблему, путем блокировки конкретной строки. Данные пишутся быстрее, но и ресурсов расходуется больше.
Для записи в многопоточном режиме даже с учетом блокировок самой базой возникают проблемы, когда нужно контролировать, чтобы одна запись не была изменена несколько раз.
Самый простой способ контроля – временная метка, или метка в другой таблице базы, когда вначале резервируем место, после записываем.
Особенности буфера обмена
Буфер обмена Windows позволяет хранить форматированные данные и текстовые. При запросе информации из буфера, это определяется в параметрах вызова.
В ZennoPoster нет кубика для работы с буфером, но есть C#, на котором прочитать и записать данные в буфер обмена достаточно легко.
Данные могут попадать в буфер не только с помощью программы, но и человек за компьютером может что-то скопировать, так что данный способ очень ненадежный.
Для работы в несколько потоков, буфер обмена почти не пригоден. Скорость обмена хотя и высокая, но из-за двух действий копировать-вставить и вызова с небольшими задержками не самый быстрый вариант. Какой поток вызвал действие, и кто скопировал данные, возможно понять только с метками, но, чтобы считать метку, нужно постоянно заниматься запросами данных.
Сетевой обмен данными
Когда приложение работает на одном компьютере или внутри одной сети, то для обмена данными между программами, возможно использовать сокеты, как самый быстрый и хорошо документированный способ. В C# уже есть класс HttpListener для прослушивания сообщений, как и готовые клиенты. Относительная сложность появляется уже в процессе работы, когда приходится обрабатывать исключения и ошибки, т.к. тестовые данные почти всегда отличаются от тех, что реально приходят. Многопоточный обработчик обрабатывающий множество запросов сделать еще сложнее, нужно многое знать и вдаваться в тонкости.
Поэтому чаще всего берут уже готовый веб-сервер или базу данных и на них перекладывают обработку запросов.
Ограничения cmd тут уже не действуют, поэтому мы можем запустить наши скрипты как сайты и обрабатывать любой по размеру объём информации. Внутри будут тоже ограничения на размер фрагмента данных, но за счет пакетной передачи данных, разницу уже не увидим.
В ZennoPoster уже есть всё необходимое для работы с веб (http запросы, браузер, подключение к базам), с множеством примеров в официальной документации и на форуме.
Взаимодействие с NoSQL базами данных рассмотрено менее подробно.
У большинства из них есть интерфейс взаимодействия через HTTP запросы. Есть официальные драйвера для C# которые по факту только создают запросы через обертку. Поэтому, когда нужна производительность, посмотрите быстро исходники драйверов, если там запросы, лишнее тащить в шаблон не нужно.
Особенности сети в Windows
В Windows в системной директории C:\Windows\System32\drivers\etc находится файл hosts который позволяет вручную сопоставлять IP адрес и доменное имя в сети.
Чаще всего этот файл используют при разработке сайтов, перенаправления трафика на нужные сервера. Но его можно использовать и для того, чтобы снизить затраты трафика у себя. Например, заблокировать рекламу или не очень важные сервера со скриптами, оставив только нужные.
В примерах часто пишут только 127.0.0.1 указывая на локальный компьютер, но на самом деле это диапазон 127.0.0.1 — 127.255.255.255, множество потоков можем запустить без пересечения, только указывая разные IP (проверять хост всё равно нужно).
Когда мы отправляем запросы на другие сервера уже вне локальной сети, нам не нужны принтеры, видимость других компьютеров. Поэтому в настройках подключения, если убрать всё лишнее, оставив только IPv4, IPv6 (тоже можно убрать, если не используем) получим очень небольшой прирост производительности за счёт снижения нагрузки на оборудование.
В реестре осталось достаточно много параметров для настройки, например количество ошибок и таймауты, которые можно изменить.
Тема обмена и ускорения работы достаточно широкая, сложно описать всё что знаешь, поэтому жду вопросов в комментариях, на которые постараюсь ответить.
- Тема статьи
- Другое
- Номер конкурса статей
- Двенадцатый конкурс статей
Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование модератором: