from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy from sqlalchemy.orm import backref from flask_cors import CORS # Import CORS from flask_cors module from sqlalchemy import text app = Flask(__name__) CORS(app) # Enable CORS for your Flask app app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://IPSearch:R&>r"UhWArXy398@192.168.50.166/IPSearch' db = SQLAlchemy(app) class Website(db.Model): id = db.Column(db.Integer, primary_key=True) url = db.Column(db.String(2048), nullable=False) keywords = db.relationship('Keyword', backref='website', lazy=True) class Keyword(db.Model): id = db.Column(db.Integer, primary_key=True) word = db.Column(db.String(255), nullable=False) website_id = db.Column(db.Integer, db.ForeignKey('website.id'), nullable=False) def __repr__(self): return '' % self.word with app.app_context(): db.create_all() @app.route('/add_website', methods=['POST']) def add_website(): data = request.get_json() url = str(data.get('url')).lower().replace(" ", "") keywords = data.get('keywords', []) print("Received keywords:", keywords) # Debugging output if keywords is not None: website = Website(url=url) db.session.add(website) db.session.commit() for word in keywords: # Convert each keyword to lowercase keyword = Keyword(word=word.lower(), website_id=website.id) db.session.add(keyword) db.session.commit() else: return jsonify({'message': 'No keywords'}), 418 return jsonify({'message': 'Website added successfully'}), 201 @app.route('/search', methods=['POST']) def search(): data = request.get_json() keywords = data.get('keywords', []) #Make the query lowercase keywords = [x.lower() for x in keywords] print(keywords) # Construct the initial query with a limit of 50 results query = "SELECT * FROM Keyword WHERE " + " OR ".join([f"word LIKE '%{kw}%'" for kw in keywords]) + " LIMIT 50" with db.engine.connect() as connection: # Execute the initial query result = connection.execute(text(query)) results = result.mappings().all() # Iterate over the results and execute the second query for each website_id output = [] for row in results: website_id = row['website_id'] keyword = row['word'] second_query = text(''' SELECT url FROM Website WHERE id = :website_id; ''') second_result = connection.execute(second_query, {'website_id': website_id}) urls = [r['url'] for r in second_result.mappings().all()] # Append URLs and keywords to the output for url in urls: output.append({'url': url, 'keywords': keyword}) # Close the connection connection.close() return jsonify(output) @app.route('/random', methods=['GET']) def random_websites(): with db.engine.connect() as connection: # Query to select 50 random websites result = connection.execute(text(''' SELECT url FROM Website ORDER BY RANDOM() LIMIT 50; ''')) websites = [row[0] for row in result] connection.close() return jsonify(websites) if __name__ == '__main__': app.run(debug=False, host="0.0.0.0")