2009-07-03 87 views
3

我想使用Win32com的开发人员已公开的Microsoft WinHttp库的功能。不幸的是,大多数库似乎没有记录,也没有通过win32com库使用win32inet功能的正确方法的示例。什么是正确的方式来使用win32inet.WinHttpGetProxyForUrl

这是我到目前为止有:

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有一些good documentation for the function being wrapped,但这些参数似乎并不完美地映射到python库的那些参数。

此脚本的固定的版本应:

  • 能够仰望使用 对于任何给定的URL的代理服务器。

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

  • 这应该是任何有效的Windows XP有效建立。这意味着它应该与明确配置的代理一起工作,也根本没有代理。

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

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

更新0:

或者......你能给我在ctypes的替代实现?只要我能使它工作,我很高兴!

+0

当你写“不工作!!!”:是否有错误信息?是不是你期望的结果?请提供更多信息。 – ars 2009-07-06 21:54:12

回答

6

下面是创建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 
1

除非是使用win32inet(这是在这一领域凌乱由于SWIG限制)一个强有力的理由,我推荐你使用​​代替。

+0

这是为什么? win32inet模块不可信吗? – 2009-07-07 14:37:15

+0

那么,如果它已经工作了,我想你不会发布这个问题;-)。你仍然没有回答'ars`的问题(关于你得到的错误),所以我不确定你遇到了什么问题。我得到一个getargs错误,指向非标准的参数传递,这是我提到的限制的结果。 – 2009-07-07 14:51:14

1

至少在Windows XP x86和Windows 8的64位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 

值得一提的是,例如使用自动代理选项WINHTTP_AUTOPROXY_CONFIG_URL为了在显通URL。您可以使用其他选项,例如,如果你想使用DNS或DHCP自动检测,你可以这样做:

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

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

相关问题