any-env-code / chatgpt.py
izuemon's picture
Update chatgpt.py
8bf34f8 verified
import os
import time
import json
import requests
# ===== Channel.io 設定 =====
CHANNEL_ID = "200605"
GROUP_ID = "534868"
ASSISTANT_PERSON_ID = "595702"
MESSAGES_URL = f"https://desk-api.channel.io/desk/channels/{CHANNEL_ID}/groups/{GROUP_ID}/messages"
X_ACCOUNT = os.getenv("channeliotokenbot2")
if not X_ACCOUNT:
raise RuntimeError("環境変数 channeliotokenbot2 が設定されていません")
HEADERS = {
"accept": "application/json",
"accept-language": "ja",
"content-type": "application/json",
"x-account": X_ACCOUNT,
}
PARAMS = {
"sortOrder": "desc",
"limit": 50,
}
# ===== GPT API =====
GPT_API_URL = "https://izuemon-gpt-free-api.hf.space/v1/chat/completions"
# ===== Utils =====
def get_messages():
res = requests.get(
MESSAGES_URL,
headers=HEADERS,
params=PARAMS,
timeout=30,
)
res.raise_for_status()
return res.json().get("messages", [])
def build_chat_messages(messages):
"""
Channel.io の messages から
ChatGPT 互換 messages を生成
"""
chat_messages = []
# 古い順に並び替え
messages = sorted(
messages,
key=lambda m: m.get("createdAt", 0)
)
for msg in messages:
plain = msg.get("plainText")
if not plain:
continue
role = (
"assistant"
if str(msg.get("personId")) == ASSISTANT_PERSON_ID
else "user"
)
chat_messages.append({
"role": role,
"content": plain
})
return chat_messages
def call_gpt(chat_messages):
payload = {
"model": "gpt-3.5-turbo",
"messages": chat_messages,
}
res = requests.post(
GPT_API_URL,
headers={"Content-Type": "application/json"},
data=json.dumps(payload),
timeout=60,
)
res.raise_for_status()
data = res.json()
return data["choices"][0]["message"]["content"]
def send_to_channel(text):
payload = {
"requestId": f"desk-web-{int(time.time() * 1000)}",
"blocks": [
{"type": "text", "value": text}
],
}
res = requests.post(
MESSAGES_URL,
headers=HEADERS,
data=json.dumps(payload),
timeout=30,
)
res.raise_for_status()
# ===== Main Loop =====
def main():
last_processed_id = None
while True:
try:
messages = get_messages()
if not messages:
time.sleep(10)
continue
# 最新メッセージ(createdAt 最大)
latest = max(
messages,
key=lambda m: m.get("createdAt", 0)
)
latest_id = latest.get("id")
latest_person = str(latest.get("personId"))
latest_text = latest.get("plainText")
# 空メッセージは無視
if not latest_text:
time.sleep(10)
continue
# 既に処理済み
if latest_id == last_processed_id:
time.sleep(10)
continue
# 最後が GPT(595702)なら何もしない
if latest_person == ASSISTANT_PERSON_ID:
time.sleep(10)
continue
# GPT に送信
chat_messages = build_chat_messages(messages)
gpt_reply = call_gpt(chat_messages)
# Channel.io に返信
send_to_channel(gpt_reply)
last_processed_id = latest_id
print("送信完了")
except Exception as e:
print("エラー:", e)
import traceback
traceback.print_exc()
time.sleep(15)
if __name__ == "__main__":
main()