使用 win32inet.WinHttpGetProxyForUrl 的正确方法是什么

2024-02-17

我正在尝试使用 Win32com 开发人员公开的 Microsoft WinHttp 库的一项功能。不幸的是,大多数库似乎没有文档记录,并且没有通过 win32com 库使用 win32inet 功能的正确方法的示例。

这是我到目前为止所拥有的:

import win32inet
hinternet = win32inet.InternetOpen("foo 1.0", 0, "", "", 0)
# Does not work!!!
proxy = win32inet.WinHttpGetProxyForUrl( hinternet, u"http://www.foo.com", 0  )

正如您所看到的,我想做的就是使用 win32inet 功能来找出哪个代理适合用于给定的 URL,例如他的案例 foo.com。

你能帮我纠正最后一行的语法吗? MSN有一些所包装函数的良好文档 http://msdn.microsoft.com/en-us/library/aa384097(VS.85).aspx但参数似乎没有完美地映射到 python 库的参数。

该脚本的固定版本应该:

  • 能够查找要使用的代理 对于任何给定的 URL。

  • 它应该始终执行 Internet Explorer 执行的操作(即使用相同的代理)

  • 它应该在任何有效的 Windows XP 设置上有效。这意味着它应该与显式配置的代理一起使用,并且根本不需要代理。

  • 它只需要在 Windows XP 32 位和 Python 2.4.4 上运行。它可以使用任何官方发布的 win32com 版本。

我在 Windows XP 上使用 Python2.4.4 和 Win32Com。

更新0:

或者...你能给我一个 cTypes 中的替代实现吗?只要我能成功我就很高兴了!


下面是创建 HINTERNET 会话并使用它来获取代理详细信息的代码,使用 ctypes 直接访问 winhttp DLL。 它可以正常工作,没有任何错误,但我的机器上没有设置代理,您可能需要调整一些常量才能使其正确。浏览代码中的 msdn 链接,我从那里看到了 API。

import ctypes
import ctypes.wintypes

winHttp = ctypes.windll.LoadLibrary("Winhttp.dll")

# http://msdn.microsoft.com/en-us/library/aa384098(VS.85).aspx
# first get a handle to HTTP session
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY=0
WINHTTP_NO_PROXY_NAME=WINHTTP_NO_PROXY_BYPASS=0
WINHTTP_FLAG_ASYNC=0x10000000
HINTERNET = winHttp.WinHttpOpen("PyWin32", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC)
print HINTERNET

# now get proxy using HTTP session
# http://msdn.microsoft.com/en-us/library/aa384097(VS.85).aspx
"""
BOOL WinHttpGetProxyForUrl(
  __in   HINTERNET hSession,
  __in   LPCWSTR lpcwszUrl,
  __in   WINHTTP_AUTOPROXY_OPTIONS *pAutoProxyOptions,
  __out  WINHTTP_PROXY_INFO *pProxyInfo
);
"""
# create C structure for WINHTTP_AUTOPROXY_OPTIONS
#http://msdn.microsoft.com/en-us/library/aa384123(VS.85).aspx
"""
typedef struct {
  DWORD   dwFlags;
  DWORD   dwAutoDetectFlags;
  LPCWSTR lpszAutoConfigUrl;
  LPVOID  lpvReserved;
  DWORD   dwReserved;
  BOOL    fAutoLogonIfChallenged;
} WINHTTP_AUTOPROXY_OPTIONS;
"""
class WINHTTP_AUTOPROXY_OPTIONS(ctypes.Structure):
    _fields_ = [("dwFlags", ctypes.wintypes.DWORD),
                ("dwAutoDetectFlags", ctypes.wintypes.DWORD),
                ("lpszAutoConfigUrl", ctypes.wintypes.LPCWSTR),
                ("lpvReserved", ctypes.c_void_p ),
                ("dwReserved", ctypes.wintypes.DWORD),
                ("fAutoLogonIfChallenged",ctypes.wintypes.BOOL),]

