4 место Сохраняем свои данные в профили .zpprofile

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Порой при работе необходимо оперировать кучей различных акков с одного профиля. Например в сеоспринт, где необходимо под один аккаунт сеоспринта иметь множество акков в различных соц.сетях Инстаграм, Гугл, ВК, ОК, ФБ, почта и т.д. Или с одного профиля Марфы Прошкиной размещать посты в разных соц.сетях. Держать всю эту инфу в списках и таблицах - не удобно. Связываться с базами данных многие боятся и не всегда это необходимо. Поэтому сохранять эту информацию в профили, которые у нас и так имеются - самое оно.

Сохранение информации в профили zpprofile пользователи просят уже давно. Была начата работа в нужном направлении http://zennolab.com/discussion/threads/xaljava-biblioteka-profileactions-rasshirennaja-versija-standartnyx-profilej-zpprofile.34908/#post-261645 , но до нужного пока как раз-таки и не добрались:
PS: есть мысль - добавить функционал сохранения переменных в профиль (project.Variables[имя_переменной]), чтобы после загрузки профиля - восстановить значения из них.

Нужно/полезно? Отпишитесь плиз.
Не говоря уже о не очень большом желании подключать лишние библиотеки, в том числе и из-за вопросов со стабильностью их работы.

А решение данной задачи на мой взгляд элементарно!

Поняли к чему я веду? Мы можем записать в это поле любую информацию и забирать её от туда штатными средствами зенки в многопотоке без всяких сбоев!

Я бы предпочел размещать информацию в Interset

Но разработчики зенки где-то что-то не доглядели:

И обратиться к интересам мы не можем, но и не больно то и хотелось...

Кликаем правой кнопкой мыши на панельке и добавляем директивы:

Далее открываем общий код:

Добавляем в общий код:
Код:
namespace my

{
    public class Profile {
        private IZennoPosterProjectModel Project;
        private Instance Instance;
    
        public Profile (IZennoPosterProjectModel project, Instance instance)
        {
            Project = project;
            Instance = instance;
        }
        
        public void AddToProfile(string tag, string value)
            {
                string advParam = this.Project.Profile.SecretQuestionAnswer2;
                string settings = Regex.Match(advParam, string.Format(@"\[{0}/].*\[/{0}]", tag)).Value;
                if(!string.IsNullOrEmpty(settings))
                {
                    this.Project.Profile.SecretQuestionAnswer2 = advParam.Replace(settings, string.Format("[{1}/]{0}[/{1}]", value, tag));
                    this.Project.SendInfoToLog(string.Format("Для поля {0} обновили значение {1}", tag, value), true);
                }
                else
                {
                    this.Project.Profile.SecretQuestionAnswer2 = advParam+string.Format("[{1}/]{0}[/{1}]", value, tag);
                    this.Project.SendInfoToLog(string.Format("Добавили поле {0} со значением {1}", tag, value), true);
                }
            }
        
        public string GetFromProfile(string tag)
        {
            return Regex.Match(this.Project.Profile.SecretQuestionAnswer2, string.Format(@"(?<=\[{0}/]).*?(?=\[/{0}])", tag)).Value;
        }
    }
}
В каждом снипете, где будем обращаться к дополнительным полям первой строчкой пишем:
Код:
my.Profile profile = new my.Profile(project, instance);
Чтобы добавить значение в профиль используем метод:
Код:
profile.AddToProfile("vk_phone", project.Variables["cfg_vk_phone"].Value);
Первый параметр vk_phone - это некий маркер (название поля).
Второй параметр - project.Variables["cfg_vk_phone"].Value - ваша стандартная переменная в Зеннопостере с именем cfg_vk_phone


Т.е. мы добавляем в поле project.Profile.SecretQuestionAnswer2 свои данные в виде:
[vk_phone/]79999999999[/vk_phone][vk_pass/]old_pass_vk[/vk_pass][ok_phone/]74444444444[/ok_phone][ok_pass/]old_pass_ok[/ok_pass]
и получаем некое подобие JSON или XML. Это общепринятый язык разметки под названием DTG (DoorwayTemplateGenerator).

