VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 232|回复: 2

[求助] 请问怎么获取webbrowser的cookie

[复制链接]
954624 发表于 7 天前 | 显示全部楼层 |阅读模式
10驿站币
请问怎么获取webbrowser的cookie

最佳答案

查看完整内容

Wininet、WebBrowser 编程中如何管理Cookie 用 VC++访问网页,一般都是用微软提供的 Wininet、WinHTTP(基于HTTP协议)或 WebBrowser(加载整个网页)。当然还有 libcurl 之类的第三方类库,因为暂时没接触过,就不说了。 在使用上述三种方式访问网页的编程过程中,默认情况下是由它来管理 Cookie,但有时候程序员想手工干预,比如清除Cookie、修改Cookie、添加Cookie。在网上搜索了一下,大概有这么三种方法: 第一种: ...

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

Syc 发表于 7 天前 | 显示全部楼层
Wininet、WebBrowser 编程中如何管理Cookie

用 VC++访问网页,一般都是用微软提供的 Wininet、WinHTTP(基于HTTP协议)或 WebBrowser(加载整个网页)。当然还有 libcurl 之类的第三方类库,因为暂时没接触过,就不说了。

在使用上述三种方式访问网页的编程过程中,默认情况下是由它来管理 Cookie,但有时候程序员想手工干预,比如清除Cookie、修改Cookie、添加Cookie。在网上搜索了一下,大概有这么三种方法:

第一种:
FindFirstUrlCacheEntry
FindNextUrlCacheEntry
DeleteUrlCacheEntry

这些API属于Wininet,可以清除持久的Cookie,不能清除会话级Cookie,因为会话级Cookie是在进程内存中,这些API是基于硬盘缓存文件的清理。

第二种:
InternetGetCookie
InternetSetCookie
InternetGetCookieEx
InternetSetCookieEx

这些API属于Wininet,可以获取、添加、覆盖、修改、删除持久Cookie和会话级Cookie(会话级Cookie需要在同进程中操作)。加Ex后缀的API可以对HTTPOnly的Cookie进行操作。

InternetSetCookie
该API可以添加会话级Cookie,也可以添加持久Cookie,添加持久的Cookie请在每条Cookie后加expires。比如:
TestData = Test; expires = Sat,01-Jan-2000 00:00:00 GMT
使用该API也可以覆盖、修改、删除Cookie,但用的时候要十分注意!!!
设置的Cookie的归属URL和每个属性都要和目标Cookie一一对应才能正确操作Cookie。特别是Path和Domain属性,否则会导致添加了一个同名Cookie而不能覆盖或清除目标Cookie的结果。先查看Cookie是怎么被设置的,在响应头Set-Cookie中找到该Cookie是怎么被设置的。比如响应头是这样的:
Set-Cookie: uin=55555555; PATH=/; DOMAIN=qq.com;
那么用此API修改此Cookie的时候一定不能忘了PATH和DOMAIN属性。
如果要修改此Cookie:
InternetSetCookie("http://.qq.com/",NULL,"uin=22222222; PATH=/; DOMAIN=qq.com");
也可以给此Cookie赋空值:
InternetSetCookie("http://.qq.com/",NULL,"uin=; PATH=/; DOMAIN=qq.com");
也可以删除此Cookie:
InternetSetCookie("http://.qq.com/",NULL,"uin=; PATH=/; DOMAIN=qq.com ;expires = Sat,01-Jan-2000 00:00:00 GMT");
给其设置一个过期的时间便清除了Cookie,会话级Cookie也可被清除。如果给会话级Cookie设置一个没有到期的时间,会话级Cookie将变成持久Cookie。
注意,每次只能操作一个Cookie。如果需要操作多个Cookie,需要调用多次该API。

InternetGetCookie
该API可以获取持久的Cookie,如果在同进程中,还可以获取会话级Cookie。如果要获取HTTPOnly的Cookie,请使用InternetGetCookieEx。值得注意的是InternetGetCookie的第二个参数lpszCookieName无用,InternetGetCookieEx的第二个参数才启用了。

参考:http://msdn.microsoft.com/en-us/ ... 85326(v=vs.85).aspx

第三种:
IHTMLDocument2::get_cookie()
IHTMLDocument2::put_cookie()

用MSHTML对Document对象的Cookie属性进行操作。也可以实现类似InternetGetCookie和InternetSetCookie的效果。实际上它等同于用javascript来读写文档中的Cookie。它同样可以获取、添加、覆盖、修改、删除持久Cookie和会话级Cookie,但不可读写HTTPOnly的Cookie。这种方式同样也要十分注意设置的Cookie的每个属性都要和目标Cookie一一对应才能正确操作Cookie。特别是Path和Domain属性,否则会导致添加了一个同名Cookie而不能覆盖或清除目标Cookie的结果。
和上面的例子类似:
如果要修改Cookie:
CComQIPtr<IHTMLDocument2> spDoc = GetHtmlDocument();
CComBSTR bstr = "uin=22222222; PATH=/; DOMAIN=qq.com;";
spDoc->put_cookie(bstr);
如果要删除Cookie:
CComQIPtr<IHTMLDocument2> spDoc = GetHtmlDocument();
CComBSTR bstr = "uin=; PATH=/; DOMAIN=qq.com; expires = Sat,01-Jan-2000 00:00:00 GMT";
spDoc->put_cookie(bstr);

总结下来,第一种方法基本很少用。二、三两种方法较常用。
使用Wininet开发时,可以使用第二种方法。
使用WebBrowser开发时,可以使用二、三两种方法。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

 楼主| 954624 发表于 6 天前 | 显示全部楼层
Syc 发表于 2017-10-11 11:04
Wininet、WebBrowser 编程中如何管理Cookie

用 VC++访问网页,一般都是用微软提供的 Wininet、WinHTTP( ...

  1. CString strCookie;
  2. char * pszURL = "http://baidu.com/";
  3. BOOL bRes = CInternetSession::GetCookie(pszURL,"",strCookie);
复制代码


我用这个获取的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站

本版积分规则

展开

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )

返回顶部
x

VC驿站微信公众号cctry2009

GMT+8, 2017-10-18 04:40

Powered by Discuz!

© 2009-2017 cctry.com

快速回复 返回顶部 返回列表