1 (edited by sidhillsaid 2016-11-14 07:32:49)

Topic: Доработка скрипта отправки смс.

Здравствуйте, подскажите пожалуйста, возможно ли доработать скрипт отправки смс таким образом:

  • Автоотправка смс через заданый промежуток времени с уже заготовленным текстом.

  • Отправка смс сразу нескольким.

  • Автоотправка смс по очереди (если второй вариант не возможен)

Re: Доработка скрипта отправки смс.

Приветствую.

// выполнение какого либо  дейстия через заданный промежуток времени

const
   period = 10; // промежуток времени в секундах

var
   Timer: TTimer;
   iTimer: integer;

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
begin // запуск таймера
    iTimer := period;
    Timer.Enabled := True;  // Start timer
end;

procedure Form1_OnShow (Sender: string; Action: string);
begin
     Timer := TTimer.Create(nil); // create timer
     Timer.Enabled := False;
     Timer.OnTimer := @OnTimer;  // event procedure
     Timer.Interval := 1000;
end;

procedure Form1_OnClose (Sender: string; Action: string);
begin
    Timer.Free;
end;

procedure OnTimer (Sender: TObject);
begin
    //Form1.Label1.Caption := FormatDateTime('hh:nn:ss', iTimer/86400); // при желании можно вывести обратный отсчет
    Dec(iTimer);
    if iTimer < 0 then
    begin
        // выполнение какого либо действия, например отправка смс
        iTimer := period;
    end;
end;



пример для отправки sms очередью
http://myvisualdatabase.com/forum/misc. … download=1



также многие сервисы по отправке SMS через HTTP запрос позволяют отправлять сообщение сразу нескольким пользователем просто указав телефонные номера в http запросе через разделитель, например этот сервис
http://smsc.ru/api/http/?SE=c74af8a7#send


пример

http://smsc.ru/sys/send.php?login=<login>&psw=<password>&phones=<phones>&mes=<message>

параметр phones
Номер или разделенный запятой или точкой с запятой список номеров мобильных телефонов в международном формате, на которые отправляется сообщение.

Dmitry.

Re: Доработка скрипта отправки смс.

Подскажите, а в данном примере возможно сделать отправку на номера не загруженные из файла, а на номера сохраненные в базе данных?

Re: Доработка скрипта отправки смс.

sidhillsaid wrote:

Подскажите, а в данном примере возможно сделать отправку на номера не загруженные из файла, а на номера сохраненные в базе данных?

Я описал три варианта, о какой примере идет речь?

Dmitry.

Re: Доработка скрипта отправки смс.

DriveSoft wrote:

пример для отправки sms очередью
http://myvisualdatabase.com/forum/misc. … download=1

В этом

Re: Доработка скрипта отправки смс.

sidhillsaid wrote:
DriveSoft wrote:

пример для отправки sms очередью
http://myvisualdatabase.com/forum/misc. … download=1

В этом

Готово.

Post's attachments

Attachment icon SMS_ClickatellCom_bulk_from_db.zip 7.97 kb, 274 downloads since 2016-11-17 

Dmitry.

Re: Доработка скрипта отправки смс.

Возможно я некорректно выразился, а возможно Вы недопоняли...
Смотрите, у меня есть в базе данных таблица Clients, в ней есть поле Number.
Так вот хотелось бы, чтобы список получателей смс формровался (импортировался) автоматически из поля Numbers таблицы Clients.
Надеюсь правильно все объяснил.

Re: Доработка скрипта отправки смс.

sidhillsaid wrote:

Возможно я некорректно выразился, а возможно Вы недопоняли...
Смотрите, у меня есть в базе данных таблица Clients, в ней есть поле Number.
Так вот хотелось бы, чтобы список получателей смс формровался (импортировался) автоматически из поля Numbers таблицы Clients.
Надеюсь правильно все объяснил.

Где формировался? К сожалению не ясно, что конкретно необходимо.

Dmitry.

Re: Доработка скрипта отправки смс.

DriveSoft wrote:
sidhillsaid wrote:

Возможно я некорректно выразился, а возможно Вы недопоняли...
Смотрите, у меня есть в базе данных таблица Clients, в ней есть поле Number.
Так вот хотелось бы, чтобы список получателей смс формровался (импортировался) автоматически из поля Numbers таблицы Clients.
Надеюсь правильно все объяснил.

