Здесь вы можете задать любые вопросы по MyChat, по работе программы, её настройке, лицензированию и т.д.
rustambek
Здравствуйте.

В процессе эксплуатации возник вопрос, как получить список пользователь из MyChat в разрезе профиля?
Т.е. у кого какие поля заполнены, кто в каких группах, имеется ли фото в профиле и т. д.
MyChat используем как корпоративный мессенджер, профили пользователей после выгрузки из AD допиливают админы в ручную. Бывает где то, что то упускают, проверить ни как. При численности около 200 пользователей прокликывать каждый профиль не реально.
Как можно сделать такую выгрузку? Может есть дугой инструмент?
Аватара пользователя
Андрей Раков
Добрый день.

К сожалению такого инструмента нету. Как вариант, мы можем создать в разделе скриптов специальный раздел для скриптов, которые не выполняются по расписанию или на события, а только вручную.

Там можно будет сделать выгрузку любых данных о пользователях в файл, постараемся сделать это в готовящейся версии.
rustambek
Здравствуйте.

Меня вполне устроит такой вариант.
А нельзя ли выслать скипт сейчас? Пока выйдет новая версия готовы запускать его в ручном режиме, хоть из командной строки.
Аватара пользователя
Алексей Пикуров
Я не уверен, что нужные функции есть в API скриптового движка в данный момент. Попробую написать скрипт и отвечу в этой теме.
Аватара пользователя
Алексей Пикуров
Итак, скрипт сделан, он будет идти в стандартном дистрибутиве MyChat Server.

Под него сделан специальный раздел "Library" — "Service".

Выглядит вот так:

checkemptyusersfieldsscript-small.png
Скрипт для получения пользователей с незаполненными полями из MyChat Server в CSV файл
checkemptyusersfieldsscript-small.png (121.64 КБ) Просмотров: 9873


По умолчанию данные экспортируются в файл "c:\temp\users_report.csv", можете изменить значение константы EXPORT_FILE_NAME. В файл экспорта попадают только те пользователи, по которым не хватает каких-либо заполненных данных.

Что проверять — тоже можно изменить, есть три набора данных, регулируется константой CHECK_WHAT:
"<COMMON>" — стандартные поля;
"<WORK>" — данные о работе;
"<HOME>" — домашний адрес, телефоны и прочее.

После того, как скрипт отработает, просто открывайте файл в Excel и сортируйте, как душе угодно:

userslistinexcel-small.png
Список пользователей из MyChat Server в Excel
userslistinexcel-small.png (22.09 КБ) Просмотров: 9873


Работает достаточно быстро, на нашей базе данных на 4 306 пользователей скрипт отработал за 12 секунд. Можно его ещё пооптимизировать, но, думаю, у вас всё будет значительно быстрее :)

Ожидайте новую версию, уже скоро.
rustambek
Здравствуйте, Алексей.

Спасибо за реализацию этого вопроса. После обновления сервера до последней версии обязательно воспользуюсь этим скриптом
rustambek
Добрый день, Алексей.

Скрипт не работает, точнее он отрабатывает но результата в виде файла нет.
[10:55:49] (Run "CheckEmptyUsersFields"): Время выполнения скрипта: 760 мс
[10:55:49] (Run "CheckEmptyUsersFields"): Скрипт выполнен успешно.
Файла c:\temp\users_report.csv нет.
Менял место выгрузки, не помогло.
Аватара пользователя
Алексей Пикуров
Здравствуйте, Рустамбек.

Если папка c:\temp существует, тогда получается ошибка в скрипте где-то, который "спотыкается" на ваших данных в каком-то месте.

Можете переслать бекап своей базы на [email protected] ?

Я прогоню скрипт на ней под отладчиком и посмотрю, в чём может быть дело.
Аватара пользователя
Алексей Пикуров
Рустам, получил вашу базу, скрипт работает отлично, файл формируется, никаких проблем.