После того как мы напихали всю эту порнографию в наш практически девственный SecretQuestionAnswer2 с этим надо как-то работать.

И забирать мы нужные нам данные будем методом
Код:
profile.GetFromProfile("vk_phone")
А для тех кто совсем не понимает, что с этим дальше делать, то даю готовую строку:
Код:
project.Variables["cfg_vk_phone"].Value = profile.GetFromProfile("vk_phone");
Строкой выше мы забираем из профиля в поле vk_phone ([vk_phone/]79999999999[/vk_phone]) нужные данные (79999999999) и помещаем их в переменную Зеннопостера project.Variables["cfg_vk_phone"].Value с именем cfg_vk_phone

Если вы хотите сделать определенные действия основываясь на наличие/отсутствие данных в профиле, то проверьте это поле на пустоту.
Например вы хотите зарегистрировать для профиля аккаунты ФБ, Твиттер, Инстаграм постепенно и не вести списки где уже зарегали, а где нет.

Код:
my.Profile profile = new my.Profile(project, instance);
if(!string.IsNullOrEmpty(profile.GetFromProfile("fb_phone")))
{
    return null;
}
Данный снипет проверит есть ли запись в fb_phone и если её нет, то перейдет к следующему кубику для регистрации аккаунта. Если же в поле будут данные (не пустые), то снипет сработает по красной ветке
Проверка на регу в фб:

Отработало по зеленой, т.е. нужно регать аккаунт.

Проверка на регу в вк:

Отработали по красной ветке. Т.е акк на вк для данного профиля уже зареган, а значит завершаем выполнение данного потока.

После внесения изменений в профиле не забываем сохранить профиль в файл! Можете делать это данной строкой:
Код:
project.Profile.Save(project.Directory + @"\profile.zpprofile", true, true, true, false, false, false, true, true, false);
Или своим любимым кубиком.

Советую снипет загрузки данных из профиля размещать в самом начале работы шаблона, раскидав все данные по переменным Зеннопостера. И в последствии уже с ними и работать.

А снипет записи данных в профиль размещаете соответственно там где это необходимо.

Видео будет позже
 
Тема статьи
Другое
Номер конкурса статей
Девятый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

jkarsak37428

Client
Регистрация
20.12.2015
Сообщения
137
Благодарностей
11
Баллы
18
Вот это годнота! Спасибо!
 
  • Спасибо
Реакции: Karamzin

esouldy

Client
Регистрация
28.02.2016
Сообщения
185
Благодарностей
92
Баллы
28
мой вариант, да простит меня ТС =)
используется библиотека Newtonsoft.Json

Код:
//создаем словарь
Dictionary <string, string> userinfo = new Dictionary <string, string>();
userinfo.Add("login", project.Variables["login"].Value);
userinfo.Add("password", project.Variables["password"].Value);
userinfo.Add("name", project.Variables["name"].Value);
userinfo.Add("surname", project.Variables["surname"].Value);
//сохраняем его в контекст. можно не делать это, но тогда конвертироватб придется в этом же кубике
project.Context["userinfo"] = userinfo;

//сериализуем словарь в жисон
Dictionary <string, string> userinfo = project.Context["userinfo"];
//конвертируем словарь в жисон и возвращаем
return JsonConvert.SerializeObject(userinfo, Formatting.Indented);

//десериализуем жисон в словарь
string a = project.Variables["tmp"].Value.Replace(@"\", string.Empty);;
Dictionary<string, string> userinfo = JsonConvert.DeserializeObject<Dictionary<string, string>>(a);

//получаем доступ к значениям
Dictionary <string, string> userinfo = project.Context["userinfo"];
return userinfo["name"];
у меня жисон хранился в бд и переменных, но можно записывать его и в любое понравившееся поле, типа ответа на секретный вопрос - проблем не было.
 

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
мой вариант, да простит меня ТС =)
используется библиотека Newtonsoft.Json
думал о применении JSON, но к сожалению как выразились в одной из статей на хабре JSON - это минное поле. При обращении к несуществующему или нуллевому полю вылетит исключение.
Тоже самое и при использовании словаря:

