26 (edited by vovka3003 2021-08-28 14:51:26)

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

Поделился один раз говнокодом, так его в манускрипты и записали как "отче наш"...
В WinHttpRequest есть встроенная функция ожидания:

...
        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');
        smsquestion.WaitForResponse(5);  

try
    ShowMessage(smsquestion.ResponseText);
    // ...  
except
    ShowMessage('smsquestion error: ' + ExceptionMessage);
end;
... 

P.S. А вообще надо пытаться понять, что пишешь... Совершенствоваться как-то, курить гугл, зубрить маны...

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

Нашел косяк, опять не все перенес вот проблема была... все сп.

P.S. Ну это когда времени завались и основная деятельность это программирование, т.е. крутишся в одной стихии. А когда занимаешься аналогом, то каждый раз вправлять мозги бывает очешь утомительно....

28 (edited by newusr 2021-09-07 10:17:37)

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

Доброго дня. Можно ли при помощи WinHttpRequest проверять доступность к сети интернет? У меня мобильное интернет соединение, часто прерывается и тогда этот объект вызывает ошибку.
---------------------------
OLE error 80020009: WaitForResponse: Ошибка
Source        ::  WinHttp.WinHttpRequest
Description ::  Соединение с сервером было неожиданно прервано
---------------------------
P.S: Функция ping работает только при запуске программы с правами админа.

29 (edited by vovka3003 2021-09-07 10:31:16)

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

newusr wrote:

Доброго дня. Можно ли при помощи WinHttpRequest проверять доступность к сети интернет?.

И что предпримем, если например интернета нет..?

newusr wrote:

..и тогда этот объект вызывает ошибку.
---------------------------
OLE error 80020009: WaitForResponse: Ошибка
Source        ::  WinHttp.WinHttpRequest
Description ::  Соединение с сервером было неожиданно прервано

Судя по всему ваша WinHttp-обертка заканчивается на условии "если есть интернет". По идее надо дописывать логику (циклы, таймауты, перехват и обработка ошибок и т.п.)

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

Я попробовал запустить размещённый в этой теме проект отправки смс и посмотреть что будет если нет интернета, так как в финальной версии строчка проверки доступности сети интернет (при помощи ping) удалена. В своём проекте для проверки я использую это код:

    try
      url:= HTTPGet('https://www.ya.ru',True);
    except
        if ExceptionMessage <> 'HTTP/1.1 404 Not Found' then .....

Посмотрел документацию WinHttpRequest на майкрософт, но с ходу не нашёл ответа, надо глубже изучать, поэтому и возник вопрос

... дописывать логику (циклы, таймауты, перехват и обработка ошибок и т.п.)...

или продолжать использовать приведённый выше код.

31 (edited by vovka3003 2021-09-07 12:49:51)

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

newusr wrote:

Посмотрел документацию WinHttpRequest на майкрософт, но с ходу не нашёл ответа

А откуда ему там взяться? "WinHttpRequest" - это класс. "Отправка смс" - логическая цепочка действий [c использованием класса]. Сначала жмякается логика, потом строится алгоритм, а уже потом - по алгоритму пишется код.

Например:

Вопрос:
    что требуется?
ответ:
    отправить смс.

Вопрос:
    что делаем, если нет инета? -
ответ:
    а). Сохраняем в базу и ждем когда появится
    б). Отменяем отправку совсем, ибо потом уже нет смысла

Вопрос:
    следующую отправку планируем автоматом или вручную?
Ответ:
    а) автоматом
    б) вручную

Вопрос:
    что делаем, если инет появился, но возникла ошибка при отправке?
Ответ:
    а). Сохраняем в базу и ждем когда появится
    б). Отменяем отправку совсем, ибо потом уже нет смысла
    в). Пробуем еще 2 раза с таймаутом в 20 секунд, потом а) или б)..

И так далее...

P.S. В примере выше - исключение нарочито обернуто в ShowMessage, чтобы самостоятельно определить логику или тупо заменить ее на result с текстом "Что-то пошло не так.."

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

Вопросов к алгоритму нет, вопрос по реализации в коде этого самого алгоритма, как проверить есть интернет или нет?
Возможно ли реализовать эту проверку при помощи класса WinHttpRequest или нет?

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

vovka3003 wrote:

...А вообще надо пытаться понять, что пишешь... Совершенствоваться как-то, курить гугл, зубрить маны...

*записывает в блокнотик* курить Гугл...

Визуальное программирование: блог и телеграм-канал.

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

newusr wrote:

Вопросов к алгоритму нет, вопрос по реализации в коде этого самого алгоритма, как проверить есть интернет или нет?
Возможно ли реализовать эту проверку при помощи класса WinHttpRequest или нет?