Могу подключиться к вам удалённо, глянуть, мало ли.
rustambek
Алексей, большое спасибо за уделенное время и удаленное подключение.
Проблема была не в скрипте. Результат работы скрипта я ожидал в c:\temp\ своего компьютера, а нужно было в c:\temp\ сервера MyChat [smilie=biggrin.gif]
Аватара пользователя
Алексей Пикуров
Статья по теме: https://nsoft-s.com/mychatarticles/1033 ... ofili.html

Можно расшарить в соцсетях, людям будет полезно.
rustambek
Здравствуйте.

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

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

На [email protected]
rustambek
Вы можете к нам подключится, так будет проще?
Аватара пользователя
Алексей Пикуров
Позже, сейчас занят. Лучше на почту или в форуме.
rustambek
Выслал на почту ссылку для скачивания.
rustambek
Здравствуйте
Как там мой вопрос?
Аватара пользователя
Алексей Пикуров
Добрый день, письмо ваше есть, ещё не смотрели, постараюсь на этой неделе глянуть, отвечу в этой теме.
Аватара пользователя
Алексей Пикуров
Я выполнил ваш скрипт на базе, что вы предоставили, на последней версии сервера, 5.19.3, в списке есть те люди, о которых вы говорите. Результат работы скрипта отправил письмом.
rustambek
Здравствуйте.

Обновились до последней версии, запускаю скрипт, он отрабатывает, но в результатах опять не все пользователи у которых есть не заполненные данные.
Может скрипт цепляется не к той базе? Не знаю что предположить.
Прошу помочь разобраться.
Аватара пользователя
Алексей Пикуров
Давайте я к вам подключусь в 11 по Киеву через TeamViewer или AmmyAdmin. Стукните мне в чате по линку в подписи.
rustambek
Алексей, большое спасибо, после переустановки серверной части по вашей ссылке, все заработало. [smilie=good.gif]
Аватара пользователя
Алексей Пикуров
Пожалуйста :)

viewtopic.php?p=22728#p22728
Аватара пользователя
AlexSun
Добрый день. Скрипт похоже старый, не работает, пишет ошибку:
AddLineToFile(sTitle, EXPORT_FILE_NAME); --> [10:53:57] (Error "CheckEmptyUsersFields"): [Error] (55:42): Invalid number of parameters
Аватара пользователя
Алексей Пикуров
Здравствуйте. Замените пожалуйста функцию AddLineToFile на правильную, в справке есть описание. Последний, третий параметр 0, тип кодировки при сохранении.
Аватара пользователя
Алексей Пикуров
Код: Выделить всё
// CheckEmptyUsersFields service script
//------------------------------------------------------------------------------------
// If you have users with empty fields, you can export full list of them to a CSV file
// and analyze it in Excel.
// -----------------------------------------------------------------------------------
// ver 1.1 / May 12, 2012, (c) Alexey Pikurov, [email protected]
// ver 1.2 / Jun 18, 2021, (c) Alexey Pikurov, [email protected]
// help (russian) - https://www.nsoft-s.com/forum/viewtopic.php?f=1&t=4129
//------------------------------------------------------------------------------------
const
  EXPORT_FILE_NAME      = 'c:\temp\users_report.csv';
 
  CHECK_WHAT            = '<COMMON>,<WORK>,<HOME>';
 
  COMMON_FIELDS_MIN_SET = 'FirstName;MiddleName;LastName;Birthday;Sex;Avatar;';
  WORK_FIELDS_SET       = 'Email;WorkPosition;WorkCompanyName;WorkOffice;WorkPhone;WorkFax;' +
                          'WorkPager;WorkStreetAddress;WorkCity;WorkState;WorkZIP;WorkCountry;WorkWWW;';
  HOME_FIELDS_SET       = 'MaritalStatus;HomePhone;HomeFax;HomeCellular;HomeStreetAddress;HomeCity;HomeState;HomeZIP;HomeCountry;HomeWWW;';
 
function CheckDate(dt: double): boolean;
var
  iYears: integer;
begin
  iYears := YearsBetween(Now, dt);
 
    if (iYears > 100) or (iYears < 16) then result := false
      else result := true;
end;

