File size: 8,523 Bytes
d9644a4
 
b39131d
 
 
 
 
7fcf52f
b39131d
1b0712a
e379dc2
41e717d
a143120
e379dc2
d9644a4
 
 
b39131d
 
 
 
 
 
 
 
 
4061714
b39131d
 
41e717d
4061714
41e717d
4061714
 
 
 
 
 
41e717d
 
4061714
b39131d
4061714
41e717d
4061714
 
 
 
41e717d
4061714
41e717d
 
b39131d
4061714
 
b39131d
 
 
 
 
 
 
 
 
 
4061714
 
 
b39131d
4061714
 
 
 
 
 
 
 
b39131d
 
 
4061714
41e717d
e379dc2
4061714
 
 
41e717d
 
 
 
b39131d
4061714
 
 
 
 
 
 
 
b39131d
4061714
 
 
 
 
 
 
 
 
b39131d
d9644a4
b39131d
d9644a4
b39131d
d9644a4
 
 
 
 
b39131d
d9644a4
 
2635613
d9644a4
 
 
 
b39131d
d9644a4
 
 
 
 
2c9d797
d9644a4
 
25ab453
d9644a4
 
 
 
b39131d
d9644a4
 
 
 
 
 
 
 
b8e7e5e
d9644a4
 
b8e7e5e
d9644a4
 
 
 
b39131d
d9644a4
 
 
 
 
 
4abd0ab
d9644a4
 
4abd0ab
d9644a4
 
 
 
b39131d
d9644a4
 
 
 
bc273b0
d9644a4
 
bc273b0
d9644a4
 
 
 
b39131d
d9644a4
 
 
7454a16
d9644a4
7454a16
d9644a4
 
 
b39131d
d9644a4
 
bf3028a
79b31ff
d9644a4
 
 
 
 
 
 
 
7fcf52f
d9644a4
b39131d
a143120
d9644a4
a143120
b39131d
 
 
 
 
 
 
 
 
 
 
4061714
 
e379dc2
41e717d
b39131d
41e717d
b39131d
4061714
324ca83
4061714
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
import logging
from typing import Optional
from flask import Flask, jsonify, request, abort, render_template
import json
import random
import string
import datetime
from webscout import WEBS
from functools import wraps
import requests
import os

app = Flask(__name__)

TIMEOUT = 10
PROXY = None

PRICING_PLANS = {
    'free': {
        'name': 'Free Plan',
        'price': '$0/month',
        'rate_limit': 1000
    },
    'pro': {
        'name': 'Pro Plan',
        'price': 'Coming Soon',
        'rate_limit': None  # Unlimited
    }
}

# Define the directories for API keys
API_KEYS_DIRECTORY = os.path.join(os.getcwd(), 'static', 'data')
FREE_API_KEYS_DIRECTORY = os.path.join(API_KEYS_DIRECTORY, 'free')
PAID_API_KEYS_DIRECTORY = os.path.join(API_KEYS_DIRECTORY, 'paid')

# Ensure directories exist
os.makedirs(FREE_API_KEYS_DIRECTORY, exist_ok=True)
os.makedirs(PAID_API_KEYS_DIRECTORY, exist_ok=True)

# Function to generate a new API key and save it to a file
def generate_api_key():
    current_date = datetime.datetime.now().strftime("%Y%m%d")
    username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=4))  # Generate a 4-character username
    api_key = 'HUAI' + username + current_date + ''.join(random.choices(string.ascii_uppercase + string.digits, k=5))
    
    # Determine the directory based on the plan
    api_keys_directory = FREE_API_KEYS_DIRECTORY if request.form.get('plan') == 'free' else PAID_API_KEYS_DIRECTORY
    
    # Save the API key to a file
    with open(os.path.join(api_keys_directory, username + '.txt'), 'w') as file:
        file.write(api_key)
    return api_key

# Middleware to require an API key for each request and enforce rate limits for free plan
# Middleware to require an API key for each request and enforce rate limits for free plan
def require_api_key(view_function):
    @wraps(view_function)
    def decorated_function(*args, **kwargs):
        # Check if the API key is provided in the headers
        api_key = request.headers.get('HUSI')

        # If not provided in headers, check query parameters
        if not api_key:
            api_key = request.args.get('HUAI')

        if not api_key:
            abort(401)  # Unauthorized
        
        if not validate_api_key(api_key):
            abort(401)  # Unauthorized
        
        # Check if it's a free plan and enforce rate limit
        if request.form.get('plan') == 'free':
            username = api_key[4:8]  # Extract username from API key
            if not check_rate_limit(username):
                abort(429)  # Too Many Requests
        
        return view_function(*args, **kwargs)
    return decorated_function


# Function to validate an API key by checking if it matches any file in the directory
def validate_api_key(api_key):
    api_keys_directory = FREE_API_KEYS_DIRECTORY if api_key.startswith('HUAI') else PAID_API_KEYS_DIRECTORY
    for filename in os.listdir(api_keys_directory):
        filepath = os.path.join(api_keys_directory, filename)
        with open(filepath, 'r') as file:
            if file.read().strip() == api_key:
                return True
    return False

