rev proxy
This commit is contained in:
parent
7e3a130db1
commit
3f2f7475f2
50
app.py
50
app.py
@ -1,14 +1,56 @@
|
|||||||
from flask import Flask, session, request, redirect
|
from flask import Flask, session, request, redirect, Response
|
||||||
import os
|
import os, requests, time
|
||||||
from blueprints.article import article
|
from hashlib import sha256
|
||||||
from supaclient import supaClient
|
from supaclient import supaClient
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
URL = os.getenv("SUPABASE_IP") + "/"
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config["SECRET_KEY"] = os.urandom(64)
|
app.config["SECRET_KEY"] = os.urandom(64)
|
||||||
app.shared_resource = supaClient()
|
app.shared_resource = supaClient()
|
||||||
|
|
||||||
# blueprints
|
# blueprints
|
||||||
app.register_blueprint(article, url_prefix = '/api/article')
|
|
||||||
|
# main
|
||||||
|
@app.route("/")
|
||||||
|
def index(): return "Hello, world!"
|
||||||
|
|
||||||
|
# reverse proxy
|
||||||
|
@app.route('/r/<path:path>',methods=['GET', 'POST'])
|
||||||
|
def proxy(path):
|
||||||
|
if request.method=='GET':
|
||||||
|
headers = request.headers
|
||||||
|
resp = requests.get(f'{URL}{path}', headers = headers) # forward
|
||||||
|
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
|
||||||
|
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
|
||||||
|
response = Response(resp.content, resp.status_code, headers)
|
||||||
|
return response
|
||||||
|
elif request.method=='POST':
|
||||||
|
# get items
|
||||||
|
headers = request.headers
|
||||||
|
json_ctx = request.get_json()
|
||||||
|
|
||||||
|
# process
|
||||||
|
if path == "rest/v1/niming_posts": # niming post
|
||||||
|
# hash
|
||||||
|
hash = sha256( (json_ctx["content"] + str(time.time())).encode() ).hexdigest()
|
||||||
|
|
||||||
|
# ig posting
|
||||||
|
igid = None
|
||||||
|
|
||||||
|
# edit payload
|
||||||
|
json_ctx["hash"] = hash
|
||||||
|
json_ctx["igid"] = igid
|
||||||
|
|
||||||
|
# forward
|
||||||
|
resp = requests.post(f'{URL}{path}',json=json_ctx, headers = headers) # forward
|
||||||
|
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
|
||||||
|
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
|
||||||
|
response = Response(resp.content, resp.status_code, headers)
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
# run
|
# run
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
# /api/article
|
|
||||||
# 負責公開範圍內的資料上傳與存取
|
|
||||||
|
|
||||||
from flask import Blueprint, current_app, request
|
|
||||||
from supabase import Client
|
|
||||||
from hashlib import sha256
|
|
||||||
import time, math
|
|
||||||
|
|
||||||
article = Blueprint('article', __name__)
|
|
||||||
|
|
||||||
# listing - public
|
|
||||||
# /api/article/list?page=&count=
|
|
||||||
@article.route("/list", methods = ["GET"])
|
|
||||||
def list():
|
|
||||||
page = int(request.args.get("page"))
|
|
||||||
count = int(request.args.get("count"))
|
|
||||||
|
|
||||||
client: Client = current_app.shared_resource.client
|
|
||||||
response = client.table("niming_posts").select("id, content, igid, created_at").order("id", desc = True).range(start=page*count, end=(page+1)*count-1).execute()
|
|
||||||
|
|
||||||
return response.data
|
|
||||||
|
|
||||||
# fetching article - public
|
|
||||||
# /api/article/get?id=
|
|
||||||
@article.route("/get", methods = ["GET"])
|
|
||||||
def get():
|
|
||||||
id = str(int(request.args.get("id")))
|
|
||||||
|
|
||||||
client: Client = current_app.shared_resource.client
|
|
||||||
response = client.table("niming_posts").select("id, content, igid, created_at").eq("id", id).execute()
|
|
||||||
|
|
||||||
return response.data
|
|
||||||
|
|
||||||
# new post - public
|
|
||||||
@article.route("/post", methods = ["POST"])
|
|
||||||
def post():
|
|
||||||
# variables
|
|
||||||
ctx = request.form.get("ctx")
|
|
||||||
if ctx is None: return "No content"
|
|
||||||
else: ctx = str(ctx)
|
|
||||||
# future - images
|
|
||||||
# future - videos
|
|
||||||
|
|
||||||
# IG API Part
|
|
||||||
|
|
||||||
# hash
|
|
||||||
t = str(math.floor(time.time()*10000000))
|
|
||||||
hash = sha256( ( ctx + t ).encode() ).hexdigest()
|
|
||||||
|
|
||||||
# Supabase
|
|
||||||
client: Client = current_app.shared_resource.client
|
|
||||||
response = (client.table("niming_posts").insert({
|
|
||||||
"content": ctx,
|
|
||||||
"hash": hash
|
|
||||||
}).execute())
|
|
||||||
|
|
||||||
# log
|
|
||||||
|
|
||||||
return response.data
|
|
||||||
|
|
||||||
# 發文者專用 - 發文者有義務記住並保護好自己發的文章的sha256
|
|
||||||
# fetching article - article owner
|
|
||||||
@article.route("/owner/get", methods = ["GET"])
|
|
||||||
def owner_list():
|
|
||||||
hash = str(request.args.get("hash"))
|
|
||||||
|
|
||||||
client: Client = current_app.shared_resource.client
|
|
||||||
response = client.table("niming_posts").select("id, content, igid, created_at, hash").eq("hash", hash).execute()
|
|
||||||
|
|
||||||
return response.data
|
|
||||||
|
|
||||||
# delete article - article owner
|
|
||||||
# Coming Soon...
|
|
Loading…
Reference in New Issue
Block a user