var
  sUsersList, sJSON, sOut, sUserData, sTitle,
  sNick, sFirstName, sMiddleName, sLastName, sBirthday, sSex, sPhoto,
  sEmail, sWorkPosition, sWorkCompanyName, sWorkOffice, sWorkPhone, sWorkFax,
  sWorkPager, sWorkStreetAddress, sWorkCity, sWorkState, sWorkZIP, sWorkWWW,
  sWorkCountry, sMaritalStatus, sHomePhone, sHomeFax, sHomeCellular,
  sHomeStreetAddress, sHomeCity, sHomeState, sHomeZIP, sHomeCountry, sHomeWWW: string;
 
  iMaritalStatus, iHomeCountry, iUIN, iSex, iWorkCountry, iAvatar: integer;
 
  dtBirthday: double;
  bFlag: boolean;
begin
  SetScriptTimeOut(20000);

  sUsersList := mGetUINSListByRole(-1);

  DeleteFile(EXPORT_FILE_NAME);
 
  sOut   := '';
  sTitle := 'UIN;Nick;';
 
    if pos('<COMMON>', CHECK_WHAT) <> 0 then sTitle := sTitle + COMMON_FIELDS_MIN_SET;
    if pos('<WORK>', CHECK_WHAT) <> 0 then sTitle := sTitle + WORK_FIELDS_SET;
    if pos('<HOME>', CHECK_WHAT) <> 0 then sTitle := sTitle + HOME_FIELDS_SET;
 
  AddLineToFile(sTitle, EXPORT_FILE_NAME, 0);     
 
    while length(sUsersList) > 0 do begin
      bFlag := false;
     
      iUIN := StrToInt(GetNextSt(sUsersList, ','));
      sJSON := mGetUserDataAsJSON(iUIN, 'Nick;' + COMMON_FIELDS_MIN_SET + WORK_FIELDS_SET + HOME_FIELDS_SET);
     
      JSONGetString(sJSON, 'Nick', sNick);
     
      sUserData := inttostr(iUIN) + ';' +
                   DecorateStForCSV(sNick) + ';';
// COMMON -----------------------------------------------------------------------------------------     
        if pos('<COMMON>', CHECK_WHAT) <> 0 then begin
          JSONGetString(sJSON, 'FirstName', sFirstName);
          JSONGetString(sJSON, 'MiddleName', sMiddleName);
          JSONGetString(sJSON, 'LastName', sLastName);
          JSONGetDateTime(sJSON, 'Birthday', dtBirthday);
     
            if CheckDate(dtBirthday) then sBirthday := FormatDateTime('dd.mm.yyyy', dtBirthday)
              else sBirthday := '';

          JSONGetInteger(sJSON, 'Sex', iSex);
     
            case iSex of
              0: sSex := '';
              1: sSex := 'male';
              2: sSex := 'female';
            end;
       
          JSONGetInteger(sJSON, 'Avatar', iAvatar);
     
      if iAvatar = 0 then sPhoto := '' else sPhoto := 'yes';
     
            if (length(sFirstName) = 0) or (length(sMiddleName) = 0) or (length(sLastName) = 0) or
               (length(sBirthday) = 0) or (length(sSex) = 0) or (length(sPhoto) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sFirstName) + ';' +
                       DecorateStForCSV(sMiddleName) + ';' +
                       DecorateStForCSV(sLastName) + ';' +
                       DecorateStForCSV(sBirthday) + ';' +
                       sSex + ';' +
                       sPhoto + ';';
        end;                   
