151 lines
3.9 KiB
Python
151 lines
3.9 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
# !/usr/bin/env python
|
|||
|
|
"""
|
|||
|
|
-------------------------------------------------
|
|||
|
|
File Name: ProxyApi.py
|
|||
|
|
Description : WebApi
|
|||
|
|
Author : JHao
|
|||
|
|
date: 2016/12/4
|
|||
|
|
-------------------------------------------------
|
|||
|
|
Change Activity:
|
|||
|
|
2016/12/04: WebApi
|
|||
|
|
2019/08/14: 集成Gunicorn启动方式
|
|||
|
|
-------------------------------------------------
|
|||
|
|
"""
|
|||
|
|
__author__ = 'JHao'
|
|||
|
|
|
|||
|
|
import json
|
|||
|
|
import sys
|
|||
|
|
import platform
|
|||
|
|
import requests
|
|||
|
|
from werkzeug.wrappers import Response
|
|||
|
|
from flask import Flask, jsonify, request
|
|||
|
|
|
|||
|
|
sys.path.append('../')
|
|||
|
|
|
|||
|
|
from Config.ConfigGetter import config
|
|||
|
|
from Manager.ProxyManager import ProxyManager
|
|||
|
|
|
|||
|
|
app = Flask(__name__)
|
|||
|
|
|
|||
|
|
|
|||
|
|
class JsonResponse(Response):
|
|||
|
|
@classmethod
|
|||
|
|
def force_type(cls, response, environ=None):
|
|||
|
|
if isinstance(response, (dict, list)):
|
|||
|
|
response = jsonify(response)
|
|||
|
|
|
|||
|
|
return super(JsonResponse, cls).force_type(response, environ)
|
|||
|
|
|
|||
|
|
|
|||
|
|
app.response_class = JsonResponse
|
|||
|
|
|
|||
|
|
api_list = {
|
|||
|
|
'get': u'get an useful proxy',
|
|||
|
|
# 'refresh': u'refresh proxy pool',
|
|||
|
|
'get_all': u'get all proxy from proxy pool',
|
|||
|
|
'delete?proxy=127.0.0.1:8080': u'delete an unable proxy',
|
|||
|
|
'get_status': u'proxy number'
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/')
|
|||
|
|
def index():
|
|||
|
|
return api_list
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/get/')
|
|||
|
|
def get():
|
|||
|
|
proxy = ProxyManager().get()
|
|||
|
|
return proxy.info_json if proxy else {"code": 0, "src": "no proxy"}
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/refresh/')
|
|||
|
|
def refresh():
|
|||
|
|
# TODO refresh会有守护程序定时执行,由api直接调用性能较差,暂不使用
|
|||
|
|
# ProxyManager().refresh()
|
|||
|
|
pass
|
|||
|
|
return 'success'
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/get_all/')
|
|||
|
|
def getAll():
|
|||
|
|
proxies = ProxyManager().getAll()
|
|||
|
|
return jsonify([_.info_dict for _ in proxies])
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/delete/', methods=['GET'])
|
|||
|
|
def delete():
|
|||
|
|
proxy = request.args.get('proxy')
|
|||
|
|
ProxyManager().delete(proxy)
|
|||
|
|
return {"code": 0, "src": "success"}
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/get_status/')
|
|||
|
|
def getStatus():
|
|||
|
|
status = ProxyManager().getNumber()
|
|||
|
|
return status
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/get_balance')
|
|||
|
|
def getBalance():
|
|||
|
|
try:
|
|||
|
|
form_data = {
|
|||
|
|
'appkey': '0af3f486bb6988283af092cf24aace57',
|
|||
|
|
'uid': '341358'
|
|||
|
|
}
|
|||
|
|
# rsp = requests.post('https://api.ipidea.net/api/open/flow_left', data=form_data)
|
|||
|
|
rsp = requests.get('http://big_customer.willmam.com/index/index/get_my_balance?neek=112361&appkey=d2f6393b46afab108b038ab5b95f45d6')
|
|||
|
|
rsp_str = rsp.content.decode()
|
|||
|
|
rsp_json= json.loads(rsp_str)
|
|||
|
|
# if rsp_json['ret_data']['flow_left'] > 0:
|
|||
|
|
# rsp_json['flow_status'] = 'ok'
|
|||
|
|
if rsp_json['data']['balance'] > 0:
|
|||
|
|
rsp_json['balance_status'] = 'ok'
|
|||
|
|
return rsp_json
|
|||
|
|
except Exception as e:
|
|||
|
|
return repr(e)
|
|||
|
|
|
|||
|
|
|
|||
|
|
if platform.system() != "Windows":
|
|||
|
|
import gunicorn.app.base
|
|||
|
|
from six import iteritems
|
|||
|
|
|
|||
|
|
|
|||
|
|
class StandaloneApplication(gunicorn.app.base.BaseApplication):
|
|||
|
|
|
|||
|
|
def __init__(self, app, options=None):
|
|||
|
|
self.options = options or {}
|
|||
|
|
self.application = app
|
|||
|
|
super(StandaloneApplication, self).__init__()
|
|||
|
|
|
|||
|
|
def load_config(self):
|
|||
|
|
_config = dict([(key, value) for key, value in iteritems(self.options)
|
|||
|
|
if key in self.cfg.settings and value is not None])
|
|||
|
|
for key, value in iteritems(_config):
|
|||
|
|
self.cfg.set(key.lower(), value)
|
|||
|
|
|
|||
|
|
def load(self):
|
|||
|
|
return self.application
|
|||
|
|
|
|||
|
|
|
|||
|
|
def runFlask():
|
|||
|
|
app.run(host=config.host_ip, port=config.host_port)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def runFlaskWithGunicorn():
|
|||
|
|
_options = {
|
|||
|
|
'bind': '%s:%s' % (config.host_ip, config.host_port),
|
|||
|
|
'workers': 4,
|
|||
|
|
'accesslog': '-', # log to stdout
|
|||
|
|
'access_log_format': '%(h)s %(l)s %(t)s "%(r)s" %(s)s "%(a)s"'
|
|||
|
|
}
|
|||
|
|
StandaloneApplication(app, _options).run()
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
if platform.system() == "Windows":
|
|||
|
|
runFlask()
|
|||
|
|
else:
|
|||
|
|
runFlaskWithGunicorn()
|