高难!!怎样在WebBroser中,找到恰当的图片,在该图片上模拟鼠标右键,弹出快键菜单,将该图片另存为一个BMP文件?(50分)

  • 主题发起人 主题发起人 1Fuyi
  • 开始时间 开始时间
1

1Fuyi

Unregistered / Unconfirmed
GUEST, unregistred user!
高难!!怎样在WebBroser中,找到恰当的图片,
在该图片上模拟鼠标右键,弹出快键菜单,将该图片另存为一个BMP文件?

我们在程序中需要保存该图片,但该图片不是指定的图片
(指定图片的代码如:<img src="image/t1.gif" width="358" height="5">)

而该图片是随机生成的,它的的代码如下
<Img name="extimg" width=40 height=18>
<script>
form.extimg.src = "check.inc.php?m=" + Math.random();
</script>
它的图片是在实时(程序运行)生成的,

我的任务是,将此图片保存下来,
我曾用保存整个页面的方法来保存该页面,但是保后的IE页面中该图片没有图像

最后我想用以下方法来将此图片保存
在人机交互的情况下
可在该图片上右键单击 弹出快右键菜单后
可选择"图片另存为" 将图片保存到特定的地方

现在的问题就是怎么把手工操作用计算机来模拟

1.在HTML页面中我能找到该图片
2.但是 怎么将鼠标移到图片
3.模拟右键弹出好办
4.另一个问题怎样选 "图片另存为" 子菜单项
 
只是为了保存图片的话,还是查找html文件中的 img src 吧。
 
才给50分。加个500分,我就给你提示。
 
To: LuJuhe
你没仔细看题呀,img src 是一个随机数,常规方式
DownloadFromUrl()将图片下载后,不能读出,只能考滤采用另存为BMP图片的方法.

To: 5291
分没问题,只要你的方法能起作用,解决问题.
 
<img xxxxx xxxxx src=xxxxx>
不管x是什么,总得有这么一句才有图象吧。我的意思,就是分析这一句html,找到正确的地址。
 
var
p,p1 : TPoint;
doc : IHTMLDocument2;
e : IHTMLElement;
img : IHTMLImgElement;
begin
doc := WebBrowser1.Document as IHTMLDocument2;
GetCursorPos(p);
p1 := p;
P := WebBrowser1.ScreenToClient(p);
e := doc.elementFromPoint(p.X,p.Y);
if e.tagName = 'IMG' then
begin
bmpSrc := '';
img := e as IHTMLImgElement;
tmp:= UpperCase(img.src);
Delete(tmp,1,Length('file:///'));
while Pos('/',tmp) <> 0 do
ReplaceString(tmp,'/','/');
while Pos('%20',tmp) <> 0 do
ReplaceString(tmp,'%20',' ');
bmpSrc := tmp; //图片文件路径
PopupMenu2.Popup(p1.X,p1.Y);
end;

end;
 
To: LuJuhe

而该图片是随机生成的,它的的代码如下
<Img name="extimg" width=40 height=18>
<script>
form.extimg.src = "check.inc.php?m=" + Math.random();
</script>
它的图片是在实时(程序运行)生成的,
 
经过我的验证,客户端的js代码产生的同样可以得到 <img src="....">。
代码如下:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
HTMLDocument: IHTMLDocument2;
Source :String;
begin
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
Source := HTMLDocument.Body.Get_outerHTML;
Memo1.Text := Source;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('c:/1.htm');
end;

其中1.htm的内容为:
<html>
<body>
<img name="extimg">
<script>
document.extimg.src = Math.random(10)+'.jpg';
alert(document.extimg.src);
</script>
</body>
</html>

验证结果(memo1中的内容):

<BODY><IMG src="0.23928143487790066.jpg" name=extimg>
<SCRIPT>
document.extimg.src = Math.random(10)+'.jpg';
alert(document.extimg.src);
</SCRIPT>
</BODY>

现在应该知道怎么做了吧?
 
To :LuJuhe
有QQ吗: 我的:8487761 向你学习

谢谢你用心研究这一问题:

