Frage

Ich versuche, ein Merkmal der Microsoft WinHttp Bibliothek zu verwenden, die von den Entwicklern von win32com ausgesetzt wurden. Leider sind die meisten der Bibliothek scheint nicht zu dokumentieren und es gibt kein Beispiel für die richtige Art und Weise die win32inet Funktionen über die win32com Bibliothek zu verwenden.

Das ist, was ich habe, so weit:

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

Wie Sie sehen können, alles, was ich zu tun versuche, ist, die win32inet Funktion verwenden, um herauszufinden, welche Proxy ist die geeignete für eine bestimmte URL zu verwenden, int sein Fall foo.com.

Können Sie mir helfen, die Syntax der letzten Zeile korrekt? MSN hat einige gute Dokumentation für die Funktion eingewickelt aber die args scheinen die zu denen der python-Bibliothek nicht perfekt abzubilden.

Die feste Version dieses Skript sollte:

  • Die Lage sein, zu sehen, welche Proxy zu verwenden für einen bestimmten URL.

  • Es sollte immer genau tun, was Internet Explorer tun würde (das heißt den gleichen Proxy verwenden)

  • Es sollte auf jeden gültigen Windows XP-Setup gültig. Das bedeutet, dass es mit einem explizit konfigurierten Proxy und auch kein Proxy überhaupt funktionieren soll.

  • Es braucht nur mit Python 2.4.4 auf Windows XP 32-Bit zu arbeiten. Es kann jede offizielle freigegebene Version von win32com verwenden.

Ich verwende Python2.4.4 mit win32com unter Windows XP.

UPDATE 0:

oder ... können Sie mir eine alternative Implementierung in ctypes geben? Solange ich es kann ich bin glücklich machen arbeiten!

War es hilfreich?

Lösung

Hier ist der Code, die HINTERNET Sitzung erstellt und verwendet die Proxy-Details zu erhalten, ctypes mit direkt auf winhttp DLL zuzugreifen. Es funktioniert ohne Fehler, aber ich habe keinen Proxy-Satz auf meinem Rechner, können Sie es einige Konstanten richtig machen zwicken müssen. Gehen Sie durch die Msdn Links in Code, von wo aus ich die API gesehen haben.

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

Andere Tipps

Es sei denn, ein starker Grund ist win32inet für den Einsatz (was aufgrund der Beschränkungen von SWIG in diesem Bereich chaotisch ist), empfehle ich, dass Sie ctypes anstelle.

Mindestens mit Python 2.7.6 und Pywin 218 unter Windows XP x86 und Windows 8 x64, es funktioniert:

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

wert zu erwähnen, dass das Beispiel der Autoproxy-Option WINHTTP_AUTOPROXY_CONFIG_URL verwendet, um in einer expliziten URL zu übergeben. Sie können andere Optionen verwenden, zum Beispiel, wenn Sie DNS oder DHCP automatisch zu erkennen mögen, mit was Sie tun können:

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

Hier finden Sie weitere Optionen in dem obigen Link zeigte (im Code)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top