Где формировался? К сожалению не ясно, что конкретно необходимо.

Извините, тут я немного тупанул. Теперь все работает, но не можете ли Вы сделать подобный пример для второго сервиса? Для турбосмс.

Re: Доработка скрипта отправки смс.

sidhillsaid
Проверьте пожалуйста пример, т.к. нет возможности протестировать отправку.

Post's attachments

Attachment icon SMS_TurboSmsUa_bulk_from_db.zip 6.5 kb, 283 downloads since 2016-12-02 

Dmitry.

Re: Доработка скрипта отправки смс.

Все работает, спасибо!

Re: Доработка скрипта отправки смс.

Derek, Dmitry et al, i greet you all. Can i get a sample project for sending SMS through HTTP

Re: Доработка скрипта отправки смс.

humblelion wrote:

Derek, Dmitry et al, i greet you all. Can i get a sample project for sending SMS through HTTP

//***********************************************************************************************
//-------------------------------------- смс ----------------------------------------------------
//***********************************************************************************************
//***********************************************************************************************
//передача параметров смс сообщения содержащее логин, пороль, имя отправителя, номер, текст смс**
//***********************************************************************************************
//***********************************************************************************************
//передача смс сообщения в зависимости от выбора смс оператора***********************************
//***********************************************************************************************
    function Switchsms(smessage, SMS: string): boolean;
var
    ini : TInifile;
    ClickatellCom :TClickatellCom;
    TurboSmsUa :TTurboSmsUa;
    s, sResult, sLog, SMSPhone, SMSMessage,r,INFO: string;
    url: string;
begin
    ini :=TIniFile.Create(ExtractFilePath (ParamStr (0))+'setting\sms.ini');
    SMSLogin:=ini.ReadString('senderlog','SMSLogin','');  // получаем логин
    SMSPassword:=ini.ReadString('senderlog','SMSPassword','');  // получаем пароль
    SMSAPI_ID:=ini.ReadString('senderlog','SMSAPI_ID','');  // получаем  required
    SMSSender:=ini.ReadString('senderlog','SMSSender','');  // получаем подпись отправителя
    SMSPhone:=SQLEXecute('SELECT telephonClient FROM servise WHERE id=' +frmServiceCen.tgList.sqlValue);  // получаем номер
    SMSMessage:= smessage;  // получаем сообщение
    smst:= SMSPhone;
    stdId:= SQLEXecute('SELECT id FROM servise WHERE id=' +frmServiceCen.tgList.sqlValue);
    try
      //если выбран смс оператор epochta
      if SMS = 'epochta' then
        begin
          url:='http://api.myatompark.com/members/sms/xml.php';
          if not ping('mail.ru')then ShowMessage('нет соединения ') else  begin
          smsquestion:=createoleobject('WinHttp.WinHttpRequest.5.1');
          smsquestion.open('POST', url, true);
          smsquestion.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
          smsquestion.send('<SMS>'+
              '<operations>'+
              '<operation>SEND</operation>'+
              '</operations>'+
              '<authentification>'+
              '<username>'+SMSLogin+'</username>'+
              '<password>'+SMSPassword+'</password>'+
              '</authentification>'+
              '<message>'+
              '<sender>'+SMSSender+'</sender>'+
              '<text>'+SMSMessage+' [UTF-8]</text>'+
              '</message>'+
              '<numbers>'+
              '<number>'+SMSPhone+'</number>'+
              '</numbers>'+
              '</SMS>');

          smsAn:= 'epochta';

          smsTimer:=Ttimer.create(frmServiceCen);
          smsTimer.Enabled:=True;
          smsTimer.Interval:=1000;
          smsTimer.OnTimer:=@smsAnswer;
         end;
        end;
      //если выбран смс оператор SMS.RU
      if SMS = 'SMS.RU' then
         begin
          url:='https://sms.ru/sms/send';
          if not ping(url)then ShowMessage('нет соединения ') else  begin
          smsquestion:=createoleobject('WinHttp.WinHttpRequest.5.1');
          smsquestion.open('POST', url, true);
          smsquestion.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
          smsquestion.send('api_id='+SMSAPI_ID+'&to='+SMSPhone+'&from='+SMSSender+'&msg='+SMSMessage+'&partner_id=265885&json=1');
          smsAn:= 'SMS.RU';

          smsTimer:=Ttimer.create(frmServiceCen);
          smsTimer.Enabled:=True;
          smsTimer.Interval:=1000;
          smsTimer.OnTimer:=@smsAnswer;
          end;
         end;
       //если выбран смс оператор smsc
       if SMS = 'smsc' then
         begin
          url:='https://smsc.ru/sys/send.php';
          if not ping(url)then ShowMessage('нет соединения ') else  begin
          smsquestion:=createoleobject('WinHttp.WinHttpRequest.5.1');
          smsquestion.open('POST', url, true);
          smsquestion.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
          smsquestion.send('login='+HttpEncode(SMSLogin)+'&psw='+HttpEncode(SMSPassword)+'&phones='+HttpEncode(SMSPhone)+'&sender='+SMSSender+'&mes='+SMSMessage);
          smsAn:= 'smsc';

          smsTimer:=Ttimer.create(frmServiceCen);
          smsTimer.Enabled:=True;
          smsTimer.Interval:=1000;
          smsTimer.OnTimer:=@smsAnswer;
          end;
         end;
    finally
        ini.Free;
    end;
