1

我在 C# 中有一个 Internet Explorer 自动化脚本,它工作正常,但我想访问验证码图像,验证码链接每次访问时都会返回一个刷新的图像,并且由于浏览器已经访问过它,再次访问它会搞砸,所以我尝试使用以下代码在磁盘上的浏览器缓存中查找图像

tempDir = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache).ToString();
System.Console.WriteLine(tempDir);
supstra = element.innerHTML.ToString().Substring(element.innerHTML.ToString().IndexOf("/sorry/image?id="), element.innerHTML.ToString().Length - element.innerHTML.ToString().IndexOf("/sorry/image?id="));
Console.WriteLine("http://www.goolge.com/sorry/image?id=" + element.innerHTML.ToString().Substring(element.innerHTML.ToString().IndexOf("/sorry/image?id="), supstra.IndexOf("&hl=")));
captchas = client.Decode(tempDir + "\\" + element.innerHTML.ToString().Substring(element.innerHTML.ToString().IndexOf("/sorry/image?id=") + 7, supstra.IndexOf("&hl=")).Replace("amp;", "") + "=en", 0);

然而,缓存目录中的图像不是图像,而是命令或具有名称的东西image?id=....

它所做的就是重新访问并获得新的形象。我要做的似乎是以某种方式访问​​浏览器显示的图像,这可能只在内存中,我该怎么做?

4

1 回答 1

1

请参阅此处有关Accessing IE cache in C# 的线程。

具体来说,从问题:

由于 Internet Explorer 已经在显示网页,因此网页中的图像必须已经存储在本地缓存中的某个位置

答案(强调我的):

您想使用GetUrlCacheEntryInfo()

从函数返回时使用 INTERNET_CACHE_ENTRY_INFO 结构的 lpszLocalFileName。

此外,你的一个前提是有缺陷的。 有时 IE 仅具有图像的内存表示,并且磁盘上的项目已被删除。例如,如果设置了 no-cache 指令,就会出现这种情况。或者用户已清除缓存但未从页面导航。或者清道夫已将其删除但用户尚未导航。可能还有 5 到 7 个其他场景。

过去,当我不得不做类似的事情时,我会强制 Web 浏览器(在这种情况下为 IE)使用Fiddler2 之类的东西作为代理。在 Fiddler2 中,我可以截获特定 URL 的图像请求,并使用 C# 将它们保存到已知位置的磁盘中。然后自动化程序可以从那里抓取它们。

于 2012-05-21T02:55:25.037 回答