Зачем проверять..? Какой смысл в лишнем действии?

Как проверить - заяц или зайчиха? Легко - поставил на землю, если побежал - значит заяц, если побежала - значит зайчиха!

К чему это я...:

Нажал "отправить". Если нет интернета - значит смс-ка не уйдет и пиши в except-е, что душе угодно - хоть выход, хоть цикл повтора...

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

vovka3003 wrote:

Зачем проверять..? Какой смысл в лишнем действии?
Нажал "отправить". Если нет интернета - значит смс-ка не уйдет и пиши в except-е, что душе угодно - хоть выход, хоть цикл повтора...

Да в том-то всё и дело, что при отсутствии интернета строчка

smsquestion.WaitForResponse(5);

вызывает ошибку

OLE error 80020009: WaitForResponse: Ошибка
Source        ::  WinHttp.WinHttpRequest
Description ::  Не удается разрешить имя или адрес сервера

и выполнение программы дальше не идёт и до except-а программа не доберётся.
Вот я и думаю, что надо эту ошибку перехватить (как?) чтобы не "вешать" ей программу.
Или у Вас по другому как-то этот класс срабатывает?

36 (edited by vovka3003 2021-09-07 15:10:38)

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

newusr wrote:

и выполнение программы дальше не идёт и до except-а программа не доберётся.

Ну может тогда try надо повыше сдвинуть..? wink

https://i.imgur.com/VKDfTxw.png

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

Ну вот же, где собака была зарыта! Спасибо.

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

Ни как неполучается получить вторую страку строку из json. Постоянно выдает ноль...

        JSONObject := nil;
        JSONObject := TJSONObject(TJSONObject.ParseJSONValue(smsquestion.responsetext));
        if JSONObject <> nil then
        begin
            JSONString := TJSONString(JSONObject.GetPairByName('status_code').JsonValue);
            ShowMessage(JSONString.Value);

            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);
                ShowMessage(JSONString.Value);
            end;

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

vit007 wrote:

Ни как неполучается получить вторую страку строку из json. Постоянно выдает ноль...

        JSONObject := nil;
        JSONObject := TJSONObject(TJSONObject.ParseJSONValue(smsquestion.responsetext));
        if JSONObject <> nil then
        begin
            JSONString := TJSONString(JSONObject.GetPairByName('status_code').JsonValue);
            ShowMessage(JSONString.Value);

            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);
                ShowMessage(JSONString.Value);
            end;

было бы хорошо увидеть сам JSON

40 (edited by vovka3003 2021-09-18 22:45:22)

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

const j =
  '{' +
  '  "status": "OK", ' +
  '  "status_code": 100, ' +
  '  "sms": { ' +
  '        "79205670654": { ' +
  '            "status": "OK", ' +
  '            "status_code": 100, ' +
  '            "sms_id": "000000-10000000" ' +
  '        }, ' + 
  '        "74993221627": { ' +
  '            "status": "ERROR", ' +
  '            "status_code": 207, ' +
  '            "status_text": "На этот номер (или один из номеров) нельзя отправлять сообщения, либо указано более 100 номеров в списке получателей" ' +
  '        } ' + 
  '    } , ' + 
  '    "balance": 4122.56, ' +
  '    "Еще что-нибудь": "\u0410Б\u0412" ' +
  '} ';



function JSON(s_json:string; Path:string):variant;
var sc : variant;
begin
 sc:=CreateOleObject('ScriptControl');
 sc.Language := 'JavaScript';
 result := sc.Eval('('+s_json+')'+Path+';');
 sc := 0;
end;



procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
 ShowMessage(JSON(j,'["status"]'));
 ShowMessage(JSON(j,'["status_code"]'));
 ShowMessage(JSON(j,'["sms"]["79205670654"]["sms_id"]'));
 ShowMessage(JSON(j,'["balance"]'));
 ShowMessage(JSON(j,'["Еще что-нибудь"]'));
 ShowMessage(JSON(j,'["sms"]["74993221627"]["status_text"]'));
end;

begin

end.

41 (edited by vit007 2021-09-20 07:42:50)

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

sibprogsistem, json из примера Sms, причем в примере тоже, у меня, не работает.

function smsAnswer(sdata:string):string;
var
    JSONObject, JSONObjProp, JSONObjProp2: TJSONObject;
    JSONString: TJSONString;
    sD: string;
