Как оформить автоматическое выполнение Post запроса?

Тема в разделе "Delphi - Сети", создана пользователем aqwapaq, 12 фев 2008.

  1. aqwapaq

    aqwapaq Гость

    Столкнулся с такой проблемой:
    Не получается написать bat файл который бы смог автоматизировать (посылку серверу POST запроса) т.к в нижеприведенном коде требуется непосредственное взаимодействие пользователя с формой. Помогите составить код, скомпилировав который можно получить exe (который в свою очередь можно выполнить из CMD-> тем самым послав POST запрос).

    А вот код программки (которая с формой):

    Код (Text):
    unit Unit2;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, IdCustomTransparentProxy, IdSocks, IdHTTP, IdBaseComponent,
    IdComponent, IdTCPConnection, IdTCPClient, StdCtrls;

    type
    TForm2 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);

    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form2: TForm2;
    response :TStringList;
    POSTData: TStringList;

    implementation

    {$R *.dfm}

    procedure TForm2.Button1Click(Sender: TObject);
    begin
    POSTData := TStringList.create;
    POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
    IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);
    end;

    end.
    PS. Программка должна выполняться скрытно (без GUI) и её можно было запускать из командной строки.
     
  2. DZX

    DZX Гость

    Сделать консольное приложение и пускать его ...
     
  3. aqwapaq

    aqwapaq Гость

    Создал VCL. Удалил форму.
    Почему не работает так составленный код?




    Код (Text):
    program Phttp5435;

    uses
    Forms, IdHTTP,IdComponent,SysUtils, IdBaseComponent;

    {$R *.res}
    var
    POSTData: TStringList;
    begin
    POSTData := TStringList.create;
    POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
    IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);
    end;
    end.

    2. Создал консольное приложение
    Тоже не работает:


    Код (Text):
    program Project1;

    {$APPTYPE CONSOLE}

    uses
    SysUtils, IdHTTP,IdComponent;

    var
    POSTData: TStringList;

    begin
    try
    {$R *.res}

    POSTData := TStringList.create;
    POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
    IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


    except
    on E:Exception do
    Writeln(E.Classname, ': ', E.Message);
    end;
    end.
     
  4. aqwapaq

    aqwapaq Гость

    Во втором случае:

    [DCC Error] Project1.dpr(9): E2003 Undeclared identifier: 'TStringList'
    [DCC Error] Project1.dpr(15): E2066 Missing operator or semicolon
    [DCC Error] Project1.dpr(16): E2066 Missing operator or semicolon
    [DCC Error] Project1.dpr(17): E2003 Undeclared identifier: 'IdHTTP1'

    ->Как я понимаю надо обявить 'TStringList' и 'IdHTTP1' но в type и в var их не получается обявить

    1.
    Код (Text):
    program Project1;

    {$APPTYPE CONSOLE}

    uses
    SysUtils, IdHTTP,IdComponent;

    type
    TStringList = class(TStrings);
    IdHTTP1: TIdHTTP;


    var
    POSTData: TStringList;


    begin
    try
    {$R *.res}

    POSTData := TStringList.create;
    POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
    IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


    except
    on E:Exception do
    Writeln(E.Classname, ': ', E.Message);
    end;
    end.
    errors:
    [DCC Error] Project1.dpr(9): E2003 Undeclared identifier: 'TStrings'
    [DCC Error] Project1.dpr(10): E2029 '=' expected but ':' found
    [DCC Error] Project1.dpr(22): E2003 Undeclared identifier: 'add'\
    [DCC Error] Project1.dpr(23): E2250 There is no overloaded version of 'Post' that can be called with these arguments


    2.


    Код (Text):
    program Project1;

    {$APPTYPE CONSOLE}

    uses
    SysUtils, IdHTTP,IdComponent;

    var
    TStringList = class(TStrings);
    IdHTTP1: TIdHTTP;
    POSTData: TStringList;


    begin
    try
    {$R *.res}

    POSTData := TStringList.create;
    POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
    IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


    except
    on E:Exception do
    Writeln(E.Classname, ': ', E.Message);
    end;
    end.
    errors:

    [DCC Error] Project1.dpr(9): E2029 ',' or ':' expected but '=' found
    [DCC Error] Project1.dpr(9): E2021 Class type required
    [DCC Error] Project1.dpr(11): E2007 Constant or type identifier expected
    [DCC Error] Project1.dpr(19): E2066 Missing operator or semicolon
    [DCC Error] Project1.dpr(20): E2250 There is no overloaded version of 'Post' that can be called with these arguments




    Где ошибка?
     
  5. aqwapaq

    aqwapaq Гость

    <!--QuoteBegin-sax_ol+12:02:2008, 10:51 -->
    <span class="vbquote">(sax_ol @ 12:02:2008, 10:51 )</span><!--QuoteEBegin-->кейворд uses вам знаком?

    [snapback]97704" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Вообщето знаком. Но причем он тут?
    Все что используется уже есть в uses(SysUtils, IdHTTP,IdComponent)

    Если вы о том, что переместить TStringList в uses то это тоже заканчивается ошибкой:
    [DCC Error] Project1.dpr(6): F1026 File not found: 'TStringList.dcu'

    Наверное чтото другое ожидает Dephi.

    Вот так вроде хорошо: uses classes
     
  6. aqwapaq

    aqwapaq Гость

    <!--QuoteBegin-sax_ol+12:02:2008, 11:06 -->
    <span class="vbquote">(sax_ol @ 12:02:2008, 11:06 )</span><!--QuoteEBegin-->Поставте курсор на TStringList, нажмите F1, откроется справка, под словом Unit найдете модуль, который надо добавить в uses. и т.д.
    [snapback]97710" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Thx!

    после запуска:
    First chance exception at $7C812A7B. Exception class EAccessViolation with message 'Access violation at address 0043666C in module 'cscasc.exe'. Read of address 00000128'. Process cscasc.exe (10820)


    и подсвечена строка:

    IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


    Неужели консольное приложение не может корректно работать с Indy?
    Или Delphi ругается на другое?
     
  7. aqwapaq

    aqwapaq Гость

    type
    TIdHTTP = class(TIdCustomHTTP);

    Вроде правильно объявил.
    Так почему же опять:

    First chance exception at $7C812A7B. Exception class EAccessViolation with message 'Access violation at address 0043666C in module 'cscasc.exe'. Read of address 0B89F39C'. Process cscasc.exe (2408)


    и подсветка все той же строки
     
  8. aqwapaq

    aqwapaq Гость

    <!--QuoteBegin-sax_ol+12:02:2008, 11:35 -->
    <span class="vbquote">(sax_ol @ 12:02:2008, 11:35 )</span><!--QuoteEBegin-->это ботва ее надо убрать. ну и тоже самое с TStringList = class(TStrings);
    вы знаете что такое создать объект (экземпляр) класса?
    [snapback]97729" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    1. Как тогда должен выглядеть код?
    Как и где обявлять?
    2. Может и знаю- видел в исходниках, но лучшей идеи (ботвы=) ) чем TIdHTTP = class(TIdCustomHTTP); нет
     
  9. aqwapaq

    aqwapaq Гость

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

    <!--QuoteBegin-sax_ol+12:02:2008, 11:35 -->
    <span class="vbquote">(sax_ol @ 12:02:2008, 11:35 )</span><!--QuoteEBegin-->вы знаете что такое создать объект (экземпляр) класса?

    [snapback]97729" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Возможно что то типа ObjectName.Create
    Так?
     
  10. aqwapaq

    aqwapaq Гость

    На самом деле статьи, FAQ и Manual'ы по созданию объектов я читал не раз. Однако не применял на практике поэтому было интерестно увидеть правильный вариант, а не перелистывать бессмысленно груду "макулатуры". Спасибо за объяснение- теперь запускается без ошибок.
    Только один большой нюанс- Post requet так и не отправляется при запуске/исполнении программы.

    Чем такое может быть вызвано?
    Разве при старте не инициализируется функция запроса?
    PS. Нужен ли в консольных приложениях TYPE? Если да, то для чего?

    Вот получившийся код:

    Код (Text):
    program cscasc;

    {$APPTYPE CONSOLE}

    uses
    SysUtils,
    IdHTTP,
    IdComponent,
    classes;
    // type
    //TIdHTTP = class(TIdCustomHTTP);

    var
    IdHTTP1: TIdHTTP;
    POSTData: TStringList;


    begin
    POSTData := TStringList.Create;
    //IdHTTP1:= IdHTTP;
    try
    {$R *.res}

    POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
    IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


    finally
    POSTData.Free;

    end;
    end.

    Такой ERROR:

    [DCC Warning] cscasc.dpr(25): W1036 Variable 'IdHTTP1' might not have been initialized
     
  11. aqwapaq

    aqwapaq Гость

    Так где ошибка или в чем проблема? Почему переменная 'IdHTTP1' не запускается-> следственно не выполняется нужная функция?
     
  12. aqwapaq

    aqwapaq Гость

    Все работает хорошо!
    Большое спасибо за урок и мой респект sax_ol!!!=)
    Вот работоспособный код:

    Код (Text):
    program cscasc;

    {$APPTYPE CONSOLE}

    uses
    SysUtils,
    IdHTTP,
    IdComponent,
    classes;



    var
    IdHTTP1: TIdHTTP;
    POSTData: TStringList;


    begin
    POSTData := TStringList.Create;
    IdHTTP1:= TIdHTTP.Create(nil);
    //IdHTTP1:= IdHTTP;
    try
    {$R *.res}

    POSTData.add('modem_log_st_poe=&hang_up_st_poe=Disconnect&message=');
    IdHTTP1.Post('http://192.168.0.1/Status.htm/st_poe.cgi' ,POSTData);


    finally
    POSTData.Free;
    IdHTTP1.Free;
    end;
    end.
    PS. В изучении любой науки практика для меня важнее всего
     
  13. zubr

    zubr Гость

    Для: aqwapaq
    Хм..., странный метод изучения. Так у тебя долго не получится, ровно на столько - на сколько хватит терпения у участников форума, а оно не безгранично, имхо.
    З.Ы. Тут есть еще один практик - Дима Ламо. Чтойто он затих.
     
  14. aqwapaq

    aqwapaq Гость

    <!--QuoteBegin-zubr+12:02:2008, 17:32 -->
    <span class="vbquote">(zubr @ 12:02:2008, 17:32 )</span><!--QuoteEBegin-->Хм..., странный метод изучения. Так у тебя долго не получится, ровно на столько - на сколько хватит терпения у участников форума, а оно не безгранично, имхо.
    [snapback]97814" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Согласен. Однако причина создания этой темы проста:
    1. В короткие сроки надо было автоматизировать процесс (машины долго простаивать не могут)
    2. Практически программа была написана за исключением такой мелочи которую я не знал как реализовать (ничего похожего не удалось найти ни в google ни в тех. литературе)

    Начинал как не банально, но с AutoIt (скрипт языка)
    Был вариант:
    Автоматически нажать на кнопку/control в этой программке (та программы которая с формой ).
    Это было успешно выполненно но выглядело полным извращением.
    Тогда решил это все оформить грамотно с помощью Delphi.

    Думаю такие идеи вы приветствуете?

    PS. Кому интересно могу выложить код скрипта AutoIT который запускает эту програмку-> нажимает на button и выходит. (Этому кривому методу пришел на помощь полноценный код Delphi)

    =)
     
Загрузка...

Поделиться этой страницей