2009-07-03 13 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 ) 

あなたが見ることができるように、私がやろうとしていますすべてが指定されたURLに使用する適切なものであるプロキシを見つけるためにwin32inet機能を使用しています彼のケースはfoo.comです。

最後の行の構文を修正できますか? MSNにはいくつかgood documentation for the function being wrappedがありますが、argsはPythonライブラリのものに完全に対応していないようです。

このスクリプトの修正版が必要です。

  • は、任意のURLのため を使用するプロキシ調べることができるよう。

  • それは、常にそれがどんな有効なWindows XPのセットアップに有効である必要があり、まさにInternet Explorerはどうなる(すなわち、同じプロキシを使用)

  • 行う必要があります。つまり、明示的に設定されたプロキシと、プロキシを全く使用しないで動作するはずです。

  • Windows XP 32ビット版Python 2.4.4で動作する必要があります。 Win32comの公式リリース版を使用することができます。

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

UPDATE 0:

OR ...あなたは私のctypesの代替実装を与えることができますか?私はそれを働かせる限り、私は幸せです!

+0

あなたが書くとき"うまくいかない!!!":エラーメッセージはありますか?結果はあなたが期待しているものとは違うのですか?より多くの情報を提供してください。 – ars

答えて

6

HINTERNETセッションを作成し、プロキシの詳細を取得するためにctypesを使用してwinhttp DLLに直接アクセスするコードです。 エラーなく動作しますが、私のマシンにプロキシが設定されていないので、正しいものを得るためにいくつかの定数を微調整する必要があります。私がAPIを見たところから、コードのmsdnリンクを見てください。 Windows XP x86およびWindows 8のx64の上

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 
+0

さて、これはすばらしい助けになりました...そして今、私はctypes.wintypesについてknopwを学びました。理論的には私が好きな構造体を作ることができます。 1つのレシピを始めることがどれほど役立つかは驚くべきことです。 –

1

win32inet(この領域ではSWIGという制限のために乱雑です)を使用する理由がない限り、代わりに​​を使用することをお勧めします。

+0

なぜですか? win32inetモジュールは信頼性がありませんか? –

+0

さて、もしうまくいけば、あなたはこの質問を投稿していないだろうと推測します;-)。あなたはまだ 'ars'の質問には答えていません(どのようなエラーが出ているのか)、どういう問題が出ているのか本当に分かりません。私は、私が言及した制限の結果である非標準引数渡しを指すgetargsエラーを取得します。 –

+0

はい、それはエラーです。議論は間違っている - 私はちょうど正しいものが何であるか分からない! –

1

少なくとも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) 

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

関連する問題