3

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 には、ラップされている関数に関する優れたドキュメントがありますが、引数が python ライブラリの引数に完全にマップされていないようです。

このスクリプトの修正版は、次のようにする必要があります。

  • 特定の URL に使用するプロキシを検索できます。

  • 常に Internet Explorer とまったく同じように動作する必要があります (つまり、同じプロキシを使用します)。

  • これは、有効な Windows XP セットアップで有効である必要があります。つまり、明示的に構成されたプロキシで動作し、プロキシがまったくなくても動作するはずです。

  • Python 2.4.4 を使用する Windows XP 32 ビットでのみ動作する必要があります。win32com の公式にリリースされたバージョンを使用できます。

Windows XP の Win32Com で Python2.4.4 を使用しています。

更新 0:

または... cTypes での代替実装を教えてもらえますか? それを機能させることができる限り、私は幸せです!

4

3 に答える 3

6

これは、HINTERNET セッションを作成し、それを使用してプロキシの詳細を取得し、ctypes を使用して winhttp DLL に直接アクセスするコードです。エラーなしで動作しますが、マシンにプロキシが設定されていません。正しく動作させるには、いくつかの定数を微調整する必要がある場合があります。API を見たところから、コード内の msdn リンクに移動します。

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
于 2009-07-08T06:09:28.317 に答える
1

少なくともWindows XP x86Python 2.7.6およびPywin 218Windows 8 x64 では、次のように動作します。

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

この例では、明示的な URL を渡すために自動プロキシ オプション WINHTTP_AUTOPROXY_CONFIG_URL を使用していることに注意してください。たとえば、DNS または DHCP を使用して自動検出する場合は、他のオプションを使用できます。

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

上記のリンク(コード内)で他のオプションを見つけることができます

于 2014-01-14T15:37:42.807 に答える
1

使用する強い理由がない限りwin32inet( の制限により、この領域では面倒ですSWIG)、代わりに を使用することをお勧めしますctypes

于 2009-07-07T13:50:57.603 に答える