begin
    try
        ShowMessage(smsquestion.ResponseText);
        //if smsquestion.Status() = 200 then
        //begin

        //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);
            //ShowMessage(JSONString.Value);

            //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);
                ShowMessage(JSONString.Value);
            //end;

             //Коды SMS
             if Pos('100',JSONString.Value) then
             begin
                 //ShowMessage('ОК');
                 JSONString := TJSONString(JSONObject.GetPairByName('balance').JsonValue);

                 //Вывод баланса
                 frmMain.Label4.Caption := JSONString.Value;

                 //Условие на проверку - открыта форма или нет
                 If frmWord.Visible then
                 begin
                     //Запомнить состояние флага
                     SQLExecute('UPDATE SMS SET sms_switch="'+frmWord.CheckBox2.sqlValue+'" WHERE id=1');

                     //Обновить содержимое
                     SQLEXecute('UPDATE SMS SET sms_API="'+frmWord.Memo1.Text+'" WHERE id=1');
                     SQLEXecute('UPDATE SMS SET sms_name="'+frmWord.Edit1.Text+'" WHERE id=1');

                     frmWord.Memo1.Enabled := False;
                     frmWord.Edit1.Enabled := False;
                     frmWord.Button25.Enabled := False;

                     frmMain.GroupBox2.Visible := True;
                     frmAddNew.CheckBox1.Visible := True;
                 end;
             end;
             if Pos('232',JSONString.Value) then ShowMessage('Превышен лимит одинаковых сообщений на этот номер в день');
             if Pos('-1',JSONString.Value) then ShowMessage('Сообщение не найдено');
             if Pos('107',JSONString.Value) then ShowMessage('Не может быть доставлено: неизвестная причина');
             if Pos('108',JSONString.Value) then ShowMessage('Не может быть доставлено: отклонено');
             if Pos('200',JSONString.Value) then
             begin
                ShowMessage('Неправильный API');
                MessageBeep(1); //Звуковой сигнал
                frmWord.Memo1.Text := '';
                frmWord.Memo1.SetFocus;
             end;
             if Pos('201',JSONString.Value) then ShowMessage('Не хватает средств на лицевом счету');
             if Pos('202',JSONString.Value) then ShowMessage('Неправильно указан номер телефона получателя, либо на него нет маршрута');
             if Pos('203',JSONString.Value) then ShowMessage('Нет текста сообщения ');
             if Pos('204',JSONString.Value) then ShowMessage('Имя отправителя не согласовано с администрацией');
             if Pos('209',JSONString.Value) then ShowMessage('Вы добавили этот номер (или один из номеров) в стоп-лист');
             if Pos('220',JSONString.Value) then ShowMessage('Сервис временно недоступен, попробуйте чуть позже');
             if Pos('230',JSONString.Value) then ShowMessage('Превышен общий лимит количества сообщений на этот номер в день');
             if Pos('231',JSONString.Value) then ShowMessage('Превышен лимит одинаковых сообщений на этот номер в минуту');
             if Pos('233',JSONString.Value) then ShowMessage('Превышен лимит отправки повторных сообщений с кодом на этот номер за короткий промежуток времени ("защита от мошенников"), можно отключить в разделе "Настройки")');
             if Pos('301',JSONString.Value) then ShowMessage('Неправильный api_id, либо логин/пароль');
             if Pos('205',JSONString.Value) then ShowMessage('Сообщение слишком длинное (превышает 8 СМС)');
             if Pos('206',JSONString.Value) then ShowMessage('Будет превышен или уже превышен дневной лимит на отправку сообщений ');
             if Pos('207',JSONString.Value) then ShowMessage('На этот номер нет маршрута для доставки сообщений');
             if Pos('302',JSONString.Value) then ShowMessage('Пользователь авторизован, но аккаунт не подтвержден (пользователь не ввел код, присланный в регистрационной смс)');
             if Pos('500',JSONString.Value) then ShowMessage('Ошибка на сервере. Повторите запрос');
           end;
        //end;


    except
    end;
    smsTimer.Enabled:=False;
end;

vovka3003. понимаю, что надо полученное сообщение загонять в константу и оттуда извлекать необходимое?

42 (edited by vovka3003 2021-09-21 16:48:05)

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

vit007 wrote:

vovka3003. понимаю, что надо полученное сообщение загонять в константу и оттуда извлекать необходимое?

константу я привел в пример, чтобы было понятнее, но пуля не достигла цели...

У вас это может выглядеть так:

..
var j:string;
  begin
    j:= smsquestion.ResponseText;
    ShowMessage(JSON(j,'["status"]'));
...

JSON = функция, которая парсит json-содержимое ответа.
j = сам ответ.
["..."], ["..."]["..."], ["..."]["..."]["..."] - способ достать значение из дерева json-объектов.

43 (edited by vovka3003 2021-09-21 17:01:58)

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