// WORK --------------------------------------------------------------------------------------------                 
        if pos('<WORK>', CHECK_WHAT) <> 0 then begin
          JSONGetString(sJSON, 'Email', sEmail);
          JSONGetString(sJSON, 'WorkPosition', sWorkPosition);
          JSONGetString(sJSON, 'WorkCompanyName', sWorkCompanyName);
          JSONGetString(sJSON, 'WorkOffice', sWorkOffice);
          JSONGetString(sJSON, 'WorkPhone', sWorkPhone);
          JSONGetString(sJSON, 'WorkFax', sWorkFax);
          JSONGetString(sJSON, 'WorkPager', sWorkPager);
          JSONGetString(sJSON, 'WorkStreetAddress', sWorkStreetAddress);
          JSONGetString(sJSON, 'WorkCity', sWorkCity);
          JSONGetString(sJSON, 'WorkState', sWorkState);
          JSONGetString(sJSON, 'WorkZIP', sWorkZIP);
          JSONGetInteger(sJSON, 'WorkCountry', iWorkCountry);
     
            if iWorkCountry = 0 then sWorkCountry := ''
              else sWorkCountry := 'yes';
                   
          JSONGetString(sJSON, 'WorkWWW', sWorkWWW);
     
            if (length(sEmail) = 0) or (length(sWorkPosition) = 0) or (length(sWorkCompanyName) = 0) or
               (length(sWorkOffice) = 0) or (length(sWorkPhone) = 0) or (length(sWorkFax) = 0) or
               (length(sWorkPager) = 0) or (length(sWorkStreetAddress) = 0) or (length(sWorkCity) = 0) or
               (length(sWorkState) = 0) or (length(sWorkZIP) = 0) or (length(sWorkCountry) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sEmail) + ';' +
                       DecorateStForCSV(sWorkPosition) + ';' +
                       DecorateStForCSV(sWorkCompanyName) + ';' +
                       DecorateStForCSV(sWorkOffice) + ';' +
                       DecorateStForCSV(sWorkPhone) + ';' +
                       DecorateStForCSV(sWorkFax) + ';' +
                       DecorateStForCSV(sWorkPager) + ';' +
                       DecorateStForCSV(sWorkStreetAddress) + ';' +
                       DecorateStForCSV(sWorkCity) + ';' +
                       DecorateStForCSV(sWorkState) + ';' +
                       DecorateStForCSV(sWorkZIP) + ';' +
                       DecorateStForCSV(sWorkCountry) + ';' +
                       DecorateStForCSV(sWorkWWW) + ';';
        end;                   
// HOME -------------------------------------------------------------------------------------------     
        if pos('<HOME>', CHECK_WHAT) <> 0 then begin
          JSONGetInteger(sJSON, 'MaritalStatus', iMaritalStatus);
         
            if iMaritalStatus = -1 then sMaritalStatus := '' else sMaritalStatus := 'yes';
           
          JSONGetString(sJSON, 'HomePhone', sHomePhone);
          JSONGetString(sJSON, 'HomeFax', sHomeFax);
          JSONGetString(sJSON, 'HomeCellular', sHomeCellular);
          JSONGetString(sJSON, 'HomeStreetAddress', sHomeStreetAddress);
          JSONGetString(sJSON, 'HomeCity', sHomeCity);
          JSONGetString(sJSON, 'HomeState', sHomeState);         
          JSONGetString(sJSON, 'HomeZIP', sHomeZIP);
          JSONGetInteger(sJSON, 'HomeCountry', iHomeCountry);
         
            if iHomeCountry = -1 then sHomeCountry := '' else sHomeCountry := 'yes';         
           
          JSONGetString(sJSON, 'HomeWWW', sHomeWWW);
     
            if (length(sMaritalStatus) = 0) or (length(sHomePhone) = 0) or (length(sHomeFax) = 0) or
               (length(sHomeCellular) = 0) or (length(sHomeStreetAddress) = 0) or (length(sHomeCity) = 0) or
               (length(sHomeState) = 0) or (length(sHomeZIP) = 0) or (length(sHomeCountry) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sMaritalStatus) + ';' +
                       DecorateStForCSV(sHomePhone) + ';' +
                       DecorateStForCSV(sHomeFax) + ';' +
                       DecorateStForCSV(sHomeCellular) + ';' +
                       DecorateStForCSV(sHomeStreetAddress) + ';' +
                       DecorateStForCSV(sHomeCity) + ';' +
                       DecorateStForCSV(sHomeState) + ';' +
                       DecorateStForCSV(sHomeZIP) + ';' +
                       DecorateStForCSV(sHomeCountry) + ';';
        end;                   
// -------------------------------------------------------------------------------------------------
      if bFlag then sOut := sOut + sUserData + #13#10;
    end;
   
  AddLineToFile(sOut, EXPORT_FILE_NAME, 0);   
end.