В результате получаем не универсальное решение, которое сможет применить любой новичок. И придется еще городить кучу логики для обработки исключений и еще хрен знает чего.
В результате, на мой взгляд, я решил задачу минимальными усилиями с универсальным применением.

PS Словарь перед добавлением в JSON придется также обработать ибо насколько я помню при добавлении туда текста с кавычками вылетит исключение. В общем много работы, а выгода для меня не понятна пока.
 

esouldy

Client
Регистрация
28.02.2016
Сообщения
185
Благодарностей
92
Баллы
28
ну с дури можно много чего сломать) у меня массив создавался в самом начале работы регера, и потом уже гонялся шаблонами-воркерами. Сложность была лишь одна: не очень удобно добавлять новые поля, ибо все это где-то там и не визуализировано.
А вообще, хабр хабром, но жисон это ни много ни мало стандарт языка JavaScript, и то, что он позволяет выстрелить себе в ногу не делает его хуже или лучше. Маркетологи называют это гибкостью)
 
  • Спасибо
Реакции: Vavildi и Lord_Alfred

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
ну с дури можно много чего сломать) у меня массив создавался в самом начале работы регера, и потом уже гонялся шаблонами-воркерами. Сложность была лишь одна: не очень удобно добавлять новые поля, ибо все это где-то там и не визуализировано.
А вообще, хабр хабром, но жисон это ни много ни мало стандарт языка JavaScript, и то, что он позволяет выстрелить себе в ногу не делает его хуже или лучше. Маркетологи называют это гибкостью)
Я хотел добавить в статью строчку, что статья написана с уклоном для новичков, которые в c# ни рукой ни ногой ни х... Но почему-то не добавил.
Вся статья и инструмент максимально упрощены для использования новичками и чтобы не было даже шансов на какие-то исключения. Ибо не хочется отвечать потом на вопросы: у меня тут ошибка какая-то, что делать, когда пользователь добавил в пароль кавычку и кроет меня матом, потому что у него вдруг иногда не работает... Или в профиле отсутствуют нужные данные и вылезает непонятная для новичков ошибка.
 
  • Спасибо
Реакции: lzlmrf и esouldy

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 852
Баллы
113
Спасибо за упоминание либы ProfileActions, может быть у кого-нибудь дойдут руки раньше моего и допилят её, чтоб там нормально сохранялись переменные. Но даже сейчас она работает и сохраняет дополнительную информацию об инстансе и восстанавливает её при загрузке профиля. Поэтому в любом случае она и сейчас может пригодится тем, кому важно, чтоб после загрузки профиля эмулировалось всё тоже самое, что и в момент сохранения профиля )

В результате, на мой взгляд, я решил задачу минимальными усилиями с универсальным применением.
Бегло посмотрел код и есть подозрения, что он может некорректно обрабатывать замену существующего параметра. Плюс там в регулярке не всё заэкранировано, нет модификатора для "самого короткого совпадения".
 

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
может некорректно обрабатывать замену существующего параметра
Отрабатывает корректно.
Плюс там в регулярке не всё заэкранировано
Все работает. Что именно нужно заэкранировать?
нет модификатора для "самого короткого совпадения".
Это излишне.
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
399
Баллы
63
О как! Недавно задавался вопросом, как бы в профиль запихать инфу. И вот ответ! Спасибо!
 

wizard

Client
Регистрация
04.10.2011
Сообщения
989
Благодарностей
584
Баллы
93
ох боюсь я этих самописных велосипедов, даже своего :-)
очень бы хотелось решения от разрабов zenno.
 
  • Спасибо
Реакции: alexbarov и Se0mashines

iBotovod

Client
Регистрация
01.07.2017
Сообщения
56
Благодарностей
19
Баллы
8
Очень многим будет полезно.
Спасибо за статью.
+
 

Sputnik

Client
Регистрация
23.08.2015
Сообщения
30
Благодарностей
9
Баллы
8
Очень кстати. А можно добавлять информацию в уже готовую строчку? Без выгрузки данных в снипет?
 

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63

Sputnik

