from flask import Flask, jsonify, request, render_template import json import os import traceback from flask_cors import CORS API_VERSION = 'v0.1.0' app = Flask(__name__) CORS(app, resources={r"/*": {"origins": "*"}}) categories = { "ai_generated": ["#007bff", "AI content that's disguising as non-AI. Not counting interactive AI tools like chatbots"], "non_conclusive": ["#28a792", "Anything that donesn't answer question in title"], "fake_news": ["#e29015", "Fake / incorrect information"], "sponsored": ["#6cd33c", "Sponsored product affecting article's recommendations"], "non_trustworthy": ["#c958e6", "Content is known to not being moderated and having controversial articles"], "scam": ["#e22626", "Scam / phishing / malware"], "anti_patterns": ["#6d45ca", "Deliberately bad design patterns, like fullscreen popups / autoplay ads with audio / paywalls"] } def strip_url(url: str): stripped_url = url.rstrip('/').lstrip('https://').lstrip('http://').lstrip('www.') return stripped_url def strip_hostname(url: str): stripped_hostname = strip_url(url).split('/')[0].split('?')[0].split('#')[0] return stripped_hostname queries = 0 requests = 0 def count_queries(number: int): global queries global requests with open('db/queries.txt', 'r') as f: data = f.readlines() queries = int(data[0]) requests = int(data[1]) queries += number requests += 1 with open('db/queries.txt', 'w') as f: f.write(str(queries) + '\n' + str(requests)) @app.route('/api/sites', methods=['POST']) def sites(): with open('db/db.json', 'r') as f: sites = json.load(f) urls = request.get_json() if not isinstance(urls, list): return "expected a list of URLs", 400 result = {} print(f'analising {len(urls)} urls') for url in urls: result[url] = [] site = sites.get(strip_url(url)) if site: result[url] = site site = sites.get(strip_hostname(url)) if site: result[url] = site count_queries(len(urls)) return jsonify(result) @app.route('/api/categories', methods = ['GET']) def get_categories(): return categories @app.route('/api/version', methods = ['GET']) def get_api_version(): return API_VERSION @app.route('/api/submit', methods = ['POST']) def submit(): try: with open('db/db.json', 'r') as f: jason = json.load(f) item = request.get_json() key = strip_url(item['url']) hostname = strip_hostname(key) value1 = item['category'].lower() value2 = item['text'] value3 = item['type'].lower() if value3 not in ['website', 'article']: return f"User field not implemented in {hostname}", 500 if value3 == 'website': key = hostname jason[key] = [value1, value2, value3] with open('db/db.json', 'w') as f: json.dump(jason, f, indent=4) except: return traceback.format_exc(), 500 return "Ok", 201 @app.route('/') def main(): print('searching for db file...') if not os.path.exists('db/db.json'): print('creating db.json file') with open('db/db.json', 'w') as f: f.write('{}') if not os.path.exists('db/queries.txt'): with open('db/queries.txt', 'w') as f: f.write('0\n0') return render_template('index.html', queries=queries, requests=requests) if __name__ == '__main__': print('searching for db file...') if not os.path.exists('db/db.json'): print('creating db.json file') with open('db/db.json', 'w') as f: f.write('{}') app.run(host='0.0.0.0', port=5000)