vit007 wrote:

sibprogsistem, json из примера Sms...

..if Pos('232',JSONString.Value) then ShowMessage('Превышен лимит одинаковых..

Люди добрые, не надо друг другу по топикам этот 3,14здец перекидывать...

А если "..вы выиграли 232 ляма..!"?



Вот это:

   if Pos('232',JSONString.Value) then ShowMessage('Превышен лимит одинаковых сообщений на этот номер в день');
             if Pos('-1',JSONString.Value) then ShowMessage('Сообщение не найдено');
             if Pos('107',JSONString.Value) then ShowMessage('Не может быть доставлено: неизвестная причина');
             if Pos('108',JSONString.Value) then ShowMessage('Не может быть доставлено: отклонено');
             if Pos('200',JSONString.Value) then
             begin
                ShowMessage('Неправильный API');
                MessageBeep(1); //Звуковой сигнал
                frmWord.Memo1.Text := '';
                frmWord.Memo1.SetFocus;
             end;
             if Pos('201',JSONString.Value) then ShowMessage('Не хватает средств на лицевом счету');
             if Pos('202',JSONString.Value) then ShowMessage('Неправильно указан номер телефона получателя, либо на него нет маршрута');
             if Pos('203',JSONString.Value) then ShowMessage('Нет текста сообщения ');
             if Pos('204',JSONString.Value) then ShowMessage('Имя отправителя не согласовано с администрацией');
             if Pos('209',JSONString.Value) then ShowMessage('Вы добавили этот номер (или один из номеров) в стоп-лист');
             if Pos('220',JSONString.Value) then ShowMessage('Сервис временно недоступен, попробуйте чуть позже');
             if Pos('230',JSONString.Value) then ShowMessage('Превышен общий лимит количества сообщений на этот номер в день');
             if Pos('231',JSONString.Value) then ShowMessage('Превышен лимит одинаковых сообщений на этот номер в минуту');
             if Pos('233',JSONString.Value) then ShowMessage('Превышен лимит отправки повторных сообщений с кодом на этот номер за короткий промежуток времени ("защита от мошенников"), можно отключить в разделе "Настройки")');
             if Pos('301',JSONString.Value) then ShowMessage('Неправильный api_id, либо логин/пароль');
             if Pos('205',JSONString.Value) then ShowMessage('Сообщение слишком длинное (превышает 8 СМС)');
             if Pos('206',JSONString.Value) then ShowMessage('Будет превышен или уже превышен дневной лимит на отправку сообщений ');
             if Pos('207',JSONString.Value) then ShowMessage('На этот номер нет маршрута для доставки сообщений');
             if Pos('302',JSONString.Value) then ShowMessage('Пользователь авторизован, но аккаунт не подтвержден (пользователь не ввел код, присланный в регистрационной смс)');
             if Pos('500',JSONString.Value) then ShowMessage('Ошибка на сервере. Повторите запрос');

равно вот этому:

if JSON(j,'["status"]') <> 'OK' then

ShowMessage(
    'Ошибка отправки!' +#13#10+
    'Код: ' + IntToStr(JSON(j,'["status_code"]')) +#13#10+
    'Текст ошибки: ' + JSON(j,'["status_text"]'))
) ;

44 (edited by vit007 2022-02-05 10:21:09)

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

Опять решил палкой потыкать свой долгострой... Спасибо vovka3003, более красиво и компактно получается. Но вот попрежнему не могу получить вторую строку ответа...

ShowMessage(JSON(j,'["sms"]["'+SMSPhone+'"]["status_code"]'));

Выдает ошибку на функцию JSON

Post's attachments

Attachment icon 2022-02-05_131853.png 19.58 kb, 82 downloads since 2022-02-05 

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

В "SMSPhone" не должно быть ничего кроме цифр без пробелов. Внимательно смотрим скриншот ошибки, сравниваем с примером выше...

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

Странно, но я пробовал вбивать простое значение, чтоб выяснить... нужно маску снимать или нет... Тогда ошибку выдавало и так и так. В этот раз попробовал цикл сделать, как Вы мне предлагали в одной из веток.

procedure frmAddNew_OnShow (Sender: TObject; Action: string);
var
   tel,telx : string;
   i,i2     : Integer;
   arr      : string ='0123456789';
begin
    tel := frmNew.Edit1.Text;
    telx := '';

    for i := 1 to Length(tel) do
    begin
        for i2 := 0 to Length(arr)-1 do
        begin
             if (tel[i] = arr[i2]) then
             begin
                telx := telx + tel[i];
             end;
        end;
     end;
    frmAddNew.Edit1.Text := telx;
end;