Python中pysock使用设定默认代理导致无法上网问题如何解决

import socket import socks import requests

ip = '127.0.0.1' # change your proxy's ip port = 1080 # change your proxy's port socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, ip, port) socket.socket = socks.socksocket url = u'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=inurl%E8%A2%8B' print(requests.get(url).text)

使用 setdefaultproxy 方法导致无法使用 chrome 访问 google.com,见下图 http://wx2.sinaimg.cn/large/006pxShMly1feqo1kjem2j31100l4aco.jpg


Python中pysock使用设定默认代理导致无法上网问题如何解决

2 回复

我遇到过类似问题。pysocks设置代理后导致无法上网,通常是因为代理配置不当或库版本问题。下面是一个完整的解决方案:

import socket
import socks
import requests
from urllib.request import urlopen

# 方法1:正确设置全局代理(推荐)
def setup_proper_proxy():
    # 设置SOCKS5代理
    socks.set_default_proxy(
        socks.SOCKS5,  # 代理类型:SOCKS5/SOCKS4/HTTP
        "127.0.0.1",   # 代理服务器地址
        1080,          # 代理端口
        username=None, # 如果需要认证
        password=None
    )
    
    # 关键步骤:必须调用此方法让socket使用代理
    socket.socket = socks.socksocket
    
    # 测试连接
    try:
        response = urlopen("http://httpbin.org/ip", timeout=10)
        print("代理设置成功,当前IP:", response.read().decode())
    except Exception as e:
        print(f"连接失败: {e}")

# 方法2:为requests库单独设置代理(更安全)
def setup_requests_proxy():
    proxies = {
        'http': 'socks5://127.0.0.1:1080',
        'https': 'socks5://127.0.0.1:1080'
    }
    
    try:
        response = requests.get(
            "http://httpbin.org/ip",
            proxies=proxies,
            timeout=10
        )
        print("Requests代理成功:", response.json())
    except Exception as e:
        print(f"Requests代理失败: {e}")

# 方法3:清理代理设置(解决"无法上网"问题)
def reset_proxy():
    # 恢复原始socket
    socks.set_default_proxy()
    socket.socket = socket._socketobject or socket.socket
    
    # 或者直接重新导入socket模块
    import importlib
    importlib.reload(socket)
    print("代理设置已重置")

# 使用示例
if __name__ == "__main__":
    # 先尝试方法1
    setup_proper_proxy()
    
    # 如果还有问题,使用方法2
    setup_requests_proxy()
    
    # 最后记得重置(如果需要)
    reset_proxy()

常见问题及解决:

  1. 代理类型错误:确认你的代理是SOCKS5还是HTTP,用错类型会导致连接失败
  2. 端口被占用:检查1080端口是否被其他程序占用
  3. 代理服务器未运行:确保代理服务(如Shadowsocks、Clash)正在运行
  4. 库版本问题pip install pysocks 安装最新版

如果还是不行,可以尝试这个诊断脚本:

import socks
print(f"PySocks版本: {socks.__version__}")

# 测试直接socket连接
test_socket = socks.socksocket()
test_socket.settimeout(5)
try:
    test_socket.connect(("8.8.8.8", 53))
    print("基础网络连接正常")
except:
    print("基础网络有问题,可能不是代理的问题")

建议先用方法2,它不会影响全局网络。


求支持,求解答

回到顶部