end;

function smsAnswer(sdata:string):string;
var
JSONObject, JSONObjProp, JSONObjProp2: TJSONObject;
JSONString: TJSONString;
sD: string = ReplaceStr(smst, '+', '');
begin
  try
    if smsquestion.Status() = 200 then
     begin
       if smsAn = 'epochta' then begin
           if Pos('<status>1</status>', smsquestion.responsetext) then SQLEXecute('UPDATE servise SET smsout="1" WHERE id='+stdId) ;
           if Pos('<status>-1</status>', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x75', 'Неправильный логин и/или пароль'));
           if Pos('<status>-2</status>', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x76', 'Неправильный формат XML')) ;
           if Pos('<status>-3</status>', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x77', 'Недостаточно кредитов на аккаунте пользователя ')) ;
           if Pos('<status>-4</status>', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x78', 'Нет верных номеров получателей')) ;
           if Pos('<status>-5</status>', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x79', 'Неверный текст')) ;
           if Pos('<status>-7</status>', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x80', 'Ошибка в имени отправителя ')) ;
      end;
       if smsAn = 'SMS.RU' then begin
         JSONObject := nil;
         JSONObject:=TJSONObject(TJSONObject.ParseJSONValue(smsquestion.responsetext));
        if JSONObject <> nil then
          begin
             JSONString := TJSONString(JSONObject.GetPairByName('status_code').JsonValue);
             if Pos('100',JSONString.Value) then begin
             JSONObjProp := TJSONObject(JSONObject.GetPairByName('sms').JsonValue);
             JSONObjProp2 := TJSONObject( JSONObjProp.GetPairByName(sD).JsonValue);
             JSONString := TJSONString(JSONObjProp2.GetPairByName('status_code').JsonValue);
             end;
             if Pos('100',JSONString.Value) then SQLEXecute('UPDATE servise SET smsout="1" WHERE id='+stdId);
             if Pos('232',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x80', 'Превышен лимит одинаковых сообщений на этот номер в день'));
             if Pos('-1',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x81', 'Сообщение не найдено'));
             if Pos('107',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x82', 'Не может быть доставлено: неизвестная причина'));
             if Pos('108',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x83', 'Не может быть доставлено: отклонено'));
             if Pos('200',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x84', 'Неправильный api_id'));
             if Pos('201',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x85', 'Не хватает средств на лицевом счету'));
             if Pos('202',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x86', 'Неправильно указан номер телефона получателя, либо на него нет маршрута'));
             if Pos('203',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x87', 'Нет текста сообщения '));
             if Pos('204',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x88', 'Имя отправителя не согласовано с администрацией'));
             if Pos('209',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x89', 'Вы добавили этот номер (или один из номеров) в стоп-лист'));
             if Pos('220',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x90', 'Сервис временно недоступен, попробуйте чуть позже'));
             if Pos('230',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x91', 'Превышен общий лимит количества сообщений на этот номер в день'));
             if Pos('231',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x92', 'Превышен лимит одинаковых сообщений на этот номер в минуту'));
             if Pos('233',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x93', 'Превышен лимит отправки повторных сообщений с кодом на этот номер за короткий промежуток времени ("защита от мошенников"), можно отключить в разделе "Настройки")'));
             if Pos('301',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x94', 'Неправильный api_id, либо логин/пароль'));
             if Pos('205',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x95', 'Сообщение слишком длинное (превышает 8 СМС)'));
             if Pos('206',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x96', 'Будет превышен или уже превышен дневной лимит на отправку сообщений '));
             if Pos('207',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x97', 'На этот номер нет маршрута для доставки сообщений'));
             if Pos('302',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x98', 'Пользователь авторизован, но аккаунт не подтвержден (пользователь не ввел код, присланный в регистрационной смс)'));
             if Pos('500',JSONString.Value) then ShowMessage(langIniG.ReadString('message','00x99', 'Ошибка на сервере. Повторите запрос'));
           end;
          end;
        if smsAn = 'smsc' then begin
           if Pos('OK', smsquestion.responsetext) then SQLEXecute('UPDATE servise SET smsout="1" WHERE id='+stdId) ;
           if Pos('ERROR = 1 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x100', 'Ошибка в параметрах')) ;
           if Pos('ERROR = 2 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x101', 'Неверный логин или пароль')) ;
           if Pos('ERROR = 3 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x102', 'Недостаточно средств на счете Клиента')) ;
           if Pos('ERROR = 4 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x103', 'IP-адрес временно заблокирован из-за частых ошибок в запросах')) ;
           if Pos('ERROR = 5 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x104', 'Неверный формат даты')) ;
           if Pos('ERROR = 6 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x105', 'Сообщение запрещено (по тексту или по имени отправителя)')) ;
           if Pos('ERROR = 7 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x106', 'Неверный формат номера телефона')) ;
           if Pos('ERROR = 8 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x107', 'Сообщение на указанный номер не может быть доставлено')) ;
           if Pos('ERROR = 9 ', smsquestion.responsetext) then ShowMessage(langIniG.ReadString('message','00x108', 'Отправка более одного одинакового запроса на передачу SMS-сообщения в течение минуты')) ;
      end;
     end;
   except
   FrmServiceCen.lLogUser.Caption:='Передача СМС сообщения ';
 end;
 frmServiceCen.tgList.dbUpdate;
 smsTimer.Enabled:=False;
end;

нет времени вырезать из проекта...

Re: Доработка скрипта отправки смс.

Thank you so much sibprogsistem for the script, i appreciate your kind gesture. Can you send an example of how to use the script?

Re: Доработка скрипта отправки смс.

Пожалуйста, пришлите мне пример проекта по отправке SMS с использованием HTTP

Re: Доработка скрипта отправки смс.

А какой точно нужен метод, Post или Get


Если Get, то просто формируете текстовую URL строку, пример

var
   sms, SMS_API, tel: string;
begin
   sms := 'Message';
   sms := HTTPEncode(sms);

   tel := '555555555';
   SMS_API := 'api key';
   HTTPGet('https://sms.ru/sms/send?api_id='+SMS_API+'&to='+tel+'&msg='+sms+'&json=1');


с помощью метода Post

var
   sms, SMS_API, tel: string;
   slParam: TStringList;
begin
   sms := 'Message';
   tel := '555555555';
   SMS_API := 'api key';

   slParam := TStringList.Create;
   slParam.Add('api_id='+SMS_API);
   slParam.Add('text='+sms);
   slParam.Add('to='+tel);
   slParam.Add('json=1');
   HTTPPost('http://sms.ru/sms/send', slParam);
   slParam.Free;
Dmitry.

Re: Доработка скрипта отправки смс.

humblelion wrote:

Пожалуйста, пришлите мне пример проекта по отправке SMS с использованием HTTP

Post's attachments

Attachment icon cmc.7z 8.88 kb, 216 downloads since 2019-09-20 

Re: Доработка скрипта отправки смс.

sibprogsistem wrote:
humblelion wrote:

Пожалуйста, пришлите мне пример проекта по отправке SMS с использованием HTTP

God richly bless you