fudii0921 commited on
Commit
d9d289e
·
verified ·
1 Parent(s): af3fccb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -34
app.py CHANGED
@@ -2,6 +2,8 @@ import gradio as gr
2
  import sys
3
  import cohere
4
  import os
 
 
5
  from dotenv import load_dotenv
6
 
7
  # --- 初期設定 ---
@@ -10,36 +12,89 @@ from dotenv import load_dotenv
10
  load_dotenv(verbose=True)
11
  COHERE_API_KEY = os.environ.get("COHERE_API_KEY")
12
 
13
- co = cohere.ClientV2(api_key=COHERE_API_KEY)
14
-
15
- # --- 設定: 許可されたIPアドレスのリスト ---
16
- # ここにアクセスを許可したい具体的なクライアントIPアドレスをリストで設定してください。
17
- ALLOWED_IPS = ["127.0.0.1", "::1", "192.168.1.100", "0.0.0.0", "111.238.4.94"]
18
- #ALLOWED_IPS = ["::1", "192.168.1.100", "0.0.0.0"]
19
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  def req_process(prompt: str):
21
- res = co.chat(
22
- model="command-a-03-2025",
23
- messages=[
24
- {
25
- "role": "user",
26
- "content": f'{prompt}に答えてください',
27
- }
28
- ],
 
 
 
 
29
  )
30
-
31
- final = res.message.content[0].text
32
-
33
- return final
 
 
34
 
35
  # --- IPアドレス取得・チェック関数 ---
36
- def get_client_ip(request: gr.Request, ins) -> tuple[str, gr.update, gr.update]:
 
37
  """
38
  gr.RequestオブジェクトからクライアントのIPアドレスを抽出し、許可リストと比較します。
39
  戻り値: (ip_outputへのメッセージ, outs_outputの表示状態を制御するgr.update, main_content_groupの表示状態を制御するgr.update)
40
  """
41
  if not request:
42
- # IP情報がない場合は、エラーメッセージと全ての非表示を返す
43
  return "IPアドレス情報が利用できませんでした。", gr.update(visible=False), gr.update(visible=False)
44
 
45
  # 1. 実際のクライアントIPを特定する
@@ -49,9 +104,11 @@ def get_client_ip(request: gr.Request, ins) -> tuple[str, gr.update, gr.update]:
49
  # 外部アクセスの場合にチェックすべきIP (X-Forwarded-Forの最初のIP)
50
  check_ip = client_ip
51
  if forwarded_for:
 
52
  check_ip = forwarded_for.split(',')[0].strip()
53
 
54
  # 2. IPアドレスのチェック
 
55
  if check_ip in ALLOWED_IPS:
56
  # --- IPが許可されている場合 ---
57
 
@@ -60,12 +117,12 @@ def get_client_ip(request: gr.Request, ins) -> tuple[str, gr.update, gr.update]:
60
  else:
61
  display_msg = f"✅ アクセス許可: IPアドレスが許可リストに含まれています。\nクライアントIP (直接接続): {client_ip}"
62
 
63
- # outs_output(表示)、main_content_group(表示)
64
  return display_msg, gr.update(visible=True), gr.update(visible=True)
65
  else:
66
  # --- IPが拒否された場合 ---
67
 
68
- error_msg = f"❌ アクセス拒否: あなたのIPアドレス ({check_ip}) は許可されていません。\nアクセスを許可するには、ALLOWED_IPSリストにIP追加してください。"
69
 
70
  # outs_output(非表示)、main_content_group(非表示)
71
  return error_msg, gr.update(visible=False), gr.update(visible=False)
@@ -77,7 +134,7 @@ with gr.Blocks(title="アクセスIPチェッカー(IP制限)") as demo:
77
  """
78
  # Gradio アクセスIPアドレス確認ツール(IP制限付き)
79
 
80
- このアプリケーションは、スプト内の `ALLOWED_IPS` リストに登録されたIPアドレスからのみ、
81
  「制限されたメインコンテンツ」セクション全体を表示します。
82
 
83
  ---
@@ -93,21 +150,19 @@ with gr.Blocks(title="アクセスIPチェッカー(IP制限)") as demo:
93
  )
94
 
95
  # 2. 制限をかけたい主要なコンテンツを gr.Group で囲む
96
- # 初期状態では非表示に設定
97
  with gr.Group(visible=False) as main_content_group:
98
  gr.Markdown(
99
  """
