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

Karamzin

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

Сохранение информации в профили zpprofile пользователи просят уже давно. Была начата работа в нужном направлении http://zennolab.com/discussion/thre...dartnyx-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);
Или своим любимым кубиком.

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

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

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

Вложения

Последнее редактирование:
мой вариант, да простит меня ТС =)
используется библиотека 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"];
у меня жисон хранился в бд и переменных, но можно записывать его и в любое понравившееся поле, типа ответа на секретный вопрос - проблем не было.
 
мой вариант, да простит меня ТС =)
используется библиотека Newtonsoft.Json
думал о применении JSON, но к сожалению как выразились в одной из статей на хабре JSON - это минное поле. При обращении к несуществующему или нуллевому полю вылетит исключение.
Тоже самое и при использовании словаря:

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

PS Словарь перед добавлением в JSON придется также обработать ибо насколько я помню при добавлении туда текста с кавычками вылетит исключение. В общем много работы, а выгода для меня не понятна пока.
 
ну с дури можно много чего сломать) у меня массив создавался в самом начале работы регера, и потом уже гонялся шаблонами-воркерами. Сложность была лишь одна: не очень удобно добавлять новые поля, ибо все это где-то там и не визуализировано.
А вообще, хабр хабром, но жисон это ни много ни мало стандарт языка JavaScript, и то, что он позволяет выстрелить себе в ногу не делает его хуже или лучше. Маркетологи называют это гибкостью)
 
  • Спасибо
Реакции: Vavildi и Lord_Alfred
ну с дури можно много чего сломать) у меня массив создавался в самом начале работы регера, и потом уже гонялся шаблонами-воркерами. Сложность была лишь одна: не очень удобно добавлять новые поля, ибо все это где-то там и не визуализировано.
А вообще, хабр хабром, но жисон это ни много ни мало стандарт языка JavaScript, и то, что он позволяет выстрелить себе в ногу не делает его хуже или лучше. Маркетологи называют это гибкостью)
Я хотел добавить в статью строчку, что статья написана с уклоном для новичков, которые в c# ни рукой ни ногой ни х... Но почему-то не добавил.
Вся статья и инструмент максимально упрощены для использования новичками и чтобы не было даже шансов на какие-то исключения. Ибо не хочется отвечать потом на вопросы: у меня тут ошибка какая-то, что делать, когда пользователь добавил в пароль кавычку и кроет меня матом, потому что у него вдруг иногда не работает... Или в профиле отсутствуют нужные данные и вылезает непонятная для новичков ошибка.
 
  • Спасибо
Реакции: lzlmrf и esouldy
Спасибо за упоминание либы ProfileActions, может быть у кого-нибудь дойдут руки раньше моего и допилят её, чтоб там нормально сохранялись переменные. Но даже сейчас она работает и сохраняет дополнительную информацию об инстансе и восстанавливает её при загрузке профиля. Поэтому в любом случае она и сейчас может пригодится тем, кому важно, чтоб после загрузки профиля эмулировалось всё тоже самое, что и в момент сохранения профиля )

В результате, на мой взгляд, я решил задачу минимальными усилиями с универсальным применением.
Бегло посмотрел код и есть подозрения, что он может некорректно обрабатывать замену существующего параметра. Плюс там в регулярке не всё заэкранировано, нет модификатора для "самого короткого совпадения".
 
может некорректно обрабатывать замену существующего параметра
Отрабатывает корректно.
Плюс там в регулярке не всё заэкранировано
Все работает. Что именно нужно заэкранировать?
нет модификатора для "самого короткого совпадения".
Это излишне.
 
О как! Недавно задавался вопросом, как бы в профиль запихать инфу. И вот ответ! Спасибо!
 
Очень многим будет полезно.
Спасибо за статью.
+
 
Очень кстати. А можно добавлять информацию в уже готовую строчку? Без выгрузки данных в снипет?
 
Т.е. мы добавляем в поле 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]
Т.е. в следующем снипете появятся еще данные - как их проще добавить в поле не удаляя имеющиеся данные?
 
Просто добавляешь.
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
Сижу читаю и пришла в голову мысля, а что если эту идею реализовать для хранения кук полученных с пост гет запроса, то есть у каждого аккаунта есть свой профиль, если мы браузер не используем, а нам нужно складировать куда то наши куки, обновлять их на определенном этапе, и в дальнейшем с ними работать. Это просто супер вариант, пойду тестить спасибо за статью)
 
  • Спасибо
Реакции: backoff
Сижу читаю и пришла в голову мысля, а что если эту идею реализовать для хранения кук полученных с пост гет запроса, то есть у каждого аккаунта есть свой профиль, если мы браузер не используем, а нам нужно складировать куда то наши куки, обновлять их на определенном этапе, и в дальнейшем с ними работать. Это просто супер вариант, пойду тестить спасибо за статью)
Куки контейнер, не?
 
Просто добавляешь.
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] и через какое то время ее нужно удалить, как это сделать?
 
Последнее редактирование:

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