Repository: Germey/ADSLProxyPool Branch: master Commit: 10af51b58711 Files: 11 Total size: 7.1 KB Directory structure: gitextract_y7d4rabp/ ├── .gitignore ├── README.md ├── client/ │ ├── __init__.py │ ├── config.py │ └── sender.py ├── client.py ├── server/ │ ├── __init__.py │ ├── config.py │ ├── db.py │ └── receiver.py └── server.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ /.idea *.pyc ================================================ FILE: README.md ================================================ # ADSL拨号服务器代理设置 更优的选择:https://github.com/Python3WebSpider/AdslProxy ## 服务端 服务端即远程主机 ### 安装Python Python3版本 ### 安装库 ``` pip3 install redis tornado ``` ### Clone项目 ``` git clone https://github.com/Germey/ADSLProxyPool.git ``` ### 安装Redis 安装Redis并启动服务 ### 修改配置 ``` cd server vi config.py ``` 根据注释修改配置文件 ### 运行 根目录运行 ``` python3 server.py ``` ## 客户端 客户端即拨号主机 ### 安装Python Python3版本 ### 安装库 ``` pip3 install requests ``` ### Clone项目 ``` git clone https://github.com/Germey/ADSLProxyPool.git ``` ### 修改配置 ``` cd server vi config.py ``` 根据注释修改配置文件 ### 运行 根目录运行 ``` python3 client.py ``` ================================================ FILE: client/__init__.py ================================================ ================================================ FILE: client/config.py ================================================ # 拨号间隔 ADSL_CYCLE = 100 # ADSL命令 ADSL_BASH = 'adsl-stop;adsl-start' # 代理端口 PROXY_PORT = 8888 # 服务器地址 SERVER_URL = 'http://120.27.34.24:8000' # 通信秘钥 TOKEN = 'adsl' # 客户端唯一标识 CLIENT_NAME = 'adsl1' # 拨号网卡 ADSL_IFNAME = 'ppp0' ================================================ FILE: client/sender.py ================================================ import re import subprocess import time from client.config import * import requests from requests.exceptions import ConnectionError class Sender(): def get_ip(self, ifname=ADSL_IFNAME): (status, output) = subprocess.getstatusoutput('ifconfig') if status == 0: pattern = re.compile(ifname + '.*?inet.*?(\d+\.\d+\.\d+\.\d+).*?netmask', re.S) result = re.search(pattern, output) if result: ip = result.group(1) return ip def adsl(self): while True: print('ADSL Start, Please wait') (status, output) = subprocess.getstatusoutput(ADSL_BASH) if status == 0: print('ADSL Successfully') ip = self.get_ip() if ip: print('New IP', ip) try: requests.post(SERVER_URL, data={'token': TOKEN, 'port': PROXY_PORT, 'name': CLIENT_NAME}) print('Successfully Sent to Server', SERVER_URL) except ConnectionError: print('Failed to Connect Server', SERVER_URL) time.sleep(ADSL_CYCLE) else: print('Get IP Failed') else: print('ADSL Failed, Please Check') time.sleep(1) def run(): sender = Sender() sender.adsl() if __name__ == '__main__': run() ================================================ FILE: client.py ================================================ from client.sender import run if __name__ == '__main__': run() ================================================ FILE: server/__init__.py ================================================ ================================================ FILE: server/config.py ================================================ # Redis数据库IP REDIS_HOST = 'localhost' # Redis数据库密码, 如无则填None REDIS_PASSWORD = 'foobared' # Redis数据库端口 REDIS_PORT = 6379 # 代理池键名 PROXY_KEY = 'adsl' # 通信秘钥 TOKEN = 'adsl' # 验证URL TEST_URL = 'http://www.baidu.com' # 接收器运行端口 RECEIVER_PORT = 8000 # 检测间隔 TEST_CYCLE = 20 ================================================ FILE: server/db.py ================================================ import redis import random from server.config import * class RedisClient(object): def __init__(self, host=REDIS_HOST, port=REDIS_PORT): self.db = redis.Redis(host=host, port=port, password=REDIS_PASSWORD) self.proxy_key = PROXY_KEY def key(self, name): return '{key}:{name}'.format(key=self.proxy_key, name=name) def set(self, name, proxy): return self.db.set(self.key(name), proxy) def get(self, name): return self.db.get(self.key(name)).decode('utf-8') def count(self): return len(self.db.keys(self.key('*'))) def remove(self, name): return self.db.delete(self.key(name)) def keys(self): return [key.decode('utf-8').replace(self.proxy_key + ':', '') for key in self.db.keys(self.key('*'))] def all(self): keys = self.keys() proxies = [{'name': key, 'proxy': self.get(key)} for key in keys] return proxies def random(self): items = self.all() return random.choice(items).get('proxy') def list(self): keys = self.keys() proxies = [self.get(key) for key in keys] return proxies def first(self): return self.get(self.keys()[0]) if __name__ == '__main__': client = RedisClient() client.set('a', 'abc') client.set('c', 'abc2') client.set('c', 'abc3') client.set('b', 'abc4') client.remove('b') result = client.get('a') print(client.count()) print(client.all()) print(result) ================================================ FILE: server/receiver.py ================================================ import json from urllib.parse import urlencode, parse_qs, urlsplit import tornado.ioloop import tornado.web from tornado.curl_httpclient import CurlAsyncHTTPClient from tornado.web import RequestHandler, Application from server.config import * from server.db import RedisClient from tornado.httpclient import HTTPRequest class MainHandler(RequestHandler): redis = RedisClient() http_client = CurlAsyncHTTPClient(force_instance=True) def handle_proxy(self, response): request = response.request host = request.proxy_host port = request.proxy_port name = parse_qs(urlsplit(request.url).query).get('name')[0] proxy = '{host}:{port}'.format(host=host, port=port) if response.error: print('Request failed Using', proxy, response.error) print('Invalid Proxy', proxy, 'Remove it') self.redis.remove(name) else: print('Valid Proxy', name) def test_proxies(self): print('Test Proxies') items = self.redis.all() for item in items: self.test_proxy(item) def test_proxy(self, item): proxy = item.get('proxy') name = item.get('name') try: (proxy_host, proxy_port) = tuple(proxy.split(':')) print('Testing Proxy', name, proxy) test_url = TEST_URL + '?' + urlencode({'name': name}) request = HTTPRequest(url=test_url, proxy_host=proxy_host, proxy_port=int(proxy_port)) self.http_client.fetch(request, self.handle_proxy) except ValueError: print('Invalid Proxy', proxy) self.redis.remove(name) def post(self): token = self.get_body_argument('token', default=None, strip=False) port = self.get_body_argument('port', default=None, strip=False) name = self.get_body_argument('name', default=None, strip=False) if token == TOKEN and port: ip = self.request.remote_ip proxy = ip + ':' + port print('Receive proxy', proxy) self.redis.set(name, proxy) self.test_proxies() elif token != TOKEN: self.write('Wrong Token') elif not port: self.write('No Client Port') def get(self, api): if api == 'first': result = self.redis.first() if result: self.write(result) if api == 'random': result = self.redis.random() if result: self.write(result) if api == 'list': result = self.redis.list() print(result) if result: for proxy in result: self.write(proxy + '
') if api == 'count': self.write(str(self.redis.count())) def run(): application = Application([ (r'/', MainHandler), (r'/(.*)', MainHandler), ]) print('Listening on', RECEIVER_PORT) application.listen(RECEIVER_PORT) tornado.ioloop.IOLoop.instance().start() if __name__ == '__main__': run() ================================================ FILE: server.py ================================================ from server.receiver import run if __name__ == '__main__': run()