如何让任意python程序使用socks代理

问题描述

在尝试学习Flutter项目中的engine部分的源码的时候,需要先进行gclient sync操作来同步代码,而由于某些不可说的原因,会存在网络无法访问的问题,通常来讲我们可以通过设置系统代理的方式来解决,然而gclient并不会使用macOS的系统代理设置,所以需要从gclient下手,由于gclient是由python实现的,所以我们可以使用下面提到的这一个trick。

另外这个技巧可以延伸到任意其他语言中,例如在go get ...操作中也遇到网络问题的话。

用词说明

目标程序 : 我们需要使用代理的应用程序

思路

  1. 修改urllib.py或者socket.py文件,这里可能需要注意下目标程序的具体实现是使用urllib还是socket,对于使用代理有基本的认识的可以很容易理解这一点,另外需要注意的一点是,如果修改下面提到的文件的话,会对系统中任何使用到该python运行时的其他程序产生影响,当然这个问题可以通过安装多个python运行时来规避,使用pyenv或者类似的工具实现起来很方便。

  2. 使用PySocks,可以通过pip install --user PySocks安装PySocks,当然这里也可以使用其他的package或者自己实现等等

然后如下修改,记住在修改之前备份要修改的文件,这是一个好习惯

如果修改urllib.py的话

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 1080)
socket.socket = socks.socksocket

如果修改socket.py的话

socket = SocketType = _socketobject       # 在socket.py找到这一行                 
# 在下面添加下面的代码

import socks                                                                
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 1080)      
socket = socks.socksocket   
  1. 代理的IP地址和端口号可以修改成自己的设置
  2. 注意使用的python版本,不要弄错了上述文件的位置

参考(Reference)

https://stackoverflow.com/questions/2317849/how-can-i-use-a-socks-4-5-proxy-with-urllib2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。