如何修改TWebBrowser提交到服务器上的post数据(200分)

  • 主题发起人 主题发起人 fingerwin
  • 开始时间 开始时间
F

fingerwin

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个自动登陆的程序,但服务器上有检查使用程序登陆的机制,根据我对http抓包分析.他们的检查是应该是通过提交代码的Onbeforepaste事件把鼠标点击的坐标一起提交,因为我的程序里直接使用了olevariant的click方法,所以提交上去的坐标都是(0,0),所以我需要在BeforeNavigate2里对postdata进行修改.
procedure TFrm_Main.WebBrowser1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var
iLoop:Integer;
PostStr:String;
x,y:Integer;//点击坐标
newpost:OleVariant;
Rx,Ry:Integer;
begin
Randomize;
Rx:=Random(73);
Ry:=Random(23);
PostStr:='';
x:=-1;
y:=-1;
if Length(PostData)> 0 then
begin
for iLoop:=0 to VarArrayHighBound(PostData,1) do
begin
PostStr:=PostStr+Chr(Byte(PostData[iLoop]));
end;
if (Pos('.x=',PostStr)> 0) and (Pos('.y=',PostStr)> 0) then
begin
PostStr:=AnsiReplaceText(PostStr,'.x=0','.x='+inttostr(Rx));
PostStr:=AnsiReplaceText(PostStr,'.y=0','.y='+inttostr(Ry));
end;
newpost := VarArrayCreate([0, (Length(PostStr) - 1)], varByte);
// 填充数据
for iLoop := 0 to Length(PostStr) - 1 do
newpost[iLoop] := Ord(PostStr[iLoop + 1]);
PostData:= newpost;
//showmessage(PostStr);
end;
end;
通过以上代码修改postdata成功,并且再转过来显示已经修改的数据,但通过对http抓包post数据,还是提交的原来的数据.
 
不知以下代码对你有没有帮助:
uses MSHTML;
// function to execute a script function
function ExecuteScript(WebBrowser: TWebBrowser; script: string; language: string = 'javascript'): Boolean;
var
doc: IHTMLDocument2;
win: IHTMLWindow2;
Olelanguage: OleVariant;
begin
Result := False;
if WebBrowser <> nil then
begin
try
doc := IHTMLDocument2(WebBrowser.Document);
win := doc.parentWindow;
if win <> nil then
begin
try
Olelanguage := language;
win.ExecScript(script, Olelanguage);
Result := True;
finally
win := nil;
end;
end;
finally
doc := nil;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://fundf10.eastmoney.com/jjjz_090001.html');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
O: OleVariant;
begin
O := WebBrowser1.OleObject.Document.all.item('k', 0);
O.value := '260104';
O := WebBrowser1.OleObject.Document.all.item('a', 0);
O.value := '2008-1-1';
O := WebBrowser1.OleObject.Document.all.item('b', 0);
O.value := '2008-1-31';
ExecuteScript(WebBrowser1,'jisuan04();');
end;
 
你的代码是执行script函数的,这跟我的要求对不上啊,我是要修改postdata,它提交上去的坐标是由点击事件带上去的啊.
 
自己顶下
 
你说的:Onbeforepaste事件指的是网页中的事件吗?服务器是如何检查的?我觉得应该是在客户端用JS函数进行判断并提交到服务器的,你应该找出那个函数,就可以相应进行处理了。
 
这个事件是自动的,通过代码对ole直接做不了修改
 
知道您的意思了,客户端有个OLE控件吧?那是不能修改了。
“通过以上代码修改postdata成功,并且再转过来显示已经修改的数据,但通过对http抓包post数据,还是提交的原来的数据.”这句中的“并且再转过来显示已经修改的数据”我搞不明白意思。
 
后退
顶部