不过我们假设的前题是不一样的.
你只是假设图像的类型是*.JPG,但是实际上图片不是
我举个例说明,以下是亚联在线的登录页面,
http://esales.asiagame.com/Login.asp
要实现用程序自动登录,必须模拟手工输入附加码
此附加码就是一个随机图像,亚联的是一个*.GIF文件
但是传奇网站就不是
http://61.151.255.3/login.php
它的附加码图片,用手工IE右键菜单的"另存图像为"可以保存为*.BMP文件

只要将此图片保存后,图片上的数据识别,我巳完成
实际上我要解决的问题就是将此附加码的图片存盘(以以知格式 如:JPG GIF BMP)

你的方法我就用过,
用的是如下语句:DownloadFromUrl()

不过现在不行了,这是我的新的解决思路,但要实现还有许多工作要做.
 
嗯。。。 有点意思,你是想做一个自动登陆的程序吧?
我开始考虑直接用NMHTTP来获取并提交数据,但是这些网站应该会禁止站外提交,所以唯一
的办法只有用WebBrowser,但是要找到图片的准确位置是很困难的。。。 果然是个难题。

能详细说说你的程序的用途吗?我倒是觉得你的OCR程序难度更大。 :)
 
图片识别,我早巳完成
现在的问题是保存图片
 
其实你已经离目标很近了
但是还有一些问题你没有想到的
这里的家伙你不出多点分没人理你的,
真是臭!财迷!富翁嘴脸!:)
只要知道:它给你的是个png文件,就够了。
先Ihtmldocument2.body弄到原码,可以看到
附加码:<IMG height=18 src="check.inc.php?m=0.9167623616250977" 的东西
Iwebbrowser拿url, IhtmlElement拿他的src,
合上url 给那个urlmon的 DownloadFile用,存盘文件用png
如下:
if DownloadFile ('http://61.151.255.3/check.inc.php?m=0.9167623616250977', 'c:/temp.png')
then ShowMessage('Download succesful')
else ShowMessage('Download unsuccesful');

你就弄到了图象。
但是,存下来的图象每次都不同的,所以没有用。:)
因为这个php其实是在server端做random的,每用一次都会变。
所以你解决问题的方法最好是:截屏,切下那个图,他的位置是固定的。
这个其实比分析web简单直接的多! kaka. 相信我,没错的。

 
to:stlont
谢谢stlont,好的,你的思路我巳在原来的程序中做过。

我们知道文件是一个PNG文件了,那就好办了。

于是,现在的问题就变成:
怎样在程序中把PNG图像读出来,
或是将其它转换成BMP图片。

那位建议一下,Delphi 自带的控件行吗?或是有其它新的控件。
 
下载
http://vcl.vclxx.org/DELPHI/D32FREE/PNGSRC.ZIP
仔细看他的Release.htm,安装好
uses PNGImage;

procedure TForm1.SpeedButton4Click(Sender: TObject);
var
PNG: TPNGImage;
BMP: TBitmap;
Filename: String;
begin
Filename := 'c:/temp';
{Creates the TPNGImage and TBitmap}
PNG := TPNGImage.Create;
BMP := TBitmap.Create;
{Do the work}
PNG.LoadFromFile(Filename+'.png');
BMP.Assign(PNG);
BMP.SaveToFile(Filename+'.BMP');
{Destroy the objects}
BMP.Free;
PNG.Free;
end;

我转过,很正常。
 
OK

谢谢,看来问题能解决了。

我先试一试。
 
To:stlont
老兄,
对不起
http://61.151.255.3/login.php
这个附加码的图片不是一个PNG图片,

你的转换真的试过吗?
 
我已存下了png, 并转为了bmp.
仔细看我的帖子。
 
你是用的D6吗,这个控件,我在D6下装不上.

我找的其它控件,但读不出图像出来.出错.
 
仔细看他的Release.htm.
这个原来是for d5的,但是它有pas原码
看看那里不行的
把PngImage.pas和PNGZLIB.pas看看,改改
说说你的处理过程吧,不要老是这样说:
--》》 http://61.151.255.3/login.php 这个附加码的图片不是一个PNG图片,
为什么说不是?你是怎么处理的?
--》》 这个控件,我在D6下装不上
怎样装的?什么出错信息?

给的信息越详细,别人才越容易帮你分析问题。

我给你的解决方法都是运行通过的,
w2k svr(sp3) + d5(update 1) + ie6(sp1)
 
问题巳解决。
谢谢支持。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部