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

Discussion in 'Девятый конкурс статей' started by Karamzin, May 15, 2018.

  1. Karamzin

    Karamzin Client

    Joined:
    May 24, 2016
    Messages:
    155
    Likes Received:
    231
    Порой при работе необходимо оперировать кучей различных акков с одного профиля. Например в сеоспринт, где необходимо под один аккаунт сеоспринта иметь множество акков в различных соц.сетях Инстаграм, Гугл, ВК, ОК, ФБ, почта и т.д. Или с одного профиля Марфы Прошкиной размещать посты в разных соц.сетях. Держать всю эту инфу в списках и таблицах - не удобно. Связываться с базами данных многие боятся и не всегда это необходимо. Поэтому сохранять эту информацию в профили, которые у нас и так имеются - самое оно.

    Сохранение информации в профили zpprofile пользователи просят уже давно. Была начата работа в нужном направлении http://zennolab.com/discussion/thre...dartnyx-profilej-zpprofile.34908/#post-261645 , но до нужного пока как раз-таки и не добрались:
    Не говоря уже о не очень большом желании подключать лишние библиотеки, в том числе и из-за вопросов со стабильностью их работы.

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

    Я бы предпочел размещать информацию в Interset
    [​IMG]
    Но разработчики зенки где-то что-то не доглядели:
    [​IMG]
    И обратиться к интересам мы не можем, но и не больно то и хотелось...

    Кликаем правой кнопкой мыши на панельке и добавляем директивы:
    [​IMG]
    Далее открываем общий код:
    [​IMG]
    Добавляем в общий код:
    Code (text):
    1. namespace my
    2.  
    3. {
    4.     public class Profile {
    5.         private IZennoPosterProjectModel Project;
    6.         private Instance Instance;
    7.    
    8.         public Profile (IZennoPosterProjectModel project, Instance instance)
    9.         {
    10.             Project = project;
    11.             Instance = instance;
    12.         }
    13.        
    14.         public void AddToProfile(string tag, string value)
    15.             {
    16.                 string advParam = this.Project.Profile.SecretQuestionAnswer2;
    17.                 string settings = Regex.Match(advParam, string.Format(@"\[{0}/].*\[/{0}]", tag)).Value;
    18.                 if(!string.IsNullOrEmpty(settings))
    19.                 {
    20.                     this.Project.Profile.SecretQuestionAnswer2 = advParam.Replace(settings, string.Format("[{1}/]{0}[/{1}]", value, tag));
    21.                     this.Project.SendInfoToLog(string.Format("Для поля {0} обновили значение {1}", tag, value), true);
    22.                 }
    23.                 else
    24.                 {
    25.                     this.Project.Profile.SecretQuestionAnswer2 = advParam+string.Format("[{1}/]{0}[/{1}]", value, tag);
    26.                     this.Project.SendInfoToLog(string.Format("Добавили поле {0} со значением {1}", tag, value), true);
    27.                 }
    28.             }
    29.        
    30.         public string GetFromProfile(string tag)
    31.         {
    32.             return Regex.Match(this.Project.Profile.SecretQuestionAnswer2, string.Format(@"(?<=\[{0}/]).*?(?=\[/{0}])", tag)).Value;
    33.         }
    34.     }
    35. }
    В каждом снипете, где будем обращаться к дополнительным полям первой строчкой пишем:
    Code (text):
    1. my.Profile profile = new my.Profile(project, instance);
    2.  
    Чтобы добавить значение в профиль используем метод:
    Code (text):
    1. profile.AddToProfile("vk_phone", project.Variables["cfg_vk_phone"].Value);
    Первый параметр vk_phone - это некий маркер (название поля).
    Второй параметр - project.Variables["cfg_vk_phone"].Value - ваша стандартная переменная в Зеннопостере с именем cfg_vk_phone
    [​IMG]

    Т.е. мы добавляем в поле 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).
    [​IMG]
    После того как мы напихали всю эту порнографию в наш практически девственный SecretQuestionAnswer2 с этим надо как-то работать.

    И забирать мы нужные нам данные будем методом
    Code (text):
    1. profile.GetFromProfile("vk_phone")
    А для тех кто совсем не понимает, что с этим дальше делать, то даю готовую строку:
    Code (text):
    1. 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
    [​IMG]
    Если вы хотите сделать определенные действия основываясь на наличие/отсутствие данных в профиле, то проверьте это поле на пустоту.
    Например вы хотите зарегистрировать для профиля аккаунты ФБ, Твиттер, Инстаграм постепенно и не вести списки где уже зарегали, а где нет.

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

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

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

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

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

    Видео будет позже
     

    Attached Files:

    Last edited: May 15, 2018
    Nike59, backoff, Rocketmedia and 31 others like this.
  2. jkarsak37428

    jkarsak37428 Client

    Joined:
    Dec 20, 2015
    Messages:
    136
    Likes Received:
    10
    Вот это годнота! Спасибо!
     
    Karamzin likes this.
  3. esouldy

    esouldy Client

    Joined:
    Feb 28, 2016
    Messages:
    185
    Likes Received:
    89
    мой вариант, да простит меня ТС =)
    используется библиотека Newtonsoft.Json

    Code (text):
    1. //создаем словарь
    2. Dictionary <string, string> userinfo = new Dictionary <string, string>();
    3. userinfo.Add("login", project.Variables["login"].Value);
    4. userinfo.Add("password", project.Variables["password"].Value);
    5. userinfo.Add("name", project.Variables["name"].Value);
    6. userinfo.Add("surname", project.Variables["surname"].Value);
    7. //сохраняем его в контекст. можно не делать это, но тогда конвертироватб придется в этом же кубике
    8. project.Context["userinfo"] = userinfo;
    9.  
    10. //сериализуем словарь в жисон
    11. Dictionary <string, string> userinfo = project.Context["userinfo"];
    12. //конвертируем словарь в жисон и возвращаем
    13. return JsonConvert.SerializeObject(userinfo, Formatting.Indented);
    14.  
    15. //десериализуем жисон в словарь
    16. string a = project.Variables["tmp"].Value.Replace(@"\", string.Empty);;
    17. Dictionary<string, string> userinfo = JsonConvert.DeserializeObject<Dictionary<string, string>>(a);
    18.  
    19. //получаем доступ к значениям
    20. Dictionary <string, string> userinfo = project.Context["userinfo"];
    21. return userinfo["name"];
    у меня жисон хранился в бд и переменных, но можно записывать его и в любое понравившееся поле, типа ответа на секретный вопрос - проблем не было.
     
    Rimon, zortexx, Astraport and 2 others like this.
  4. Karamzin

    Karamzin Client

    Joined:
    May 24, 2016
    Messages:
    155
    Likes Received:
    231
    думал о применении JSON, но к сожалению как выразились в одной из статей на хабре JSON - это минное поле. При обращении к несуществующему или нуллевому полю вылетит исключение.
    Тоже самое и при использовании словаря:
    [​IMG]
    В результате получаем не универсальное решение, которое сможет применить любой новичок. И придется еще городить кучу логики для обработки исключений и еще хрен знает чего.
    В результате, на мой взгляд, я решил задачу минимальными усилиями с универсальным применением.

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

    esouldy Client

    Joined:
    Feb 28, 2016
    Messages:
    185
    Likes Received:
    89
    ну с дури можно много чего сломать) у меня массив создавался в самом начале работы регера, и потом уже гонялся шаблонами-воркерами. Сложность была лишь одна: не очень удобно добавлять новые поля, ибо все это где-то там и не визуализировано.
    А вообще, хабр хабром, но жисон это ни много ни мало стандарт языка JavaScript, и то, что он позволяет выстрелить себе в ногу не делает его хуже или лучше. Маркетологи называют это гибкостью)
     
    Vavildi and Lord_Alfred like this.
  6. Karamzin

    Karamzin Client

    Joined:
    May 24, 2016
    Messages:
    155
    Likes Received:
    231
    Я хотел добавить в статью строчку, что статья написана с уклоном для новичков, которые в c# ни рукой ни ногой ни х... Но почему-то не добавил.
    Вся статья и инструмент максимально упрощены для использования новичками и чтобы не было даже шансов на какие-то исключения. Ибо не хочется отвечать потом на вопросы: у меня тут ошибка какая-то, что делать, когда пользователь добавил в пароль кавычку и кроет меня матом, потому что у него вдруг иногда не работает... Или в профиле отсутствуют нужные данные и вылезает непонятная для новичков ошибка.
     
    lzlmrf and esouldy like this.
  7. Lord_Alfred

    Lord_Alfred Client

    Joined:
    Oct 9, 2015
    Messages:
    3,005
    Likes Received:
    2,551
    Спасибо за упоминание либы ProfileActions, может быть у кого-нибудь дойдут руки раньше моего и допилят её, чтоб там нормально сохранялись переменные. Но даже сейчас она работает и сохраняет дополнительную информацию об инстансе и восстанавливает её при загрузке профиля. Поэтому в любом случае она и сейчас может пригодится тем, кому важно, чтоб после загрузки профиля эмулировалось всё тоже самое, что и в момент сохранения профиля )

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

    Karamzin Client

    Joined:
    May 24, 2016
    Messages:
    155
    Likes Received:
    231
    Отрабатывает корректно.
    Все работает. Что именно нужно заэкранировать?
    Это излишне.
     
  9. semafor

    semafor Client

    Joined:
    Dec 27, 2016
    Messages:
    45
    Likes Received:
    4
    О как! Недавно задавался вопросом, как бы в профиль запихать инфу. И вот ответ! Спасибо!
     
  10. wizard

    wizard Client

    Joined:
    Oct 4, 2011
    Messages:
    852
    Likes Received:
    364
    ох боюсь я этих самописных велосипедов, даже своего :-)
    очень бы хотелось решения от разрабов zenno.
     
    alexbarov and Se0mashines like this.
  11. iBotovod

    iBotovod Client

    Joined:
    Jul 1, 2017
    Messages:
    52
    Likes Received:
    15
    Очень многим будет полезно.
    Спасибо за статью.
    +
     
  12. Sputnik

    Sputnik Client

    Joined:
    Aug 23, 2015
    Messages:
    29
    Likes Received:
    9
    Очень кстати. А можно добавлять информацию в уже готовую строчку? Без выгрузки данных в снипет?
     
  13. Karamzin

    Karamzin Client

    Joined:
    May 24, 2016
    Messages:
    155
    Likes Received:
    231
    моя твоя не понимать. в какую строчку?
     
  14. Sputnik

    Sputnik Client

    Joined:
    Aug 23, 2015
    Messages:
    29
    Likes Received:
    9
    Т.е. в следующем снипете появятся еще данные - как их проще добавить в поле не удаляя имеющиеся данные?
     
  15. Karamzin

    Karamzin Client

    Joined:
    May 24, 2016
    Messages:
    155
    Likes Received:
    231
    Просто добавляешь.
    PHP:
    1. my.Profile profile = new my.Profile(project, instance);
    2. 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:
    1. 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 and Sputnik like this.
  16. samsonnn

    samsonnn Client

    Joined:
    Jun 2, 2015
    Messages:
    1,030
    Likes Received:
    538
    Сижу читаю и пришла в голову мысля, а что если эту идею реализовать для хранения кук полученных с пост гет запроса, то есть у каждого аккаунта есть свой профиль, если мы браузер не используем, а нам нужно складировать куда то наши куки, обновлять их на определенном этапе, и в дальнейшем с ними работать. Это просто супер вариант, пойду тестить спасибо за статью)
     
    backoff likes this.
  17. Osedjuse

    Osedjuse Client

    Joined:
    Jul 31, 2016
    Messages:
    297
    Likes Received:
    279
    Куки контейнер, не?
     
  18. samsonnn

    samsonnn Client

    Joined:
    Jun 2, 2015
    Messages:
    1,030
    Likes Received:
    538
    как добавить новую запись понятно, как заменить существующую понятно, а как удалить определенную запись? например добавили [new/]измененные данные[/new] и через какое то время ее нужно удалить, как это сделать?
     
    Last edited: Dec 12, 2018

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)