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

  • Автор темы aqwapaq
  • Дата начала
A

aqwapaq

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

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

Код:
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) и её можно было запускать из командной строки.
 
D
#2
Сделать консольное приложение и пускать его ...
 
A

aqwapaq

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




Код:
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. Создал консольное приложение
Тоже не работает:


Код:
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.
 
A

aqwapaq

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

[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.
Код:
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.


Код:
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




Где ошибка?
 
A

aqwapaq

#5
<!--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
 
A

aqwapaq

#6
<!--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 ругается на другое?
 
A

aqwapaq

#7
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)


и подсветка все той же строки
 
A

aqwapaq

#8
<!--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); нет
 
A

aqwapaq

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

<!--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
Так?
 
A

aqwapaq

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

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

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

Код:
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
 
A

aqwapaq

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

aqwapaq

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

Код:
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. В изучении любой науки практика для меня важнее всего
 
Z
#13
Для: aqwapaq
Хм..., странный метод изучения. Так у тебя долго не получится, ровно на столько - на сколько хватит терпения у участников форума, а оно не безгранично, имхо.
З.Ы. Тут есть еще один практик - Дима Ламо. Чтойто он затих.
 
A

aqwapaq

#14
<!--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)

=)