Создавать шаблоны для автопостинга в Zebroid на самом не очень сложно, часто создавали шаблоны люди, которые до этого ниразу не программировали. Но в некоторых случаях всё же навыки программирования необходимы. В этой статье описываются принципы и доступный функционал для создания своих шаблонов Автопостинга.
Прежде всего необходимо открыть окно автопостинга, вкладку «Создание шаблонов» и добавить свой шаблон. Рекомендуется, чтобы уже был загружен какой-то проект для Зеброида, чтобы сразу можно было тестировать скрипты.
Создание шаблонов
Окно создания скриптов автопостинга
На этой вкладке создаются скрипты постинга. Тут мы имеем список шаблонов и их редактор. Сам редактор состоит из 2-ух частей:
- Редактор скрипта
- Редактор дополнительных полей и тестовых переменных
Первая отвечает за алгоритм работы шаблона постинга (детальнее об всех процедурах и переменным можно найти в следующих частях этой статьи), вторая — за наличие тех или иных полей в теле скрипта и за данные необходимые для теста скрипта на работоспособность.
Остановлюсь на редакторе дополнительных полей, так как для его использования необходимо знание формата записи. Итак формат следующий (каждая новая запись с новой строки):
ИМЯ_ПЕРЕМЕННОЙ=ОПИСАНИЕ|ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ
Имя переменной может быть любым. Это по сути то, что программа ищет перед запуском скрипта, чтобы заменить на значение.
Описание — это то, что увидеть пользователь в списке доп. полей которые ему необходимо заполнить при создании аккаунта.
Значение по умолчанию — это значение, которое установлено до того, как пользователь введет своё. Во время теста, программа использует именно значение по умолчанию при заполнении доп. полей.
Синтаксис скриптов
В скриптах автопостинга используется синтакс Pascal. Практически все доступные функции этого языка программирования реализованы. К тому же добавлены готовые функции для управления браузером с программы и работы с проектом.
Готовые функции условно разделены на 3 группы:
- Основные
- Дополнительные
- Функции профессионального режима постинга (устаревший режим, в Chromium не используется и в будущем будет убран)
Первые содержат в себе самые необходимые функции для работы с проектом и постингом на сайты. Вторые — дополнительные функции которые бывают редко востребованы. Третье — функции работы скрипта в режиме профессионала (это режим, в котором программа передаёт полное управление скрипту и не вмешивается в его работу).
Стандартные переменные:
- $POST_TITLE — имя записи
- $POST_CATEGORY — имя родительской записи
- $POST_TEXT — текст записи
- $POST_BRIEF — анонс поста (берется текст до тега )
- $POST_AFTER_BRIEF — текст после анонса (берется текст после тега )
- $POST_TAGS — таги записи
- $CAT_NAME — имя категории (в принципе одно и тоже что и $POST_TITLE)
- $POST_DATE — полная дата публикации
- $POST_YEAR — год публикации
- $POST_MONTH — месяц публикации
- $POST_DAY — день публикации
- $POST_HOUR — час публикации
- $POST_MINUTES — минуты публикации
- $POST_ALT_NAME — ЧПУ имя статьи
- $POST_META_KEYS — мета keywords
- $POST_META_DESC — мета description
- $__ИМЯ — значение доп. поля записи с именем ИМЯ (имя может быть произвольным)
- $URL — значения поля «Адрес сайта»
- $LOGIN — значения поля «Логин»
- $PASSWORD — значения поля «Пароль»
- $ИМЯ — значения дополнительного поля скрипта
Внимание: Данные переменные нельзя использовать вне обязательных процедур Posting и AddCategories (или процедур которые они вызывают).
Обязательные процедуры:
procedure Login(); // процедура логина на сайт
procedure Posting(); // процедура добавления постов
procedure GoToCatSetings(); // заход в админку, где добавляются категории
procedure AddCategories(); // процедура добавления категорий
Основные функции
{
Перейти на указанную страницу
@param string url - адрес страницы
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure Navigate(url:string; WaitForLoad:boolean);
{
Добавляет поддержку zQuery (jQuery для Zebroid) для текущей
станицы. Вызов функций в JS скриптах осуществляется через
обращение к функции zQuery (вместо jQuery и $).
}
procedure InjectZQuery();
{
Заполнить поле формы
@param string field - имя поля
@param string value - значение
}
procedure FillForm(field, value:string);
{
Заполнить все поля на странице, которые имеют указанное имя
@param string field - имя поля
@param string value - значение
}
procedure FillFormAll(field, value:string);
{
Поиск значение в выпадающем списке (найденное значение
выбирается)
@param string field - имя списка
@param integer indx - индекс пункта (начиная с 0),
который нужно выбрать
}
procedure FillComboboxByIndex(field:string; indx:integer);
{
Поиск значение в выпадающем списке (найденное значение
выбирается)
@param string field - имя списка
@param string value - значение параметра value,
которое нужно выбрать
}
procedure FillComboboxByValue(field, value : string);
{
Поиск значение в выпадающем списке (найденное значение
выбирается)
@param string field - имя списка
@param string item - текст пункта в списке,
которое нужно выбрать
}
procedure FillComboboxByItem(field, item : string);
{
Прикрепить к форме файл
@param string field - поле для файла
@param string filepath - полный путь к файлу на компьютере
}
procedure SetFile(field, filepath : string);
{
Получить список всех картинок в тексте статьи. Результат оформлен
в виде списка имен картинок и через табуляцию полный путь к файлу
на компьютере пользователя
}
function GetPostImages():string;
{
Нажать на кнопку
@param string btn - имя кнопки
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure ClickButton(btn:string; WaitForLoad:boolean);
{
Нажать на кнопку
@param string btn - имя кнопки
@param integer numb - номер кнопки с таким именем на странице
(начиная с 0)
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure ClickButtonByNumber(btn:string; numb:integer; WaitForLoad:boolean);')
{
Нажать на кнопку
@param string button_id - id кнопки
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure ClickElementById(button_id:string; WaitForLoad:boolean);
{
Сабмит формы под указанным номером
@param integer name - имя формы
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure SubmitFormByName(name:string; WaitForLoad:boolean);
{
Эмуляция клика по JS объекту
@param string js_object - Объект JS для которого нужно симулировать клик
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure ClickSimulate(js_object:string; WaitForLoad:boolean);
{
Физический клик по объекту. Зеброид сам попытается найти координаты объекта и кликнуть по нему
@param string js_object - Объект JS для которого нужно симулировать клик
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure ClickSimulate2(js_object:string; WaitForLoad:boolean);
{
Эмуляция нажатия клавиши
@param integer mode - Тип сообщения (0 - нажатие клавиши, 1 - отпускание клавиши, 2 - отправить символ)
@param boolean key - ASCI код клавиши (например 13 - Энтер, 32 - пробел)
}
procedure KeyPress(mode, key : integer);
{
Сабмит формы под указанным номером
@param integer form - порядковый номер формы (начинается с нуля)
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure SubmitFormByIndex(index:integer; WaitForLoad:boolean);
{
Приостановить выполнение скрипта
@param byte sec - время паузы в секундах
}
procedure Wait(sec:byte);
{
Поиск значение в исходном тексте страницы (возвращает значение
указанной группы). Работает до первого совпадения;
@param string reg - регулярное выражение по которому
нужно проводить поиск
@param integer numb - номер группы значение которой
будет возвращено (0 - результат
всего регулярного выражения )
}
function SearchInSource(reg:string; numb:integer):string;
{
возвращает значение указанной переменной со списка
стандартных переменных
@param string value - имя переменной
}
function GetVar(value:string):string;
{
экранировать спецсимволы регулярного выражения
@param string s - строка которую необходимо экранировать
}
function EscapeChars(s:string):string;
{
выполнить JavaScript
@param string script - текст скрипта
@param boolean WaitForLoad - дожидаться конца загрузки страницы
}
procedure ExecJS(script:string; WaitForLoad:boolean);
{
выполнить JavaScript и возвращает текстовый результат
@param string script - текст скрипта
}
function ExecJSWithResult(script:string):string;
{
Возвращает HTML код страницы
}
function GetHTML():string;
{
Разгадывание каптчи. Если активирована опция "Использовать сервис разгадывания каптчи" -
то программа отправит каптчу на разгадывание, иначе - выведет окно для ручного ввода каптчи.
@param string url - часть урла каптчи (уникальная для данной страницы часть, чтобы точно идентифицировать рисунок каптчи)
@param string field - поле, куда должен заносится результат ввода
}
procedure CaptchaSolving(url, field:string);
{
Разгадывание ReCaptcha. Если активирована опция "Использовать сервис разгадывания каптчи" -
то программа отправит каптчу на разгадывание, иначе - выведет окно ожидания ручного ввода каптчи.
Использовать прокси для автоматического разгадывания обязательно.
@param string url - URL страницы с каптчей (если передать пустое значение - будет использован текущий URL)
@param string key - доменный ключ для рекаптчи (если передать пустое значение - программа сама попробует его определить)
@param string field - поле для ввода результата (если передать пустое значение - будет использовано стандартное значение)
@param string cookies - дополнительные куки, которые необходимо передать на сервис разгадывания каптчи
}
procedure ReCaptchaSolving(url, key, field, cookies: string);
{
Ожидание действий от пользователя (скрипт не продолжит работу пока пользователь не закроет окно с сообщением)
@param string message - текст сообщения для пользователя
}
procedure NeedUserActions(message:string);
{
Ожидание появления HTML кода на странице (даёт возможность точно идентифицировать конец загрузки страницы)
@param string html - HTML код, появление которого ожидается (регистр не имеет значение)
}
procedure WaitForHTML(html:string);
{
Вывод сообщения с вопросом и кнопками ОК, Отмена. Возвращает значение 1 если нажали ОК и 0 - если Отмена.
@param string text - тест сообщения/вопроса
}
function MsgBox(text:string):integer;
{
Сохраняет текст в файл
@param string text - текст, который необходимо сохранить
@param string filename - полный путь к файлу для сохранения (если файл существует - то он будет перезаписан)
}
procedure SaveToFile(text, filename:string);
{
Сохранить лог действий скрипта в файл
@param string filename - полный путь к файлу для сохранения (если файл существует - то он будет перезаписан)
}
procedure SaveLog(filename:string);
{
Переводит текст с HTML в BB
@param string html - текст, который необходимо перевести в BB
}
function HtmlToBB(html:string):string;
{
Удаляет весь HTML из текста
@param string str - текст в котором необходимо удалить HTML
}
function NoHTML(str : string):string;
{
Функция поиска и замены в тексте, возвращает результат
@param string find - что искать
@param string replace - на что заменять
@param string replace - текст в котором будет производится поиск
@param boolean WholeWord - обрабатывать только целые слова
@param boolean CaseSenc - регистрозависимость
@param smallint repl_type - тип поиска: 0 - обычный поиск, 2 - регулярные выражения
}
function RegEx(find, replace, subject:string; WholeWord, CaseSenc:boolean; repl_type:smallint):string;
{
Функция поиска тексте с помощью регулярных выражений
@param string regex - регулярное выражение
@param string text - текст в котором идёт поиск
}
function GetRegExpMach(regex, text:string):string;
{
Находит в тексте все совпадения (с помощью регулярных выражений) и сохраняет
внутри объекта типа TStringList (объект после использования необходимо уничтожать)
@param string text - текст в котором идёт поиск
@param string regex - регулярное выражение
@param integer submach - номер группы которая будет сохранятся в результат
}
function GetAllMaches(text, regexp: string; submach: integer):TStringList;
{
Установка radio-боксу с именем name значения value
@param string name - имя radio-бокса
@param string value - значение
}
procedure RadioCheck(name:string; value:string);
{
Изменить значение чекбокса
@param string chb - имя чекбокса
@param boolean status - значение (true - выделить; false - снять выдиление)
}
procedure ChechBoxCheck(chb:string; status:boolean);
{
Осуществляет вставку переданного текста используя буфер обмена
@param string text - текст который будет вставлен
}
procedure CopyAndPaste(text : string);
{
Принудительное ожидание окончания загрузки страницы. Использовать рекомендуется при отправки нажатия кнопки Энтер, чтобы знать когда загрузка завершилась. Если страница не грузилась, но вызвали эту процедуру, то она завершится по истечению таймаута (около 30 сек.)
}
procedure WaitForLoad();
{
Написать сообщение в окно лога
@param string mess - текст сообщения
}
procedure WriteToLog(mess:string);
{
Установка параметров отправки каптчи в сервис antigate.com (описание каждого из параметров смотрите тут: http://antigate.com/panel.php?action=api)
}
procedure SetCaptchaParams(phrase, regsense, numeric, calc, min_len, max_len:integer);
{
Доложить об ошибке разгадывания последней от правленой каптчи.
}
procedure ReportBadCaptcha();
{
Возвращает true если запись имеет статус черновика.
}
function isDraftPost():boolean;
{
Копирует исходный код страницы в буфер обмена
}
procedure SourceToClipboard();
{
Не отмечает запись как использованную по завершению работы скрипта
}
procedure DoNotCheckAsUsed();
{
Запись ссылки на пост. По окончанию постинга все опубликованные ссылки можно посмотреть в файле "temp\__autoposting_urls"
@param string url - значение, которое будет записано в файл
}
procedure AddUrl(url:string);
Функции работы с Excel
{
Загружает содержимое файла
@param string FileName - полный путь к файлу
}
procedure Excel_LoadFile(FileName : string);
{
Сохраняет содержимое файла
@param string FileName - полный путь к файлу
}
procedure Excel_SaveFile(FileName : string);
{
Возвращает содержимое ячейки
@param string col - буквенное представление колонки (A, B, C ...)
@param integer row - номер строки (начиная с нуля)
}
function Excel_ReadCell(col : string; row : integer):string;
{
Записывает в ячейку значение value
@param string col - буквенное представление колонки (A, B, C ...)
@param integer row - номер строки (начиная с нуля)
@param string value - значение, которое нужно записать
}
procedure Excel_WriteCell(col : string; row : integer; value : string);
Внимание: Работать с этими функциями лучше всего начиная с функции Excel_LoadFile даже если вам ничего не нужно сохранять. При вызове этой функции программа запоминает по расширению файла с каким типом ей нужно дальше работать и от этого зависит в каком формате будет производится сохранение.
Пример загрузки и работы с файлом:
Excel_LoadFile('C:\myfile.xls'); // Открываем файл
buf := Excel_ReadCell('A', 0); // Считываем содержимое ячейки в переменную buf
WriteToLog(buf); // Выводим содержимое в лог
Пример сохранения в новый файл:
Excel_LoadFile('.xlsx'); // Это необходимо, чтобы установить с каким форматом мы будем работать
Excel_WriteCell('A', 0, 'Hello world!!!'); // Записываем в ячейку
Excel_SaveFile('C:\myfile.xlsx'); // Сохраняем в файл
Профессиональный режим постинга
ПРО режим — это режим для опытных кодеров, которые способны разобраться в документации его использования, имеют навыки программирования и все последствия использования этого режима берут на себя.
Что включает в себя ПРО режим:
- никаких ограничений
- полный доступ к данным проекта
- дополнительные возможности управления окном постинга
Программа определяет наличие ПРО режима пор первой строке скрипта постинга, а именно она должна быть такова:
Program InProffesionalMode;
Порядок выполнения опреаций в ПРО режиме определяет конструкция «begin end.»
Т.е. болванка ПРО режима выглядит следующим образом:
Program InProffesionalMode;
//Процедуры и функции сюда
begin
//Порядок выполнения процедур и функций сюда
end.
Данные в распоряжении скриптов в ПРО режиме
А теперь посмотрим, что же именно есть в ПРО режиме:
1.
Массив данных «records» — это массив данных текущего проекта (все элементы дерева и их характеристики). Имеет ряд свойст и функций которые помогают оперировать данными. Свойства и методы:
- Count — количество записей
- ItemTitle[Index: Integer]: string — Название записи под номером Index
- ItemAltName[Index: Integer]: string — Атрибут AltName записи под номером Index
- ItemKeywords[Index: Integer]: string — Ключевые слова записи под номером Index
- ItemDescription[Index: Integer]: string — Описание записи под номером Index
- ItemText[Index: Integer]: string — Текст записи под номером Index
- ItemConvText[Index: Integer]: string — Конвертированные текст (переводятся адриса рисунков с формата программы в адреса на сайте, удаляются внутренние ссылки) записи под номером Index
- ItemTags[Index: Integer]: string — Метки записи под номером Index
- ItemDate[Index: Integer]: string — Дата записи под номером Index
- ItemUsed[Index: Integer]: boolean — Атрибут использованости записи под номером Index (нужен для предотвращения повторного постинга записи)
- IsCategory[Index: Integer]: boolean — Определяет является ли запись категорией
- GetParentIndx[Index: Integer]: Integer — Возвращает индекс родителя записи. Если Это запись первого уровня (т.е. нету родителя), то возвращает -1
2.
Управление свойствами и контролами окна постинга. Обект вызывается по имени «Window». Свойства и методы:
- PBmax: Integer — Максимальное значение Прогресс бара
- PBposition: Integer — текущая позиция Прогресс бара
- JustNew: boolean — Значение опции «Добавлять только не использованные посты и категории»
- procedure PBgo(Value:integer); — изменить позицию Прогресс бара на значение Value