Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Алексей Пикуров
Скрипт "навешивается" на событие OnPrivateRequest на сервере. Работает с версий MyChat 8.3.4 и выше.

user-websupport-info.png
Информация про подключение пользователя WebSupport в MyChat (IP, город, браузер)
user-websupport-info.png (31.06 КБ) Просмотров: 6441

Код: Выделить всё
function OnPrivateRequest(iCID, iUIN, iUINTo, iRole, iRoleReciever, iTask: integer): boolean;
var
  s,
  sCountry, sCity, sGeoIP,
  sIP,                            // remote user IP address
  sWEBSupportBrowserInfo,         // WEB-browser info
  sWEBSupportRefLink,             // reflink
  sWEBSupportsSysLanguage,        // browser locale language
  sWEBSupportsPlatformOS: string; // user's operation system
  iCIDTo: integer;
begin
  SetScriptTimeOut(10000);
 
    if (mGetRoleNameByID(iRole) = 'WEB guests') and mIsUINOnline(iUINTo) then begin
      sIP                     := mGetCIDAttribute(iCID, 'IP');
      sWEBSupportBrowserInfo  := mGetCIDAttribute(iCID, 'UserAgent');
      sWEBSupportRefLink      := mGetCIDAttribute(iCID, 'Reflink');
      sWEBSupportsSysLanguage := mGetCIDAttribute(iCID, 'Lang');
      sWEBSupportsPlatformOS  := mGetCIDAttribute(iCID, 'OS');
   
      s := '---------------' + CRLF +
           '-=WEB Support=-' + CRLF + CRLF +
           'IP: ' + sIP;
     
        if length(sWEBSupportBrowserInfo) > 0 then s := s + CRLF + 'Browser: ' + sWEBSupportBrowserInfo + CRLF;
        if length(sWEBSupportRefLink) > 0 then s := s + CRLF + 'Reflink: ' + sWEBSupportRefLink;
        if length(sWEBSupportsSysLanguage) > 0 then s := s + CRLF + 'System language: ' + sWEBSupportsSysLanguage;
        if length(sWEBSupportsPlatformOS) > 0 then s := s + CRLF + 'OS: ' + sWEBSupportsPlatformOS;
         
      sGeoIP   := GeoIPGetQuickInfo(sIP);
      sCountry := Fetch(sGeoIP, '|');
      sCity    := sGeoIP;
       
        if length(sCountry) > 0 then begin
          sGeoIP := sCountry;
           
            if length(sCity) > 0 then sGeoIP := sGeoIP + ', ' + sCity;
             
          s := s + CRLF + CRLF + sGeoIP; 
        end else sGeoIP := ''; 
     
      mSendPrivateMessage(iUIN, iUINTo, s, 21);
 
      s := mGetCIDSByUINAndClientType(iUINTo, 'win32');
       
        while length(s) > 0 do begin
          iCIDTo := StrToInt(Fetch(s, ','));
          mSendCustomMsgToClientConsoleByCID(iCIDTo, 'WEB support session from UIN ' + inttostr(iUIN), 'newmsg', false, true, 78);
        end; 
    end;

  result := true;
end;

begin

end.

Справка: https://nsoft-s.com/mcserverhelp/index. ... equest.htm
Аватара пользователя
Алексей Пикуров
Обновлено 17 января 2021 года.

Функция mGetUserCID стала deprecated в связи с мультилогинами, скрипт переделан. Уведомления стали приходить в консоль только для win32-приложений. Само приватное сообщение генерируется для всех "инкарнаций" оператора web-поддержки.
Аватара пользователя
SergeyUAL
Здравствуйте, где можно глянуть новый скрипт?
Аватара пользователя
Алексей Пикуров
На два сообщения выше.
Аватара пользователя
SergeyUAL
Здравствуйте.

Скрипт заработал. Только вместо IP клиента, пишет IP шлюза в офисе.

geo.png
geo.png (19.5 КБ) Просмотров: 6197
Аватара пользователя
Алексей Пикуров
Это логично. Он никак не узнает локальный IP, за NAT все IP теряются.
Аватара пользователя
SergeyUAL
Но ведь еще летом все работало:

2021-03-30_9-14-42.png
2021-03-30_9-14-42.png (21.85 КБ) Просмотров: 6196
Аватара пользователя
Алексей Пикуров
Как у вас организована сеть? Сервер MyChat находится в офисе в локальной сети за шлюзом?
Аватара пользователя
SergeyUAL
Да. Возможно какой-то порт необходимо пробросить.
Аватара пользователя
Алексей Пикуров
И эта схема не менялась у вас, у сервера MyChat не было реального IP, я правильно понимаю?
Аватара пользователя
SergeyUAL
ничего не менялось уже несколько лет
Аватара пользователя
Алексей Пикуров
Ок, я посмотрю, что там может быть.
Аватара пользователя
FenixYkt
у меня функция
sWEBSupportRefLink := mGetCIDAttribute(iCID, 'Reflink')
возвращает только основной линк сайта без конкретики страницы, откуда был вызван чат

результат
---------------
-=WEB Support=-

IP: 188.xxx.xxx.xxx
Browser: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0

Reflink: https://www.xxxxx.ru/

и всё.
Аватара пользователя
Алексей Пикуров
Тут всё зависит от того, отдал браузер пользователя эту инфу или нет. Бывает по-разному.
Аватара пользователя
FenixYkt
проверил на куче браузеров
Опера, Хром, Рыжая Лиса - рефлинк основного сайта без страниц
Эдж и эксплорер - вообще ничего не показывает - пустой рефлинк.

Так же не должно быть. Ведь те же счетчики и яваскрипты нормально отслеживают рефлинки.
Значит что-то с реализацией функции. Я не прав?
Аватара пользователя
Алексей Пикуров
Не знаю. Надо проверять.
Аватара пользователя
Алексей Пикуров
Покажите скрин с вашего кода, пожалуйста, в редакторе.
Аватара пользователя
FenixYkt
код скрипта или то, что приходит в клиентку?
Аватара пользователя
Алексей Пикуров
Скриншот админки с открытым скриптом.
Аватара пользователя
FenixYkt
внутри
Вложения
Снимок20.PNG
Снимок20.PNG (380.2 КБ) Просмотров: 6170
Аватара пользователя
Алексей Пикуров
Вроде всё ок. Только почему не 8.6 версия? :) Старайтесь обновляться оперативно, не затягивайте.

Я проверю и отпишу в этой теме.
Аватара пользователя
FenixYkt
обновлю, каюсь, закрутился :)
Аватара пользователя
Алексей Пикуров
SergeyUAL
Проверил только что, приходит реальный IP клиента, всё чётко.

FenixYkt
Есть косяк с повторным открытием чата при переключении между страницами, это решаем. Насчёт рефлинка — ищем проблему.
Аватара пользователя
Алексей Пикуров
Исправлено, ожидайте свежую сборку.