Client
Регистрация
23.08.2015
Сообщения
30
Благодарностей
9
Баллы
8
Т.е. мы добавляем в поле project.Profile.SecretQuestionAnswer2 свои данные в виде:
[vk_phone/]79999999999[/vk_phone][vk_pass/]old_pass_vk[/vk_pass][ok_phone/]74444444444[/ok_phone][ok_pass/]old_pass_ok[/ok_pass]
Т.е. в следующем снипете появятся еще данные - как их проще добавить в поле не удаляя имеющиеся данные?
 

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Просто добавляешь.
PHP:
my.Profile profile = new my.Profile(project, instance);
profile.AddToProfile("new", project.Variables["cfg_new_data"].Value);
Если данные с таким параметром/полем/именем "new" уже имеются, то они поменяются на новые. Если их не было, то добавятся.

Т.е.
[vk_phone/]79999999999[/vk_phone][vk_pass/]old_pass_vk[/vk_pass][ok_phone/]74444444444[/ok_phone][ok_pass/]old_pass_ok[/ok_pass]
превратится в
[vk_phone/]79999999999[/vk_phone][vk_pass/]old_pass_vk[/vk_pass][ok_phone/]74444444444[/ok_phone][ok_pass/]old_pass_ok[/ok_pass][new/]новые данные[/new]

Если добавишь данные с тем же именем поля, то они перезапишутся
PHP:
profile.AddToProfile("new", project.Variables["cfg_new_data"].Value);
[vk_phone/]79999999999[/vk_phone][vk_pass/]old_pass_vk[/vk_pass][ok_phone/]74444444444[/ok_phone][ok_pass/]old_pass_ok[/ok_pass][new/]измененные данные[/new]
 
  • Спасибо
Реакции: samsonnn и Sputnik

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 628
Благодарностей
1 303
Баллы
113
Сижу читаю и пришла в голову мысля, а что если эту идею реализовать для хранения кук полученных с пост гет запроса, то есть у каждого аккаунта есть свой профиль, если мы браузер не используем, а нам нужно складировать куда то наши куки, обновлять их на определенном этапе, и в дальнейшем с ними работать. Это просто супер вариант, пойду тестить спасибо за статью)
 
  • Спасибо
Реакции: backoff

ТРОН

Client
Регистрация
31.07.2016
Сообщения
336
Благодарностей
379
Баллы
63
Сижу читаю и пришла в голову мысля, а что если эту идею реализовать для хранения кук полученных с пост гет запроса, то есть у каждого аккаунта есть свой профиль, если мы браузер не используем, а нам нужно складировать куда то наши куки, обновлять их на определенном этапе, и в дальнейшем с ними работать. Это просто супер вариант, пойду тестить спасибо за статью)
Куки контейнер, не?
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 628
Благодарностей
1 303
Баллы
113
Просто добавляешь.
PHP:
my.Profile profile = new my.Profile(project, instance);
profile.AddToProfile("new", project.Variables["cfg_new_data"].Value);
Если данные с таким параметром/полем/именем "new" уже имеются, то они поменяются на новые. Если их не было, то добавятся.

Т.е.
[vk_phone/]79999999999[/vk_phone][vk_pass/]old_pass_vk[/vk_pass][ok_phone/]74444444444[/ok_phone][ok_pass/]old_pass_ok[/ok_pass]
превратится в
[vk_phone/]79999999999[/vk_phone][vk_pass/]old_pass_vk[/vk_pass][ok_phone/]74444444444[/ok_phone][ok_pass/]old_pass_ok[/ok_pass][new/]новые данные[/new]

Если добавишь данные с тем же именем поля, то они перезапишутся
PHP:
profile.AddToProfile("new", project.Variables["cfg_new_data"].Value);
[vk_phone/]79999999999[/vk_phone][vk_pass/]old_pass_vk[/vk_pass][ok_phone/]74444444444[/ok_phone][ok_pass/]old_pass_ok[/ok_pass][new/]измененные данные[/new]
как добавить новую запись понятно, как заменить существующую понятно, а как удалить определенную запись? например добавили [new/]измененные данные[/new] и через какое то время ее нужно удалить, как это сделать?
 
Последнее редактирование:

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