rag_qavanin_api/bale_qabot.py
2025-11-10 14:27:55 +00:00

156 lines
4.8 KiB
Python

print(f'import bale madule ...')
import asyncio
import json
from fastapi import FastAPI, Request
from pydantic import BaseModel
import requests
import logging
import uvicorn
import chatbot_handler as ch
# ===========================
# پیکربندی اولیه
# ===========================
TOKEN = '2052165365:Tt7u2qXB9oRTPISeZ0wmoAGpPsIgjq-vAxM'
API_URL = f"https://tapi.bale.ai/bot{TOKEN}/"
# راه‌اندازی لاگر
logging.basicConfig(
filename="./baleqabot/bot.log",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
# ===========================
# define import model class
# ===========================
class Message(BaseModel):
chat: dict
text: str | None = None
class Update(BaseModel):
message: Message | None = None
# ===========================
# کلاس اصلی ربات بله
# ===========================
class BaleBot:
def __init__(self, token: str):
# self.api_url = f"https://api.bale.ai/bot{token}/"
self.api_url = API_URL
async def get_updates(self, offset = None):
params = {"timeout": 20}
if offset:
params["offset"] = offset
resp = requests.get(f"{self.api_url}getUpdates", params=params)
return resp.json().get("result", [])
async def send_message(self, chat_id: int, text: str, keyboard=None):
payload = {
"chat_id": chat_id,
"text": text,
"parse_mode": "HTML"
}
if keyboard:
payload["reply_markup"] = keyboard
try:
response = requests.post(self.api_url + "sendMessage", json=payload)
return response.json()
except Exception as e:
logging.error(f"Error sending message: {e}")
return None
async def get_latest_req_id(self):
latest_req_id = 0
with open('./baleqabot/requests.json', 'r', encoding='utf-8') as file:
prev_reqs = json.load(file)
if prev_reqs:
latest_req_id = prev_reqs[-1]['update_id']
return latest_req_id + 1
async def save_entery(self, update):
all_reqs = []
with open('./baleqabot/requests.json', 'r', encoding='utf-8') as file:
prev_reqs = json.load(file)
all_reqs.extend(prev_reqs)
all_reqs.extend(update)
with open('./baleqabot/requests.json', 'w', encoding='utf-8') as file:
data = json.dumps(all_reqs, ensure_ascii=False, indent=2)
file.write(data)
return True
async def handle_update(self, update_reqs: dict):
data = update_reqs[0]
if "message" not in data:
return
message = data["message"]
chat_id = message["chat"]["id"]
text = message.get("text", "").strip()
logging.info(f"Received message from {chat_id}: {text}")
if text == "/start":
reply = "سلام، من دستیار هوشمند قوانین هستم. لطفا پرسش خود را وارد نمائید ..."
# keyboard = {
# "keyboard": [["/help", "/status"]],
# "resize_keyboard": True,
# "one_time_keyboard": True
# }
self.send_message(chat_id, reply)
elif text == "/chat":
reply = "لطفا متن پرسش از قوانین را وارد نمائید ..."
self.send_message(chat_id, reply)
# elif text == "/help":
# reply = (
# "دستورهای موجود:\n"
# "/start - شروع ربات\n"
# "/chat - گفت‌گو با دستیار هوشمند قانون\n"
# "/status - وضعیت ربات"
# )
# self.send_message(chat_id, reply)
elif text == "/status":
reply = "ربات فعال است ✅"
self.send_message(chat_id, reply)
else:
answer = await chat.run_chatbot(text, chat.create_chat_id())
if answer:
reply = answer
else:
reply = 'خطا در تولید پاسخ!'
self.send_message(chat_id, reply)
async def bale_main():
print(f'bale-qabot is Readey!!!!')
while True:
last_req_id = bale_bot.get_latest_req_id()
update = bale_bot.get_updates(last_req_id)
if update:
bale_bot.save_entery(update)
bale_bot.handle_update(update)
print('ok')
# ===========================
# ساخت اپلیکیشن FastAPI
# ===========================
# app = FastAPI()
bale_bot = BaleBot(TOKEN)
result = asyncio.run(bale_main())
# ===========================
# (local execution)
# ===========================
if __name__ == "__main__":
# uvicorn.run("chatbot:app", host="https://bale.tavasi.ir/", port=5000)
bale_main()