由于DDNS生效时间过长,对于爬虫等一些时间要求比较紧迫的项目就不太适用,为此本项目根据DDNS基本原理来实现实时获取ADSL拨号主机IP。
client文件夹由ADSL拨号客户机运行。它会定时执行拨号操作,然后请求某个固定地址的服务器,以便让服务器获取ADSL拨号客户机的IP,主要是定时bash脚本运行。
server文件夹是服务器端运行,利用Python的Flask搭建服务器,然后接收ADSL拨号客户机的请求,得到remote_addr,获取客户机拨号后的IP。
- config.py 配置文件。
- ip 客户端请求后获取的客户端IP,文本保存。
- main.py Flask主程序,提供两个接口,一个是接收客户端请求,然后将IP保存,另外一个是获取当前保存的IP。
- crontab 定时任务命令示例。
- pppoe.sh 拨号脚本,主要是实现重新拨号的几个命令。
- request.sh 请求服务器的脚本,主要是实现拨号后请求服务器的操作。
- request.conf 配置文件。
服务器提供两个功能,record方法是客户机定时请求,然后获取客户机IP并保存。proxy方法是供我们自己用,返回保存的客户机IP,提取代理。
git clone https://github.com/Germey/AutoProxy.git
安装Python版本2.7。
sudo apt-get install python2.7 python-pip
sudo yum install python27 python-pip
pip install flask werkzeug itsdangerous click
修改config.py文件
-
KEY 是客户端请求服务器时的凭证,在client的request.conf也有相同的配置,二者保持一致即可。
-
NEED_AUTH 在获取当前保存的IP(即代理的IP)的时候,为防止自己的主机代理被滥用,在获取IP的时候,需要加权限验证。
-
AUTH_USER和AUTH_PASSWORD分别是认证用户名密码。
-
PORT默认端口,返回保存的结果中会自动添加这个端口,组成一个IP:PORT的代理形式。
注意默认是8888,你需要用Squid或者TinyProxy配置下代理,端口是8888,这里端口8888即默认的拨号VPS的代理端口,这里配置下保证输出结果自动拼接端口。
cd server
nohup python main.py &
这样就会在5000端口启动服务,如果想修改端口,可以手动修改main.py里面的端口5000为其他。
git clone https://github.com/Germey/AutoProxy.git
修改request.conf文件
- KEY 是客户端请求服务器时的凭证,在server的config.py也有相同的配置,二者保持一致即可。
- SERVER是服务器项目运行后的地址,一般为http://<服务器IP>:<服务端口>/record。如
http://120.27.14.24:5000/record
。
修改pppoe.sh文件
这里面写上重新拨号的几条命令,记得在前两行配置一下环境变量,配置上拨号命令所在的目录,以防出现脚本无法运行的问题。
比如我的是
pppoe-stop
pppoe-start
当然有的主机可能是
adsl-stop
adsl-start
不同主机拨号命令不一样,在这里把停止和启动拨号的命令写上。具体请看服务商提供的拨号命令。
设置定时任务
crontab -e
输入crontab的实例命令
*/5 * * * * /var/py/AutoProxy/client/request.sh /var/py/AutoProxy/client/request.conf >> /var/py/AutoProxy/client/request.log
注意修改路径,你的项目在哪里,都统一修改成自己项目的路径。
最前面的*/5是5分钟执行一次。
好了,保存之后,定时任务就会开启。
这样一来,访问服务器地址,就可以得到ADSL拨号客户机的IP了。
import requests
url = 'http://120.27.14.24:5000'
proxy = requests.get(url, auth=('admin', '123')).text
print(proxy)
实例结果:
116.208.97.22:8888
如果你有域名,可以自己解析一个域名,这样就可以直接请求自己的域名,拿到实时好用的代理了,而且定时更新。
import urllib2
proxy_handler = urllib2.ProxyHandler({"http": 'http://' + proxy})
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://httpbin.org/get')
print response.read()
import requests
proxies = {
'http': 'http://' + proxy,
}
r = requests.get('http://httpbin.org/get', proxies=proxies)
print(r.text)