# Function to check rate limit for free plan

def check_rate_limit(username):
    today_date = datetime.datetime.now().strftime("%Y%m%d")
    # Count the number of requests made by the user today
    requests_count = sum(1 for _ in os.listdir(FREE_API_KEYS_DIRECTORY) if _.startswith(username + '_' + today_date))
    return requests_count

# Routes with API key requirement
@app.route('/api/usage', methods=['GET'])
@require_api_key
def get_api_usage():
    # Extract username from API key
    api_key = request.headers.get('HUSI') or request.args.get('HUAI')
    username = api_key[4:8]
    # Get the usage count for the user
    usage_count = check_rate_limit(username)
    return jsonify({'username': username, 'usage_count': usage_count})

@app.route('/api/search', methods=['GET'])
@require_api_key
def search_text():
    
    query = request.args.get('q', '')
    max_results = request.args.get('max_results', 10, type=int)
    timelimit = request.args.get('timelimit', None)
    safesearch = request.args.get('safesearch', 'moderate')
    region = request.args.get('region', 'wt-wt')
    WEBS_instance = WEBS()
    results = []
    with WEBS() as webs:
        for result in enumerate(WEBS_instance.text(query, max_results=max_results, timelimit=timelimit, safesearch=safesearch, region=region)):
            results.append(result)
    return jsonify({'results': results})

@app.route('/api/images', methods=['GET'])
@require_api_key
def search_images():
    query = request.args.get('q', '')
    max_results = request.args.get('max_results', 10, type=int)
    safesearch = request.args.get('safesearch', 'moderate')
    region = request.args.get('region', 'wt-wt')
    WEBS_instance = WEBS()
    results = []
    with WEBS() as webs:
        for result in enumerate(WEBS_instance.images(query, max_results=max_results, safesearch=safesearch, region=region)):
            results.append(result)
    return jsonify({'results': results})

@app.route('/api/videos', methods=['GET'])
@require_api_key
def search_videos():
    query = request.args.get('q', '')
    max_results = request.args.get('max_results', 10, type=int)
    safesearch = request.args.get('safesearch', 'moderate')
    region = request.args.get('region', 'wt-wt')
    timelimit = request.args.get('timelimit', None)
    resolution = request.args.get('resolution', None)
    duration = request.args.get('duration', None)
    WEBS_instance = WEBS()
    results = []
    with WEBS() as webs:
        for result in enumerate(WEBS_instance.videos(query, max_results=max_results, safesearch=safesearch, region=region, timelimit=timelimit, resolution=resolution, duration=duration)):
            results.append(result)
    return jsonify({'results': results})

@app.route('/api/news', methods=['GET'])
@require_api_key
def search_news():
    query = request.args.get('q', '')
    max_results = request.args.get('max_results', 10, type=int)
    safesearch = request.args.get('safesearch', 'moderate')
    region = request.args.get('region', 'wt-wt')
    timelimit = request.args.get('timelimit', None)
    WEBS_instance = WEBS()
    results = []
    with WEBS() as webs:
        for result in enumerate(WEBS_instance.news(query, max_results=max_results, safesearch=safesearch, region=region, timelimit=timelimit)):
            results.append(result)
    return jsonify({'results': results})

@app.route('/api/maps', methods=['GET'])
@require_api_key
def search_maps():
    query = request.args.get('q', '')
    place = request.args.get('place', None)
    max_results = request.args.get('max_results', 10, type=int)
    WEBS_instance = WEBS()
    results = []
    with WEBS() as webs:
        for result in enumerate(WEBS_instance.maps(query, place=place, max_results=max_results)):
            results.append(result)
    return jsonify({'results': results})

@app.route('/api/translate', methods=['GET'])
@require_api_key
def translate_text():
    query = request.args.get('q', '')
    to_lang = request.args.get('to', 'en')
    WEBS_instance = WEBS()
    with WEBS() as webs:
        translation = enumerate(WEBS_instance.translate(query, to=to_lang))
    return jsonify({'translation': translation})

@app.route('/api/suggestions', methods=['GET'])
@require_api_key
def search_suggestions():
    query = request.args.get('q', '')
    if not query:
        return jsonify({'error': 'Query parameter missing'})
    results = []
    try:
        with WEBS() as webs:
            for result in webs.suggestions(query):
                results.append(result)
    except Exception as e:
        return jsonify({'error': str(e)}), 500
    return jsonify({'results': results})

@app.route('/api/health', methods=['GET'])
@require_api_key
def health_check():
    return jsonify({'status': 'working'})

import json
from flask import jsonify, request, abort

@app.route('/pricing', methods=['GET'])
def pricing():
    return render_template('pricing.html', plans=PRICING_PLANS)


@app.route('/generate_key', methods=['GET', 'POST'])
def generate_key():
    if request.method == 'POST':
        # Generate a new API key with a random username (userid)
        api_key = generate_api_key()
        
        return jsonify({'api_key': api_key}), 201
    else:
        # Render the form for GET requests
        return render_template('index.html', plans=PRICING_PLANS)

if __name__ == '__main__':
    app.run(debug=True)