1. 使用易语言内置的网页浏览框(_ie浏览器_web浏览器): 这是最简单、最直接的方法,适合初学者和简单的需求。
  2. 使用第三方 DLL(如 WinINet.dlllibcurl.dll): 这是一种更底层、更强大的方法,可以完全控制 HTTP 请求,获取更完整的信息,但相对复杂一些。

下面我将详细介绍这两种方法,并提供完整的代码示例。


使用易语言内置的 _ie浏览器 组件(推荐新手使用)

这种方法的核心思想是:先让内置的浏览器组件去访问目标网站,然后从组件的内部状态中读取已经保存的 Cookie。

优点:

  • 代码简单,不需要调用复杂的 DLL。
  • 自动处理了 Cookie 的存储和发送过程,与真实浏览器行为一致。

缺点:

  • 必须先显示或隐藏一个浏览器窗口。
  • 获取的是当前浏览器进程中的所有 Cookie,无法针对单个精确请求。

操作步骤:

  1. 创建一个“IE 浏览器”对象。
  2. 让它导航到目标网址。 (需要等待页面加载完成)
  3. 从 IE 浏览器对象中获取 Cookie 信息。

完整代码示例:

.版本 2
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.局部变量 ie, 对象
.局部变量 cookie文本, 文本型
' 创建一个 IE 浏览器对象
ie.创建 (“_ie浏览器”, , , )
' 导航到目标网站,例如百度
ie.取地址 (“https://www.baidu.com”)
' --- 重要:必须等待页面加载完成 ---
' 可以使用一个循环来等待,或者使用定时器
' 这里用一个简单的延时来演示(实际项目中建议用更可靠的方式)
.计次循环首 (10, )
    .如果真 (ie.是否忙 () = 假)
        跳出循环 ()
    .如果真结束
    延时 (1000) ' 等待1秒
.计次循环尾 ()
' 从 IE 对象中获取 Cookie 文本
cookie文本 = ie.取文档 ().cookie
' 显示获取到的 Cookie
信息框 (“成功获取到 Cookie:” + #换行符 + cookie文本, 0, , )
' 关闭 IE 浏览器对象
ie.销毁 ()
.结束

代码解释:

  1. ie.创建 (“_ie浏览器”, , , ):创建一个 IE 浏览器组件。
  2. ie.取地址 (“https://www.baidu.com”):让浏览器打开百度首页。
  3. .计次循环首 (10, ) ... .计次循环尾 ():这是一个简单的等待机制,检查 ie.是否忙 (),如果浏览器不忙了(页面加载完成),就退出循环。延时(1000) 让程序暂停一下,避免 CPU 占用过高。
  4. cookie文本 = ie.取文档 ().cookie:这是核心代码。ie.取文档 () 返回一个文档对象,这个对象有一个 cookie 属性,它包含了当前网页域的所有 Cookie 字符串。
  5. 信息框 (...):用弹窗显示获取到的 Cookie 内容。
  6. ie.销毁 ():用完后销毁对象,释放内存。

使用 WinINet.dll(更底层、更强大)

这种方法通过调用 Windows 系统自带的 WinINet.dll 动态链接库来实现,它不依赖于任何可视化的浏览器组件,适合在后台程序或需要精确控制 HTTP 请求的场景中使用。

优点:

  • 无需弹出浏览器窗口,可在后台静默运行。
  • 可以精确控制请求,并获取响应头信息。
  • 功能更全面,可以模拟登录、上传文件等复杂操作。

缺点:

  • 代码相对复杂,需要了解 DLL 调用。
  • 需要手动管理 Cookie 的存储和发送。

操作步骤:

  1. 声明 WinINet.dll 中需要用到的函数。
  2. 调用 InternetOpen 初始化会话。
  3. 调用 InternetOpenUrl 打开目标网址。
  4. 调用 InternetGetCookieEx 获取指定网址的 Cookie。
  5. 使用完毕后,调用 InternetCloseHandle 关闭句柄。

完整代码示例:

.版本 2
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.局部变量 hInternet, 整数型
.局部变量 hUrl, 整数型
.局部变量 cookie缓冲区, 字节集, , "1024"
.局部变量 cookie长度, 整数型
.局部变量 返回值, 整数型
.局部变量 cookie文本, 文本型
' .版本 2
' .支持库 shell
' --- 声明 WinINet.dll 中的函数 ---
.子程序 InternetOpen, 整数型, 公开
.参数 lpszAgent, 文本型, , "MyApp"
.参数 dwAccessType, 整数型, , 1
.参数 lpszProxy, 文本型, , ""
.参数 lpszProxyBypass, 文本型, , ""
.参数 dwFlags, 整数型, , 0
.子程序 InternetOpenUrl, 整数型, 公开
.参数 hInternet, 整数型
.参数 lpszUrl, 文本型
.参数 lpvHeaders, 字节集
.参数 dwHeadersLength, 整数型
.参数 dwFlags, 整数型
.参数 dwContext, 整数型
.子程序 InternetGetCookieEx, 整数型, 公开
.参数 lpszUrl, 文本型
.参数 lpszCookieName, 文本型, , ""
.参数 lpCookieData, 字节集
.参数 lpdwSize, 整数型, , 传址
.参数 dwFlags, 整数型, , 0x00002000 ' INTERNET_COOKIE_HTTPONLY
.参数 lpReserved, 整数型
.子程序 InternetCloseHandle, 逻辑型, 公开
.参数 hInternet, 整数型
' --- 主程序逻辑 ---
' 1. 初始化 Internet 会话
hInternet = InternetOpen (“MyCookieGetter”, 1, , , 0)
.(hInternet = 0)
    信息框 (“InternetOpen 失败!”, 0, , )
    返回 ()
.否则
    ' 2. 打开 URL (这一步主要是为了确保 Cookie 被加载)
    '    虽然我们主要目的是获取 Cookie,但通常需要先访问一次
    hUrl = InternetOpenUrl (hInternet, “https://www.baidu.com”, , , 0x8000000, 0) ' 0x8000000 表示 INTERNET_FLAG_NO_UI
    .(hUrl = 0)
        信息框 (“InternetOpenUrl 失败!”, 0, , )
        InternetCloseHandle (hInternet)
        返回 ()
    .否则
        ' 关闭 URL 句柄,因为我们只需要 Cookie,不需要读取内容
        InternetCloseHandle (hUrl)
    .否则
    ' 3. 获取 Cookie
    ' 首先获取需要的缓冲区大小
    cookie长度 = 1024 ' 初始分配一个缓冲区大小
    cookie缓冲区 = 取空白字节集 (cookie长度)
    ' 调用函数获取 Cookie
    ' INTERNET_COOKIE_HTTPONLY (0x00002000) 标志表示获取 HTTPOnly 的 Cookie
    返回值 = InternetGetCookieEx (“https://www.baidu.com”, , cookie缓冲区, cookie长度, 0x00002000, 0)
    .(返回值 = 0) ' 失败
        ' 可能是缓冲区太小,错误码是 122 (ERROR_INSUFFICIENT_BUFFER)
        .(取错误码 () = 122)
            cookie长度 = cookie长度 * 2 ' 扩大缓冲区
            cookie缓冲区 = 取空白字节集 (cookie长度)
            返回值 = InternetGetCookieEx (“https://www.baidu.com”, , cookie缓冲区, cookie长度, 0x00002000, 0)
            .(返回值 = 0)
                信息框 (“InternetGetCookieEx 失败,错误码:” + 到文本 (取错误码 ()), 0, , )
            .否则
                ' 成功获取
                cookie文本 = 到文本 (cookie缓冲区)
                信息框 (“成功获取到 Cookie:” + #换行符 + cookie文本, 0, , )
            .否则
        .否则
            信息框 (“InternetGetCookieEx 失败,错误码:” + 到文本 (取错误码 ()), 0, , )
        .如果结束
    .否则
        ' 成功获取
        cookie文本 = 到文本 (cookie缓冲区)
        信息框 (“成功获取到 Cookie:” + #换行符 + cookie文本, 0, , )
    .如果结束
.如果结束
' 4. 关闭句柄,释放资源
InternetCloseHandle (hInternet)
.结束

代码解释:

  1. 函数声明: 我们声明了 WinINet.dll 的四个核心函数。
    • InternetOpen: 启动一个会话。
    • InternetOpenUrl: 打开一个 URL,这个过程会使得系统加载相关的 Cookie。
    • InternetGetCookieEx: 核心函数,用于获取指定 URL 的 Cookie。dwFlags 参数设置为 0x00002000 可以获取到 HttpOnly 的 Cookie,这在现代网站中很常见。
    • InternetCloseHandle: 关闭句柄,释放资源。
  2. 初始化: InternetOpen 创建一个会话句柄 hInternet
  3. 访问 URL: InternetOpenUrl 访问百度,这一步是必要的,它会触发浏览器引擎加载并准备好该域的 Cookie。
  4. 获取 Cookie:
    • InternetGetCookieEx 的第二个参数 lpdwSize 是“传址”参数,函数执行后会返回实际需要的缓冲区大小。
    • 我们先尝试用一个固定大小的缓冲区(1024字节)去获取,如果失败,并且错误码是 122(缓冲区不足),我们就重新分配一个更大的缓冲区再试一次。
    • 成功后,cookie缓冲区 中就存放了 Cookie 的字节集,我们用 到文本() 转换为可读的字符串。
  5. 清理: 务必调用 InternetCloseHandle 关闭所有打开的句柄,这是一个良好的编程习惯。

总结与对比

特性 方法一 (内置 _ie浏览器) 方法二 (WinINet.dll)
易用性 非常简单,几行代码搞定 较复杂,需要理解 DLL 调用和错误处理
界面 必须有浏览器窗口(可隐藏) 完全后台,无任何界面
适用场景 快速测试、简单抓取、对界面无要求的程序 后台服务、自动化脚本、需要精确控制请求、需要获取 HttpOnly Cookie 的程序
依赖 仅依赖易语言本身 依赖 Windows 系统 WinINet.dll

建议:

  • 如果你只是想快速获取一个网站的 Cookie,或者你的程序本来就要显示网页,强烈推荐使用方法一
  • 如果你正在开发一个复杂的网络工具、爬虫或者需要在后台静默操作,并且需要获取更完整的 Cookie 信息,应该学习并使用方法二