WINHTTP_AUTOPROXY_AUTO_DETECT = 0x00000001;
WINHTTP_AUTO_DETECT_TYPE_DHCP = 0x00000001;
WINHTTP_AUTO_DETECT_TYPE_DNS_A = 0x00000002;
options = WINHTTP_AUTOPROXY_OPTIONS()
options.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT
options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP|WINHTTP_AUTO_DETECT_TYPE_DNS_A
options.lpszAutoConfigUrl = 0
options.fAutoLogonIfChallenged = False

# create C structure for WINHTTP_AUTOPROXY_OPTIONS
# http://msdn.microsoft.com/en-us/library/aa383912(VS.85).aspx
"""
struct WINHTTP_PROXY_INFO {
  DWORD  dwAccessType;
  LPWSTR lpszProxy;
  LPWSTR lpszProxyBypass;
};
"""
class WINHTTP_PROXY_INFO(ctypes.Structure):
    _fields_ = [("dwAccessType", ctypes.wintypes.DWORD),
                ("lpszProxy", ctypes.wintypes.LPCWSTR),
                ("lpszProxyBypass", ctypes.wintypes.LPCWSTR),]

info = WINHTTP_PROXY_INFO()

ret = winHttp.WinHttpGetProxyForUrl(HINTERNET, "http://www.google.com", ctypes.pointer(options), ctypes.pointer(info) )
print "proxy success?",ret
if not ret:
    # some error lets see what is that?
    import win32api
    import win32con
    errorCode = win32api.GetLastError()
    print "win32 Error:",errorCode
    s = ""
    print win32api.FormatMessage(errorCode)

print info.dwAccessType, info.lpszProxy, info.lpszProxyBypass
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 win32inet.WinHttpGetProxyForUrl 的正确方法是什么 的相关文章

