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, 515 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, 526 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, 497 downloads since 2019-09-20 

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

sibprogsistem wrote:
humblelion wrote:

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

God richly bless you

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

sibprogsistem, Посмотрел, Ваш проект по СМС, и некак не получается отправить, все время пишет "нет соединения"...

20 (edited by sibprogsistem 2021-08-27 09:08:10)

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

vit007 wrote:

sibprogsistem, Посмотрел, Ваш проект по СМС, и некак не получается отправить, все время пишет "нет соединения"...

нужно было убрать 

if not ping(url)then ShowMessage('нет соединения ') else  begin
Post's attachments

Attachment icon tess.rar 10.73 kb, 217 downloads since 2021-08-27 

21 (edited by vit007 2021-08-27 13:41:19)

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

Вроде заработало, просто не мгновенно пришло.

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

А вот объясните, как прихотят уведомления в обратку... ?

23 (edited by sibprogsistem 2021-08-27 20:26:30)

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

vit007 wrote:

А вот объясните, как прихотят уведомления в обратку... ?

если просто, то..

создаем объект

smsquestion:=createoleobject('WinHttp.WinHttpRequest.5.1'); 

и присваиваем ему различные значения
объект передает данные серверу по УРЛ адресу и получает ответ ..

со статусом обработки запроса smsquestion.Status  это может быть 200,400,403,402, 505 и тд..

у каждого статуса свое значение, 200 -  успешно

далее в smsquestion.responsetext содержится сам текст ответа..

24 (edited by vit007 2021-08-28 09:49:31)

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

Как выдернуть значение отсюда

        url:='https://sms.ru/my/balance';
        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+'&json=1');
        //smsAn:= 'SMS.RU';

        //smsTimer:=Ttimer.create(Form1);
        //smsTimer.Enabled:=True;
        //smsTimer.Interval:=1000;
        //smsTimer.OnTimer:=@smsAnswer;

        JSONObject:=TJSONObject(TJSONObject.ParseJSONValue(smsquestion.responsetext));
        JSONString := TJSONString(JSONObject.GetPairByName('balance').JsonValue);

        form1.Edit6.Text := JSONString;

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

vit007 wrote:

Как выдернуть значение отсюда

        url:='https://sms.ru/my/balance';
        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+'&json=1');
        //smsAn:= 'SMS.RU';

        //smsTimer:=Ttimer.create(Form1);
        //smsTimer.Enabled:=True;
        //smsTimer.Interval:=1000;
        //smsTimer.OnTimer:=@smsAnswer;

        JSONObject:=TJSONObject(TJSONObject.ParseJSONValue(smsquestion.responsetext));
        JSONString := TJSONString(JSONObject.GetPairByName('balance').JsonValue);

        form1.Edit6.Text := JSONString;

за это отвечает процедура smsAnswer
текст ответа находится здесь  smsquestion.responsetext



структура  JSON  http://www.json.org/json-ru.html