100
- ## 制限されたメインコンテンツエリア
101
  このセクションは、許可されたIPアドレスからのみ表示されています。
102
  """
103
  )
104
 
105
- # outs_outputを初期状態で非表示に設定 (Groupで囲まれているため visible=False は redundantだが、明確化のため残す)
106
  outs_output = gr.Textbox(
107
- label="アクセテータス結果",
108
  interactive=False,
109
- lines=4,
110
- value="アクセテータスがアクティブです。",
111
  )
112
 
113
  ins_output = gr.Textbox(
@@ -119,7 +174,7 @@ with gr.Blocks(title="アクセスIPチェッカー(IP制限)") as demo:
119
  req_output = gr.Textbox(
120
  label="リクエスト結果",
121
  interactive=False,
122
- lines=4
123
  )
124
 
125
  exec_button = gr.Button("🚀 実行", variant="primary")
@@ -131,15 +186,15 @@ with gr.Blocks(title="アクセスIPチェッカー(IP制限)") as demo:
131
  )
132
 
133
  # ページのロードが完了したときに、自動的にIPアドレスのチェック関数を呼び出す
134
- # 戻り値は ip_output の内容、outs_output の表示状態、main_content_group の表示状態の3つ
135
  demo.load(
136
  fn=get_client_ip,
137
- inputs=[ins_output],
138
  outputs=[ip_output, outs_output, main_content_group]
139
  )
140
 
141
  # デモの起動 (ローカルで実行する場合)
142
  if __name__ == "__main__":
143
- print(f"許可されたIPアドレス: {ALLOWED_IPS}")
144
  print("Gradioアプリケーションを起動します。")
 
145
  demo.launch()
 
2
  import sys
3
  import cohere
4
  import os
5
+ import json
6
+ import requests
7
  from dotenv import load_dotenv
8
 
9
  # --- 初期設定 ---
 
12
  load_dotenv(verbose=True)
13
  COHERE_API_KEY = os.environ.get("COHERE_API_KEY")
14
 
15
+ # Cohereクライアントの初期化とエラーチェック
16
+ if COHERE_API_KEY:
17
+ try:
18
+ co = cohere.ClientV2(api_key=COHERE_API_KEY)
19
+ except Exception as e:
20
+ print(f"Cohereクライアント初期化エラー: {e}")
21
+ co = None
22
+ else:
23
+ print("⚠️ COHERE_API_KEYが設定されていません。AI機能は利用できません。")
24
+ co = None
25
+
26
+ # --- 設定: 許可されたIPアドレスのリストを外部から取得する関数 ---
27
+ # SQLコマンドのエンコードは維持
28
+ API_URL = "https://www.ryhintl.com/dbjson/getjson?sqlcmd=select%20*%20from%20allowed_ips"
29
+
30
+ def fetch_allowed_ips():
31
+ """指定されたAPIエンドポイントから許可IPリストを動的に取得する。"""
32
+ print(f"許可IPリストを外部URLから取得中: {API_URL}")
33
+
34
+ try:
35
+ response = requests.get(API_URL, timeout=10) # タイムアウトを設定
36
+ response.raise_for_status() # HTTPエラー(4xx, 5xx)をチェック
37
+
38
+ data = response.json()
39
+ print('data:', data) # 取得したデータを確認
40
+
41
+ # 新しいJSON構造 [{'allowed': 'IP1'}, {'allowed': 'IP2'}, ...] に合わせてパース
42
+ allowed_ips = []
43
+ if isinstance(data, list):
44
+ for item in data:
45
+ if isinstance(item, dict) and "allowed" in item:
46
+ ip = item["allowed"].strip()
47
+ if ip:
48
+ allowed_ips.append(ip)
49
+
50
+ if not allowed_ips:
51
+ print("警告: 外部DBから有効なIPアドレスが取得されませんでした。")
52
+
53
+ return allowed_ips
54
+
55
+ except requests.exceptions.RequestException as e:
56
+ print(f"APIリクエストエラー: {e}")
57
+ return []
58
+ except json.JSONDecodeError as e:
59
+ print(f"JSONパースエラー: {e}")
60
+ return []
61
+ except Exception as e:
62
+ print(f"予期せぬエラー: {e}")
63
+ return []
64
+
65
+ # スクリプト実行時に許可IPリストを初期化
66
+ ALLOWED_IPS = fetch_allowed_ips()
67
+
68
+ # --- Cohere 処理関数 ---
69
  def req_process(prompt: str):
70
+ if not co:
71
+ return "エラー: COHERE_API_KEYが設定されていないため、AI機能は実行できません。"
72
+
73
+ try:
74
+ res = co.chat(
75
+ model="command-a-03-2025",
76
+ messages=[
77
+ {
78
+ "role": "user",
79
+ "content": f'{prompt}に答えてください',
80
+ }
81
+ ],
82
  )
83
+ # Cohere V2 SDKのレスポンス構造に合わせる
84
+ final = res.message.content[0].text
85
+ return final
86
+ except Exception as e:
87
+ return f"Cohere APIエラーが発生しました: {e}"
88
+
89
 
90
  # --- IPアドレス取得・チェック関数 ---
91
+ # 関数定義から不要な 'ins' 引数を削除(修正済)
92
+ def get_client_ip(request: gr.Request) -> tuple[str, gr.update, gr.update]:
93
  """
