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

我正在尝试使用Win32com开发人员公开的Microsoft WinHttp库的function。 不幸的是,大多数的库似乎没有被logging,也没有正确的方式通过win32com库使用win32inetfunction的例子。

这是我迄今为止:

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

正如你所看到的,我所要做的就是使用win32inetfunction找出哪个代理是适用于给定URL的代理,在他的情况下是foo.com。

你能帮我纠正最后一行的语法吗? MSN有一些很好的包装函数的文档,但参数似乎并没有完全映射到Python库的那些文件。

这个脚本的固定版本应该:

  • 能够查找哪个代理使用任何给定的url。

  • 它应该总是做什么Internet Explorer会做(即使用相同的代理)

  • 它应该在任何有效的Windows XP设置上有效。 这意味着它应该使用一个明确configuration的代理,也没有代理。

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

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

更新0:

或者…你可以给我一个在cTypes的替代实现? 只要我能使它工作,我很高兴!

Solutions Collecting From Web of "什么是使用win32inet.WinHttpGetProxyForUrl正确的方法"

这里是创建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 

除非有充分的理由使用win32inet (由于SWIG限制,在这方面很麻烦),我推荐你使用ctypes

至少在Windows XP x86和Windows 8 x64上使用Python 2.7.6Pywin 218时,它可以工作:

 import win32inet # http://msdn.microsoft.com/en-us/library/windows/desktop/aa384098(v=vs.85).aspx hinternet = win32inet.WinHttpOpen("foo", 0, "", "", 0) # http://msdn.microsoft.com/en-us/library/windows/desktop/aa384123(v=vs.85).aspx autoproxy_options = (2, 0, u"http://your-proxy-script-path", None, 0, 1) # http://msdn.microsoft.com/en-us/library/windows/desktop/aa384097(v=vs.85).aspx proxy = win32inet.WinHttpGetProxyForUrl(hinternet, u"http://www.google.com", autoproxy_options) print proxy 

值得一提的是,该示例使用autoproxy选项WINHTTP_AUTOPROXY_CONFIG_URL来传递一个明确的URL。 您可以使用其他选项,例如,如果您想使用DNS或DHCP进行自动检测,可以执行以下操作:

 autoproxy_options = (1, 1|2, u"", None, 0, 1) 

您可以在上面显示的链接中找到其他选项(在代码中)