Сценарий python устанавливает агента IE через реестр. После проверки он не может открываться или закрываться одновременно - PullRequest
0 голосов
/ 27 апреля 2020

см. Код. Я хочу открыть прокси, а затем закрыть прокси. на самом деле, я считаю, что это нормально, чтобы включить прокси и отключить прокси, но они не могут быть использованы одновременно. Я еще не нашел решение. Пожалуйста, помогите мне. Спасибо

import ctypes
import winreg
import time
import requests

xpath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"
internet_set_option = ctypes.windll.Wininet.InternetSetOptionW
def setProxy(enable, proxy):
    try:
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, xpath, 0, winreg.KEY_WRITE)
        winreg.SetValueEx(key, "ProxyEnable", 0, winreg.REG_DWORD, enable)
        winreg.SetValueEx(key, "ProxyServer", 0, winreg.REG_SZ, proxy)
        # 关闭自动配置脚本
        winreg.SetValueEx(key, "AutoConfigURL", 0, winreg.REG_SZ, "")
        # 设置刷新
        INTERNET_OPTION_REFRESH = 37
        INTERNET_OPTION_SETTINGS_CHANGED = 39
        internet_set_option(0, INTERNET_OPTION_REFRESH, 0, 0)
        internet_set_option(0,INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)
    except Exception as e:
        print("ERROR: " + str(e))
    finally:
        None


def enableProxy(proxy):
    print(" Setting proxy")
    setProxy(1, proxy)
    print(" Setting success")

#关闭清空代理
def disableProxy():
    print(" Empty proxy")
    setProxy(0, "")
    print(" Empty success")

if __name__ == '__main__':
    enableProxy('42.51.13.68:16819')
    print(requests.get("http://dev.kdlapi.com/testproxy").text)
    time.sleep(1)
    disableProxy()
    print(requests.get("http://dev.kdlapi.com/testproxy").text)

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

После настройки параметров и реестра IE необходимо нажать клавишу F5, чтобы обновить sh браузер IE или перезапустить браузер IE. Более подробную информацию вы можете проверить по этой ссылке .

0 голосов
/ 29 апреля 2020

Причина в том, что с точки зрения refre sh и агент настройки, и агент закрытия должны быть обновлены до того, как они вступят в силу, и они должны быть обновлены после того, как они закрыты, прежде чем они вступят в силу

import os
import sys
import time
import socks
import socket
import winreg
import kdl
import requests
from ctypes import windll

#### 设置代理 #####
SETTING_PATH = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"
def _system_proxy(func):
    """系统代理装饰器"""

    def __wrapper(proxy_ip=u"", ignore_ip=u""):
        """
        系统代理设置
        :param proxy_ip: 代理ip
        :param ignore_ip: 忽略的ip
        :return: 开启状态,True开启,False关闭
        """
        internet_setting = winreg.OpenKey(winreg.HKEY_CURRENT_USER, SETTING_PATH, 0, winreg.KEY_ALL_ACCESS)
        internet_set_option = windll.Wininet.InternetSetOptionW

        def _set_key(name, value):
            """
            修改键值
            :param name: 系统键
            :param value: 键值
            """
            _, reg_type = winreg.QueryValueEx(internet_setting, name)
            winreg.SetValueEx(internet_setting, name, 0, reg_type, value)

        return func(_set_key, internet_set_option, proxy_ip, ignore_ip)

    return __wrapper


def system_proxy_status():
    """获取当前代理状态"""
    h_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, SETTING_PATH, 0, winreg.KEY_READ)
    ret_val = winreg.QueryValueEx(h_key, "ProxyEnable")
    try:
        ret_ser = winreg.QueryValueEx(h_key, "ProxyServer")
    except Exception as e:
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, SETTING_PATH, 0, winreg.KEY_WRITE)
        winreg.SetValueEx(key, "ProxyServer", 0, winreg.REG_SZ, "")
        ret_ser = winreg.QueryValueEx(h_key, "ProxyServer")
    winreg.CloseKey(h_key)
    return ret_val[0], ret_ser[0]


@_system_proxy
def open_system_proxy(_set_key, internet_set_option, proxy_ip=u"", ignore_ip=u""):
    """开启系统代理"""
    _set_key('ProxyEnable', 1)  # 启用
    if ignore_ip:
        _set_key('ProxyOverride', ignore_ip)  # 忽略的地址
    if proxy_ip:
        _set_key('ProxyServer', proxy_ip)  # 代理IP及端口
    internet_set_option(0, 37, 0, 0)
    internet_set_option(0, 39, 0, 0)
    return False if system_proxy_status()[0] == 0 else system_proxy_status()[1] == proxy_ip


@_system_proxy
def close_system_proxy(_set_key, internet_set_option, proxy_ip="", ignore_ip=""):
    """关闭系统代理"""
    internet_set_option(0, 37, 0, 0)
    internet_set_option(0, 39, 0, 0)
    _set_key('ProxyEnable', 0)  # 停用
    return False if system_proxy_status()[0] == 0 else system_proxy_status()[1] == proxy_ip

Однако установить его дважды подряд не представляется возможным.

def main():
    open_system_proxy(proxy_ip="114.231.105.223:22322")
    print(system_proxy_status())
    open_system_proxy(proxy_ip="101.22.195.128:22619")
    print(system_proxy_status())

if __name__ == '__main__':
    main()

Результат показывает, что дважды установленный IP-адрес одинаков, хотя я предоставляю другой прокси. ищу причину

(1, '')
(1, '114.231.105.223:22322')
(1, '114.231.105.223:22322')
...