Spaces:
Sleeping
Sleeping
import os | |
import base64 | |
from flask import Flask, render_template, request, redirect, url_for | |
import pymysql | |
import magic | |
app = Flask(__name__) | |
# アップロードされたファイルを保存するためのディレクトリ | |
UPLOAD_FOLDER = 'uploads' | |
os.makedirs(UPLOAD_FOLDER, exist_ok=True) | |
# ファイルをbase64エンコードする関数 | |
def file_to_base64(file_path): | |
with open(file_path, "rb") as f: | |
return base64.b64encode(f.read()).decode('utf-8') | |
# 新しいプロジェクトをデータベースにアップロードする関数 | |
def upload_project(thumbnail, group, name, explanation, file_data): | |
pass | |
# プロジェクトのアップロードフォーム | |
def index(): | |
if request.method == 'POST': | |
# フォームからのデータを取得 | |
thumbnail_file = request.files['thumbnail'] | |
name = request.form['name'] | |
explanation = request.form['explanation'] | |
file_data_file = request.files['file_data'] | |
# 画像とファイルのBase64エンコード | |
if thumbnail_file: | |
thumbnail_path = os.path.join(UPLOAD_FOLDER, thumbnail_file.filename) | |
thumbnail_file.save(thumbnail_path) | |
thumbnail = file_to_base64(thumbnail_path) | |
else: | |
thumbnail = None # サムネイルがなければNoneに設定 | |
if file_data_file: | |
file_data_path = os.path.join(UPLOAD_FOLDER, file_data_file.filename) | |
file_data_file.save(file_data_path) | |
file_data = file_to_base64(file_data_path) | |
else: | |
file_data = None # txtファイルがない場合の処理 | |
group = "" # 所属グループは空白 | |
# プロジェクトをデータベースにアップロード | |
upload_project(thumbnail, group, name, explanation, file_data) | |
return redirect(url_for('index')) | |
return render_template('index.html') | |
def close(): | |
return """<script>if (window.opener) { | |
const hashParams = new URLSearchParams(window.location.hash.substring(1)); | |
const token = hashParams.get("access_token"); | |
if (token) { | |
window.opener.postMessage({ token }, "*"); | |
window.close(); | |
} | |
} | |
window.close(); | |
</script>""" | |
def close2(): | |
target_origin = request.args.get('target_origin', '*') # デフォルトはワイルドカード | |
return f"""<script> | |
if (window.opener) {{ | |
const hashParams = new URLSearchParams(window.location.hash.substring(1)); | |
const token = hashParams.get("access_token"); | |
if (token) {{ | |
window.opener.postMessage({{ token }}, "{target_origin}"); | |
window.close(); | |
}} | |
}} | |
window.close(); | |
</script>""" | |
def close3(): | |
target_origin = request.args.get('target_origin', '*') | |
return f''' | |
<!DOCTYPE html> | |
<html lang="ja"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>認証処理中...</title> | |
<script> | |
window.addEventListener('load', function () {{ | |
const hashParams = new URLSearchParams(window.location.hash.substring(1)); | |
const queryParams = new URLSearchParams(window.location.search); | |
const tokenData = {{ | |
access_token: hashParams.get('access_token'), | |
expires_in: hashParams.get('expires_in'), | |
error: hashParams.get('error') || queryParams.get('error'), | |
state: queryParams.get('state'), | |
close_window: true // ✅ ここで一緒に送る | |
}}; | |
console.log("Token Data:", tokenData); | |
if (window.opener && typeof window.opener.postMessage === 'function') {{ | |
try {{ | |
window.opener.postMessage(tokenData, '{target_origin}'); | |
console.log('✅ メッセージ送信成功'); | |
}} catch (e) {{ | |
console.error('❌ postMessage 送信エラー:', e); | |
window.opener.postMessage({{ error: 'postmessage_failed' }}, '{target_origin}'); | |
}} | |
setTimeout(() => window.close(), 500); | |
}} else {{ | |
console.warn("❌ window.opener が存在しません。ポップアップがブロックされた可能性があります。"); | |
document.body.innerHTML += '<p style="color:red;">ポップアップブロックが原因で処理が中断されました。<br>このウィンドウを閉じてやり直してください。</p>'; | |
}} | |
}}); | |
</script> | |
</head> | |
<body> | |
<div style="padding: 20px; text-align: center;"> | |
<h3>認証処理中...</h3> | |
<p>このウィンドウは自動的に閉じられます</p> | |
<button onclick="window.close()">手動で閉じる</button> | |
</div> | |
</body> | |
</html> | |
''' | |
def close4(): | |
query = request.query_string.decode() | |
return f''' | |
<html lang="ja"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>ログイン中...</title> | |
<script> | |
window.location.href = "https://scratch-school.ct.ws/login.php?{query}"; | |
</script> | |
</head> | |
<body> | |
<p>ログイン処理中です。しばらくお待ちください...</p> | |
</body> | |
</html> | |
''' | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=7860) | |