随机推荐

  • 如何使用 Vue JS 设置嵌套数组的增量计数器

    我使用 Vue JS 的数组深度为两层 我需要一个从 0 开始的索引 并为顶部数组中的每个项目递增 这是我的 HTML div div
  • 使用DDD,如何实现批处理?

    我的逻辑包括从一个系统中选择大量记录 执行多个转换 基于业务规则 并将它们插入到另一个系统中 将这些记录中的每一个实例化为对象 对它们执行转换 然后将所有这些对象插入到另一个系统中 这似乎对性能 和内存 产生了很大的影响 在 DDD 中实现
  • 通过 jQuery ajax 提交表单,包括文件上传

    HTML
  • WP8 - 此软件包使用的应用程序名称尚未为此应用程序保留

    我正在将 Windows Phone 8 应用程序提交到应用程序商店 当我单击Review And Submit我收到错误 This package is using an app name that hasn t been reserve
  • 在 Spacy 中基于现有英语模型实现自定义 POS Tagger:NLP - Python

    我正在尝试使用下面的代码重新训练 spacy 中现有的 POS Tagger 以显示某些错误分类单词的正确标签 但它给了我这个错误 警告 未命名向量 这不允许多个向量模型 待加载 形状 0 0 from spacy vocab import
  • 如何在不生成整数的情况下找到斐波那契数的前 k 位数字?

    我必须找到斐波那契数列 2 10 6 以内的所有斐波那契数的前 k 位数字 显然 我们不能将斐波那契数列的值存储在任何变量中 即使计算所有斐波那契数本身也需要大量的计算时间 那么 有没有办法只得到斐波那契数的前k位而不生成整个数呢 由于您只
  • ajax成功返回0

    我需要一点帮助 我设计了我的自定义ajax 函数 这是一个简单的表单 输入 5 个值进行验证 然后通过 ajax 将数据发送到 php 函数 该函数通过电子邮件发送这些详细信息 成功后 将向用户显示弹出窗口以进行确认 我已经应用了验证 并且
  • 如何在启动时启动 Docker for Mac 守护进程?

    我想让 Docker for Mac 在启动时启动 而不是在登录时启动 我该怎么做呢 我想创建一个LaunchDaemon 我只是不知道要启动什么程序 我看到的所有例子似乎都使用docker machine定义一个虚拟机 但文档现在说doc
  • 简短的Python代码来表达“选择较低的值”?

    我的意思是 我正在寻找返回较低值的非常短的代码 例如 a 1 2 3 4 5 6 7 8 9 10 b 1 2 3 4 5 6 7 8 len a 10 len b 8 if fill this in print lesser value
  • 使用 QNetworkAccessManager 的 post() 方法上传文件

    我在使用 Qt 应用程序时遇到一些问题 特别是 QNetworkAccessManager 类 我正在尝试使用 QNetworkAccessManager 的 post 方法执行二进制文件的简单 HTTP 上传 文档指出我可以为 post
  • 在标头中发送会话密钥与仅 HTTP cookie

    我想知道在我的系统中发送会话密钥的最佳选择 在我的系统中 有一个 API 服务器可供 Web 浏览器 命令行界面和桌面应用程序使用 它通过查看用户的身份来验证用户的身份AuthorizationHTTP 标头 目前 浏览器将会话密钥存储在
  • CodeIgniter 和 SimpleTest——如何进行我的第一个测试?

    我习惯使用 LAMP PHP5 MySQL 以及带有 Xdebug 的 NetBeans 进行 Web 开发 现在我想通过学习如何使用 A 正确的测试和 B 框架来改进我的开发 所以我设置了 CodeIgniter SimpleTest 和
  • 使用模拟库在循环中进行用户输入的 Python 测试

    我正在尝试使用模拟库来测试一段代码 在此代码中 用户原始输入在 for 循环中被接受 如下所示 我已经写了测试用例test apple record可以为托盘编号提供单个用户输入值 但是 对于 for 循环中的每次迭代 它只采用与预期相同的
  • 直接管理 + Docker

    我有 Direct Admit 的 VPS 托管 有 Debian Jessie 我可以使用 ssh 现在我想使用 docker 容器安装 discourse 我应该做一些超出手册提示内容的事情吗 我是说 我对港口一无所知 例如 直接管理使
  • 获取 URL 的基本名称,然后将活动类放入导航栏

    示例链接 http localhost test page php 我有一段 JavaScript 代码 它将放置一个active导航栏的类 如果该导航栏的 url href current url 当前的 JavaScript 仅将活动类
  • 通过簇替换重新采样

    我想绘制簇 由变量定义id 从数据集中进行替换 与之前回答的问题相比 我希望选择 K 次的聚类以使每个观察重复 K 次 也就是说 我正在进行集群引导 例如 以下示例id 1两次 但重复观察id 1仅在新数据集中出现一次s 我想要所有的观察结
  • 使用平铺进行透视图像转换

    在寻找一个可以用于我计划创建的新应用程序的良好图像处理库 我将使用 C NET VS 2008 我的应用程序需要执行以下操作 在启动时加载图像并将其显示在图片框中 然后我应该能够在图片框中的任何位置选择四个点 左上 右上 左下 右下 然后
  • 这是在java中声明记录器变量的最佳方法

    我只是想知道在 java 中声明记录器变量的最佳方法是什么 以下是一些声明 1 gt private static final Logger logger Logger getLogger ServiceImpl class 2 gt pr
  • 如何在c中找到内存分配的最大限制

    我想确定我可以在计算机中分配的最大内存限制是多少 这是我为此任务编写的代码 include
  • 使用 win32inet.WinHttpGetProxyForUrl 的正确方法是什么

    我正在尝试使用 Win32com 开发人员公开的 Microsoft WinHttp 库的一项功能 不幸的是 大多数库似乎没有文档记录 并且没有通过 win32com 库使用 win32inet 功能的正确方法的示例 这是我到目前为止所拥有