94
  gr.RequestオブジェクトからクライアントのIPアドレスを抽出し、許可リストと比較します。
95
  戻り値: (ip_outputへのメッセージ, outs_outputの表示状態を制御するgr.update, main_content_groupの表示状態を制御するgr.update)
96
  """
97
  if not request:
 
98
  return "IPアドレス情報が利用できませんでした。", gr.update(visible=False), gr.update(visible=False)
99
 
100
  # 1. 実際のクライアントIPを特定する
 
104
  # 外部アクセスの場合にチェックすべきIP (X-Forwarded-Forの最初のIP)
105
  check_ip = client_ip
106
  if forwarded_for:
107
+ # X-Forwarded-Forヘッダーはコンマ区切りで複数のIPを含む場合があるため、最初のIPを使用
108
  check_ip = forwarded_for.split(',')[0].strip()
109
 
110
  # 2. IPアドレスのチェック
111
+ # ALLOWED_IPSはグローバル変数として既に定義されている
112
  if check_ip in ALLOWED_IPS:
113
  # --- IPが許可されている場合 ---
114
 
 
117
  else:
118
  display_msg = f"✅ アクセス許可: IPアドレスが許可リストに含まれています。\nクライアントIP (直接接続): {client_ip}"
119
 
120
+ # outs_output(表示)、main_content_group(表示)
121
  return display_msg, gr.update(visible=True), gr.update(visible=True)
122
  else:
123
  # --- IPが拒否された場合 ---
124
 
125
+ error_msg = f"❌ アクセス拒否: あなたのIPアドレス ({check_ip}) は許可されていません。\nアクセスを許可するには、外部DBの設定確認してください。"
126
 
127
  # outs_output(非表示)、main_content_group(非表示)
128
  return error_msg, gr.update(visible=False), gr.update(visible=False)
 
134
  """
135
  # Gradio アクセスIPアドレス確認ツール(IP制限付き)
136
 
137
+ このアプリケーションは、外部DBから取得したIPアドレスリストに登録されたIPからのみ、
138
  「制限されたメインコンテンツ」セクション全体を表示します。
139
 
140
  ---
 
150
  )
151
 
152
  # 2. 制限をかけたい主要なコンテンツを gr.Group で囲む
 
153
  with gr.Group(visible=False) as main_content_group:
154
  gr.Markdown(
155
  """
156
+ ## 制限されたメインコンテンツエリア (Cohere Chat機能)
157
  このセクションは、許可されたIPアドレスからのみ表示されています。
158
  """
159
  )
160
 
 
161
  outs_output = gr.Textbox(
162
+ label="接続ステータス",
163
  interactive=False,
164
+ lines=1,
165
+ value="接続ステータスがアクティブです。",
166
  )
167
 
168
  ins_output = gr.Textbox(
 
174
  req_output = gr.Textbox(
175
  label="リクエスト結果",
176
  interactive=False,
177
+ lines=8
178
  )
179
 
180
  exec_button = gr.Button("🚀 実行", variant="primary")
 
186
  )
187
 
188
  # ページのロードが完了したときに、自動的にIPアドレスのチェック関数を呼び出す
 
189
  demo.load(
190
  fn=get_client_ip,
191
+ inputs=[], # 入力コンポーネントは不要
192
  outputs=[ip_output, outs_output, main_content_group]
193
  )
194
 
195
  # デモの起動 (ローカルで実行する場合)
196
  if __name__ == "__main__":
197
+ print(f"許可されたIPアドレス (外部DBからの取得結果): {ALLOWED_IPS}")
198
  print("Gradioアプリケーションを起動します。")
199
+
200
  demo.launch()