快过年了 大家帮个忙, 如果得到网页中的[验证码]图片!!!!! ( 积分: 50 )

  • 主题发起人 主题发起人 iyesno
  • 开始时间 开始时间
I

iyesno

Unregistered / Unconfirmed
GUEST, unregistred user!
大家新年好!!我最近想做一个验证码识别程序!!可是我得不到网页中的验证码图片!大家帮个忙!
Q:它是不能直播下载的,因为次次下载得到的都不同.
Q:我在IE的临时文件夹中也没有找到它.
Q:不知能不能在WebBrowser中得到呢?

我试了好几种方法也没有成功!

验证码图片在网页中的地址是:http://blog.china.com/image.jsp
网页地址:http://junshi.blog.china.com/200702/175675.html
 
这个比較难搞,牽涉到好多知識,比如圖像識別技術;
論壇上有个叫,风铃夜思雨 的富翁搞勃一个自動識別的东东,
你可向它請教。
 
我只是想得到图片!!!识别的我以完成了!!
 
分我要了[:D][:D][:D]
var s:string;
begin
GetCacheVerifyCodeFile('http://blog.china.com/image.jsp',s);
s为返回缓存中最新的图片路径
只要加载s到image中即可
end;

如果在缓存中没有,可以用抓图方式,抓webbrowser中的验证码位置的图

Function GetCacheVerifyCodeFile(VerifyCodeURL: String; Var CacheVerifyCodeFile: String): boolean;
Var
lpEntryInfo: PInternetCacheEntryInfo;
dwEntrySize, dwLastError, Hwd: LongWORD;
i, j: integer;
f: String;
Begin
result := false;
dwEntrySize := 0;
j := 0;
CacheVerifyCodeFile := '';
FindFirstUrlCacheEntry(Nil, TInternetCacheEntryInfo(Nil^), dwEntrySize);
GetMem(lpEntryInfo, dwEntrySize);
Hwd := FindFirstUrlCacheEntry(Nil, lpEntryInfo^, dwEntrySize);
If Hwd <> 0 Then
Begin
Repeat
dwEntrySize := 0;
FindNextUrlCacheEntry(Hwd, TInternetCacheEntryInfo(Nil^), dwEntrySize);
dwLastError := GetLastError();
If dwLastError = ERROR_INSUFFICIENT_BUFFER Then
Begin
GetMem(lpEntryInfo, dwEntrySize);
If FindNextUrlCacheEntry(Hwd, lpEntryInfo^, dwEntrySize) Then
If Pos(UpperCase(VerifyCodeURL), UpperCase(lpEntryInfo.lpszSourceUrlName)) > 0 Then
Begin
i := FileAge(lpEntryInfo.lpszLocalFileName);
If i > j Then
Begin
j := i;
f := lpEntryInfo.lpszLocalFileName;
End;
End;
End;
Application.ProcessMessages;
Until (dwLastError = ERROR_NO_MORE_ITEMS);
If FileExists(f) Then
Begin
CacheVerifyCodeFile := f;
result := true;
End;
End;
FreeMem(lpEntryInfo);
FindCloseUrlCache(Hwd);
End;
 
从缓存查找, 到也不错 :)
 
1: 风铃夜思雨 的方法能得到缓存中存在的图片.对'http://blog.china.com/image.jsp'不起做用!!
2: 抓webbrowser中的验证码位置的图 这方法我也想过 但图的位置是会玩的啊(如有人发表的评论,图的位置就会玩了).

[:(][:(][:(][:(]
还是不行啊!!!大家帮下吧!!!
 
楼主,以前我写过一个类似的,你可以给IE照相啊,比较简单,但是很傻。
 
image.jsp返回的是图片的数据内容,把返回内容写入一个.bmp文件就行了.
 
procedure TForm1.Button1Click(Sender: TObject);
var
resp : TMemoryStream;
begin
resp := TMemoryStream.Create;
idhttp1.Get('http://blog.china.com/image.jsp',resp);
resp.SaveToFile('d:/1.bmp');
end;
 
idhttp1 这是 Indy 的 TIdHTTP 控件.
 
最后试了下,是jpg格式,用TImage可以显示了.
procedure TForm1.Button1Click(Sender: TObject);
var
resp : TMemoryStream;
begin
try
resp := TMemoryStream.Create;
idhttp1.Get('http://blog.china.com/image.jsp',resp);
resp.SaveToFile('d:/1.jpg');
image1.Picture.LoadFromFile('d:/1.jpg');
finally
resp.Free;
end;
end;
 
呵呵,这分我来拿吧……识别的话,我也可以的……
uses jpeg;

function GetBMP:TBitMap;
var
URL : String;
BitMap:TBitMap;
TempJPEG : TJpegimage;
TempData : String;
begin
BitMap := TBitMap.Create;
TempStream := TMemoryStream.Create;
TempJPEG := TJPEGImage.Create;
Result := BitMap;
try
_HTTP.Connected;
_HTTP.Get('http://blog.china.com/image.jsp',TempStream);
if not (TempStream.Size=0) then
begin
TempStream.Position := 0;
TempJPEG.LoadFromStream(TempStream);
BitMap.Assign(TempJPEG);
Result := BitMap;
end;
except
end;
end;
 
_HTTP 是 IDHTTP 组件,创建代码如下
var
_HTTP : TIDHTTP;
begin
_HTTP := TIDHTTP.Create(Form);
_HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0)';
_HTTP.HandleRedirects := True;
....
....
....
 
trivialboy和我爱大咪咪二个人的方法我试了都可以!

顺便问一下iyesno:
你说:“我只是想得到图片!!!识别的我以完成了!!”,能介绍一下识别的方法资料吗,谢谢!
 
在程序中能不能有办法不用显式在窗体上放置TWebBrowser而能让浏览的访问数量增加

也就是在代码中如此:
WebBrowser := TWebBrowser.Create(nil);
WebBrowser.navigate(URL); //让URL对应网站访问数量加一

我试了上面的代码不行,用TidHTTP.Get也不行

在窗体上放一个TWebBrowser,再执行方法:navigate(URL)就可以,怎么回事,或有其它方法解决吗
 
后退
顶部