Respan Dataset Explorer

Select one behavior. Every returned turn has one binary label: Present or Absent. Source: final dense boolean release.

5,167,182physical rows
86shards
0.00%qualified row coverage
0.00%qualified cell coverage
Random row JSON API

turns-00079.parquet:36177

a105c09fc922942df53f19af
turn 1/1gpt-4.1-mini-2025-04-14EnglishUkraine71 words
degenerate_repetitionAbsentFinal dense release
USER
You are a cognitive behavioral therapist. Based on the following summary of the user's problem, generate a list of 5 CBT-based tasks. Each task must have a title and a short description. Respond in the following markdown format:

1. **Title**  
   Description...
2. **Title**  
   Description...
3. **Title**  
   Description...
4. **Title**  
   Description...
5. **Title**  
   Description...

Summary: 
ASSISTANT
Could you please provide the summary of your problem so I can generate the appropriate CBT-based tasks?

turns-00079.parquet:36178

5e00c4d8fce5e91d7805fbb6
turn 1/1gpt-4.1-mini-2025-04-14ArabicUnited States64 words
degenerate_repetitionAbsentFinal dense release
USER
متى يخرج شعر الصدر
ASSISTANT
يبدأ ظهور شعر الصدر عادةً خلال فترة البلوغ، والتي تكون في العادة بين سن 12 و16 سنة، ولكن هذا يختلف من شخص لآخر بناءً على العوامل الوراثية والهرمونية. يظهر شعر الصدر عادة بعد بداية نمو شعر العانة ويكون جزءًا من علامات البلوغ عند الذكور. إذا كان لديك أي قلق بشأن نمو الشعر أو التطورات الجسدية، من الأفضل استشارة طبيب مختص.

turns-00079.parquet:36179

63650dd97169c16fe03e45d1
turn 1/1gpt-4.1-mini-2025-04-14EnglishGermany23 words
degenerate_repetitionAbsentFinal dense release
USER
User: hi, how are you?
User: hi, how are you?
Assistant:
ASSISTANT
Hello! I'm doing well, thank you. How can I assist you today?

turns-00079.parquet:36180

e614d00aa6722920c2e23a4c
turn 1/1gpt-4.1-mini-2025-04-14EnglishYemen2361 words
degenerate_repetitionAbsentFinal dense release
USER
اريد اصلاح الكود
للعلم انة بهذة الطريقة يعمل ويقوم بارجاع البيانات
import requests
from bs4 import BeautifulSoup

# رابط الصفحة — استبدل بالرابط الصحيح
url = "https://adsl-yemen.com/adsl4.php"  # استبدل بالرابط الحقيقي

# رقم الهاتف المطلوب الاستعلام عنه
mobile_number = "01220409"

# بيانات الـ POST
data = {"mobile": mobile_number, "action": "query"}

# إرسال الطلب
response = requests.post(url, data=data)

# التحقق من نجاح الطلب
if response.status_code == 200:
    # تحليل HTML
    soup = BeautifulSoup(response.text, 'html.parser')

    # استخراج النتائج (مثلاً)
    results = soup.find_all("div", class_="result-box")

    # تخزين القيم في dict
    data = {}
    for box in results:
        title_div = box.find("div", class_="result-title")
        value_div = box.find("div", class_="result-value")
        if title_div and value_div:
            title = title_div.text.strip()
            value = value_div.text.strip()
            data[title] = value

    print(data)

else:
    print("فشل في الاتصال بالموقع، الكود:", response.status_code)

اما عند استخدام هذه الطريقة لا يقوم بارجاع البيانات
# 🌟 استيراد المكتبات اللازمة
from bs4 import BeautifulSoup
import requests
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    ApplicationBuilder,
    CommandHandler,
    MessageHandler,
    ContextTypes,
    filters,
    CallbackQueryHandler,
    ConversationHandler,
    JobQueue
)
import logging
import nest_asyncio
import asyncio
from datetime import datetime, timedelta
import pytz
from tabulate import tabulate
import json
import os

# 🔄 تفعيل nest_asyncio للسماح بتشغيل event loop داخل بيئات Jupyter/Colab
nest_asyncio.apply()

# 🔑 توكن البوت (يجب تغييره إلى توكن بوتك الخاص)
TOKEN = "7563226990:AAFg2E5-f6EcVEjBK7ph5w8Q064P4daZlj0"

# 📝 إعداد تسجيل الأخطاء (Logging)
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

# 🗃️ حالات المحادثة للـ ConversationHandler
ADD_NUMBER, DELETE_NUMBER, SCHEDULE_HOUR, SCHEDULE_AMPM = range(4)

# 📂 ملفات تخزين الأرقام المجدولة والوقت
SAVED_NUMBERS_FILE = "saved_numbers.json"
SCHEDULED_TIMES_FILE = "scheduled_times.json"

# ⏰ المنطقة الزمنية لليمن
YEMEN_TZ = pytz.timezone('Asia/Aden')

# 💾 تحميل الأرقام المحفوظة من ملف JSON
def load_saved_numbers():
    if os.path.exists(SAVED_NUMBERS_FILE):
        try:
            with open(SAVED_NUMBERS_FILE, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception as e:
            logger.error(f"خطأ في تحميل الأرقام المحفوظة: {e}")
            return {}
    return {}

# 💾 تحميل الأوقات المجدولة من ملف JSON
def load_scheduled_times():
    if os.path.exists(SCHEDULED_TIMES_FILE):
        try:
            with open(SCHEDULED_TIMES_FILE, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception as e:
            logger.error(f"خطأ في تحميل الأوقات المجدولة: {e}")
            return {}
    return {}

# 💾 حفظ الأرقام المحفوظة في ملف JSON
def save_numbers_to_file(numbers):
    try:
        with open(SAVED_NUMBERS_FILE, 'w', encoding='utf-8') as f:
            json.dump(numbers, f, ensure_ascii=False, indent=4)
    except Exception as e:
        logger.error(f"خطأ في حفظ الأرقام المحفوظة: {e}")

# 💾 حفظ الأوقات المجدولة في ملف JSON
def save_scheduled_times(times):
    try:
        with open(SCHEDULED_TIMES_FILE, 'w', encoding='utf-8') as f:
            json.dump(times, f, ensure_ascii=False, indent=4)
    except Exception as e:
        logger.error(f"خطأ في حفظ الأوقات المجدولة: {e}")

# 💾 البيانات المحفوظة بالأرقام والأوقات
saved_numbers = load_saved_numbers()  # شكل: {user_id: [numbers]}
scheduled_times = load_scheduled_times()  # شكل: {user_id: {"hour": int, "ampm": "AM"/"PM"}}
scheduled_jobs = {}  # لتخزين الـ jobs التي ستُلغى أو تُحدث

# 🔍 دالة لجلب معلومات الرصيد من موقع ADSL اليمن
def get_adsl_info(phone_number: str):
    try:
        url = "http://adsl-yemen.com/adsl4.php"
        data = {
            'mobile': phone_number,
            'action': 'query'
        }
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
            'Referer': url,
            'Origin': 'http://adsl-yemen.com'
        }
        response = requests.post(url, data=data, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')

        # پيش فرض: استخراج على شكل div يحمل عناوين ثم قيم بجانبه
        def get_field_value(field_name):
            label = soup.find("div", string=field_name)
            if label:
                sib = label.find_next_sibling("div")
                if sib:
                    return sib.text.strip()
            return "غير متوفر"

        current_balance = get_field_value("الرصيد الحالي")
        package_value = get_field_value("قيمة الباقة")
        expiry_date = get_field_value("تاريخ الانتهاء")

        return {
            'current_balance': current_balance,
            'package_value': package_value,
            'expiry_date': expiry_date,
            'timestamp': datetime.now(YEMEN_TZ).strftime("%Y-%m-%d %H:%M:%S")
        }
    except requests.exceptions.RequestException as e:
        logger.error(f"خطأ في الاتصال بالموقع: {e}")
        return None
    except Exception as e:
        logger.error(f"حدث خطأ أثناء استعلام الرصيد: {e}")
        return None

# 📨 دالة لإرسال نتائج الاستعلام للمستخدم
async def send_balance_info(update_or_context, phone_number, info):
    if info:
        response = (
            f"📊 *نتائج استعلام رصيد ADSL*\n"
            f"══════════════════════════\n"
            f"📱 *الرقم:* `{phone_number}`\n"
            f"⏰ *وقت الاستعلام:* {info['timestamp']}\n\n"
            f"💵 *الرصيد الحالي:* `{info['current_balance']}`\n"
            f"💰 *قيمة الباقة:* `{info['package_value']}`\n"
            f"📅 *تاريخ الانتهاء:* `{info['expiry_date']}`\n\n"
            f"✨ يمكنك إضافة هذا الرقم إلى المحفوظات للاستعلام عنه لاحقاً"
        )
    else:
        response = (
            "⚠️ *عذراً، تعذر الحصول على معلومات الرصيد*\n"
            "══════════════════════════\n"
            "🛑 *الأسباب المحتملة:*\n"
            "• الرقم غير مسجل في خدمة ADSL\n"
            "• وجود مشكلة تقنية مؤقتة\n"
            "• خطأ في الاتصال بالخادم\n\n"
            "🔍 يرجى التأكد من الرقم والمحاولة لاحقاً"
        )
    # update_or_context يمكن أن يكون من نوع Update أو ContextTypes.DEFAULT_TYPE
    if hasattr(update_or_context, "message") and update_or_context.message:
        await update_or_context.message.reply_text(response, parse_mode='Markdown')
    elif hasattr(update_or_context, "reply_text"):
        await update_or_context.reply_text(response, parse_mode='Markdown')
    else:
        logger.warning("تعذر إرسال رسالة الاستعلام، لم يتم تحديد update أو context مناسب")

# 🧩 إدارة أزرار القائمة الرئيسية
async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    user_id = str(update.effective_user.id)

    if query.data == 'add_number':
        await query.edit_message_text("📥 الرجاء إرسال رقم الهاتف لإضافته (مثال: 777123456):")
        return ADD_NUMBER

    elif query.data == 'show_numbers':
        numbers = saved_numbers.get(user_id, [])
        if not numbers:
            text = "⚠️ لا توجد أرقام محفوظة لديك الآن."
        else:
            text = "📋 *الأرقام المحفوظة لديك:*\n\n" + "\n".join(f"▫️ {num}" for num in numbers)
        await query.edit_message_text(text, parse_mode='Markdown')
        return ConversationHandler.END

    elif query.data == 'query_numbers':
        numbers = saved_numbers.get(user_id, [])
        if not numbers:
            await query.edit_message_text("⚠️ لا توجد أرقام محفوظة للاستعلام عنها. أضف أولاً رقم باستخدام القائمة.")
            return ConversationHandler.END

        keyboard = [[InlineKeyboardButton(num, callback_data=f"query_{num}")] for num in numbers]
        keyboard.append([InlineKeyboardButton("🔙 العودة", callback_data='back_to_menu')])
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text("🔍 اختر رقم للاستعلام عن رصيده:", reply_markup=reply_markup)
        return ConversationHandler.END

    elif query.data.startswith('query_'):
        phone_number = query.data.split('_', 1)[1]
        await query.edit_message_text(f"⏳ جارٍ استعلام الرصيد للرقم: {phone_number} ...")
        info = await asyncio.to_thread(get_adsl_info, phone_number)
        await send_balance_info(update.callback_query, phone_number, info)
        await query.edit_message_text("✅ تم الانتهاء من الاستعلام.\n\n↩️ استخدم /start للرجوع إلى القائمة الرئيسية.")
        return ConversationHandler.END

    elif query.data == 'manage_numbers':
        numbers = saved_numbers.get(user_id, [])
        if not numbers:
            await query.edit_message_text("⚠️ لا توجد أرقام لإدارتها حالياً.")
            return ConversationHandler.END

        keyboard = [[InlineKeyboardButton(f"❌ حذف {num}", callback_data=f"delete_{num}")] for num in numbers]
        keyboard.append([InlineKeyboardButton("🔙 العودة", callback_data='back_to_menu')])
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text("🗑️ اختر رقم للحذف:", reply_markup=reply_markup)
        return DELETE_NUMBER

    elif query.data.startswith('delete_'):
        phone_number = query.data.split('_', 1)[1]
        numbers = saved_numbers.get(user_id, [])
        if phone_number in numbers:
            numbers.remove(phone_number)
            saved_numbers[user_id] = numbers
            save_numbers_to_file(saved_numbers)
            await query.edit_message_text(f"✅ تم حذف الرقم `{phone_number}` بنجاح.", parse_mode='Markdown')
        else:
            await query.edit_message_text("⚠️ الرقم غير موجود بالمحفوظات.")
        return ConversationHandler.END

    elif query.data == 'schedule_query':
        await query.edit_message_text(
            "⏰ قم باختيار الساعة التي تريد أن يتم الاستعلام التلقائي عندها:\n\n" +
            "\n".join(
                [f"{h} {'ص' if h < 12 else 'م'}" for h in range(1, 13)]
            )
        )
        keyboard = []
        for h in range(1, 13):
            keyboard.append([InlineKeyboardButton(str(h), callback_data=f"hour_{h}")])
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text("⏰ اختر الساعة من 1 إلى 12:", reply_markup=reply_markup)
        return SCHEDULE_HOUR

    elif query.data.startswith('hour_'):
        hour = int(query.data.split('_')[1])
        context.user_data['schedule_hour'] = hour
        keyboard = [
            [InlineKeyboardButton("ص (AM)", callback_data="ampm_AM"),
             InlineKeyboardButton("م (PM)", callback_data="ampm_PM")]
        ]
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text(f"⏰ اختر الفترة (ص / م) للساعة {hour}:", reply_markup=reply_markup)
        return SCHEDULE_AMPM

    elif query.data.startswith('ampm_'):
        ampm = query.data.split('_')[1]
        user_id = str(update.effective_user.id)
        hour = context.user_data.get('schedule_hour')
        if hour is None:
            await query.edit_message_text("❌ حدث خطأ: لم يتم اختيار الساعة.")
            return ConversationHandler.END
        
        # تحويل الساعة بص/م إلى 24 ساعة
        if ampm == "AM":
            hour_24 = hour % 12  # 12 صباحًا = 0 ساعة
        else:
            hour_24 = (hour % 12) + 12  # 12 مساءً = 12 ساعة أو غيرها

        scheduled_times[user_id] = {"hour": hour_24}
        save_scheduled_times(scheduled_times)
        
        # إلغاء جدولة سابقة إن وجدت
        if user_id in scheduled_jobs:
            scheduled_jobs[user_id].schedule_removal()
            del scheduled_jobs[user_id]

        # إضافة مهمة مجدولة جديدة
        app = context.application
        job = app.job_queue.run_daily(
            scheduled_query_callback,
            time=datetime.now(YEMEN_TZ).replace(hour=hour_24, minute=0, second=0, microsecond=0).timetz(),
            days=(0, 1, 2, 3, 4, 5, 6),
            context=user_id,
            name=user_id
        )
        scheduled_jobs[user_id] = job

        await query.edit_message_text(f"✅ تم جدولة الاستعلام التلقائي يومياً في الساعة {hour} {ampm}")
        return ConversationHandler.END

    elif query.data == "help":
        help_text = (
            "ℹ️ *كيفية استخدام بوت استعلام رصيد ADSL:*\n\n"
            "• أرسل رقم الهاتف مباشرة للاستعلام الفوري.\n"
            "• استخدم القائمة لإضافة أرقام، عرضها، أو جدولتها.\n"
            "• يمكنك جدولة استعلام يومي أو حذف أرقام من المحفوظات.\n"
            "• البوت يدعم المنطقة الزمنية لليمن.\n\n"
            "⚠️ *ملاحظة:* تأكد من إدخال رقم سليم ومن ضمن شبكة ADSL اليمن."
        )
        await query.edit_message_text(help_text, parse_mode='Markdown')
        return ConversationHandler.END

    elif query.data == 'refresh':
        await start(update, context)
        return ConversationHandler.END

    elif query.data == 'back_to_menu':
        await start(update, context)
        return ConversationHandler.END

    else:
        await query.edit_message_text("❌ خيار غير معروف، الرجاء المحاولة مرة أخرى.")
        return ConversationHandler.END

# 📨 إضافة رقم جديد
async def add_number(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    text = update.message.text.strip()
    if not text.isdigit():
        await update.message.reply_text("⚠️ الرقم غير صحيح، الرجاء إرسال رقم صحيح يتكون من أرقام فقط.")
        return ADD_NUMBER

    numbers = saved_numbers.get(user_id, [])
    if text in numbers:
        await update.message.reply_text("⚠️ هذا الرقم محفوظ لديك مسبقاً.")
        return ConversationHandler.END

    numbers.append(text)
    saved_numbers[user_id] = numbers
    save_numbers_to_file(saved_numbers)
    await update.message.reply_text(f"✅ تم إضافة الرقم `{text}` إلى المحفوظات.", parse_mode='Markdown')
    return ConversationHandler.END

# 🗑️ حذف رقم - المعالج هو CallbackQueryHandler لذلك أدرجناه في button_handler مباشرة

# ⏰ مهمة الاستعلام المجدول التي تعمل يومياً
async def scheduled_query_callback(context: ContextTypes.DEFAULT_TYPE):
    user_id = context.job.context
    user = await context.bot.get_chat(user_id)
    user_numbers = saved_numbers.get(user_id, [])
    if not user_numbers:
        logger.info(f"المستخدم {user_id} لا يملك أرقام محفوظة للاستعلام المجدول.")
        return

    for number in user_numbers:
        info = await asyncio.to_thread(get_adsl_info, number)
        message = (
            f"📅 *استعلام رصيد ADSL المجدول*\n"
            f"⏰ {datetime.now(YEMEN_TZ).strftime('%Y-%m-%d %H:%M:%S')}\n"
            f"📱 الرقم: `{number}`\n"
        )
        if info:
            message += (
                f"💵 الرصيد الحالي: `{info['current_balance']}`\n"
                f"💰 قيمة الباقة: `{info['package_value']}`\n"
                f"📅 تاريخ الانتهاء: `{info['expiry_date']}`"
            )
        else:
            message += "⚠️ لم نتمكن من جلب بيانات الرصيد."
        await context.bot.send_message(chat_id=user_id, text=message, parse_mode='Markdown')

# 📩 التعامل مع رسالة نصية عادية (أرسلت رقم للاستعلام السريع)
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text.strip()
    if text.isdigit():
        # استعلام سريع عن الرصيد لرقم واحد
        await update.message.reply_text(f"⏳ جارٍ استعلام رصيد الرقم {text} ...")
        info = await asyncio.to_thread(get_adsl_info, text)
        await send_balance_info(update, text, info)
    else:
        await update.message.reply_text("⚠️ يرجى إرسال رقم هاتف صالح للاستعلام أو استخدم /start لعرض القائمة.")

# 📛 معالج الأخطاء
async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE) -> None:
    logger.error(msg="حدث خطأ غير متوقع:", exc_info=context.error)
    if isinstance(update, Update) and update.message:
        await update.message.reply_text("❌ حدث خطأ داخلي، الرجاء المحاولة لاحقاً أو التواصل مع الدعم.")

# ⏰ فحص الأوقات المجدولة تلقائياً خلال الـ JobQueue (يمكن استخدامه للتحقق من تغيرات أخرى إذا أردت)
async def check_scheduled_times(context: ContextTypes.DEFAULT_TYPE):
    # لا حاجة لعمل أي شيء لأننا جدولنا run_daily لكل مستخدم سواء
    pass

# 🎉 أمر /start - الترحيب مع عرض القائمة الرئيسية
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    user = update.effective_user
    
    welcome_message = (
        f"✨ *مرحباً بك {user.first_name} في بوت استعلام رصيد ADSL اليمن* ✨\n\n"
        "🚀 *خدمات البوت المتكاملة:*\n"
        "▫️ استعلام فوري عن رصيد أي خط ADSL\n"
        "▫️ إدارة الأرقام المحفوظة بسهولة\n"
        "▫️ جدولة استعلامات تلقائية يومية\n"
        "▫️ عرض التقارير المفصلة\n\n"
        "📌 *كيفية الاستخدام:*\n"
        "▪️ أرسل رقم الهاتف مباشرة للاستعلام الفوري\n"
        "▪️ أو استخدم القائمة أدناه للوصول إلى جميع الميزات\n\n"
        "🔘 *الرجاء اختيار أحد الخيارات التالية:*"
    )
    
    keyboard = [
        [InlineKeyboardButton("➕ إضافة رقم جديد", callback_data='add_number'),
         InlineKeyboardButton("🗂️ عرض الأرقام", callback_data='show_numbers')],
        [InlineKeyboardButton("🔍 استعلام الأرقام", callback_data='query_numbers'),
         InlineKeyboardButton("🗑️ إدارة الأرقام", callback_data='manage_numbers')],
        [InlineKeyboardButton("⏰ جدولة تلقائية", callback_data='schedule_query'),
         InlineKeyboardButton("ℹ️ المساعدة", callback_data='help')],
        [InlineKeyboardButton("🔄 تحديث البوت", callback_data='refresh')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    if update.message:
        await update.message.reply_text(welcome_message, reply_markup=reply_markup, parse_mode='Markdown')
    elif update.callback_query:
        await update.callback_query.edit_message_text(welcome_message, reply_markup=reply_markup, parse_mode='Markdown')

# 🚀 تشغيل البوت
async def run_bot():
    application = ApplicationBuilder().token(TOKEN).build()

    job_queue = application.job_queue
    if job_queue:
        job_queue.run_repeating(check_scheduled_times, interval=60.0, first=10.0)

    conv_handler = ConversationHandler(
        entry_points=[CallbackQueryHandler(button_handler)],
        states={
            ADD_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, add_number)],
            DELETE_NUMBER: [CallbackQueryHandler(button_handler)],  # حذف رقم يتم من button_handler
            SCHEDULE_HOUR: [CallbackQueryHandler(button_handler)],
            SCHEDULE_AMPM: [CallbackQueryHandler(button_handler)]
        },
        fallbacks=[CommandHandler("start", start)],
        per_message=True
    )
    
    application.add_handler(CommandHandler("start", start))
    application.add_handler(conv_handler)
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
    application.add_error_handler(error_handler)

    logger.info("🤖 البوت يعمل...")
    await application.run_polling()

if __name__ == '__main__':
    try:
        asyncio.run(run_bot())
    except KeyboardInterrupt:
        logger.info("⏹️ إيقاف البوت بواسطة المستخدم")
    except Exception as e:
        logger.error(f"❌ فشل تشغيل البوت: {e}")
ASSISTANT
لديك نقطة مهمة جداً في الكود الخاص بك، وهي أن طريقة استخراج بيانات الاستعلام من موقع adsl-yemen تختلف في المثال البسيط عن الطريقة المستخدمة داخل البوت.

في المثال الأول (البسيط)، أنت تبحث عن div بالـ class `"result-box"`، ومن ثم تستخرج المحتوى بناءً على `"result-title"` و `"result-value"`.  
أما في الكود الخاص بالبوت، فتستخدم دالة `get_field_value` بالبحث عن div يحتوي على النص (`string=field_name`) ثم تستخدم العنصر الشقيق التالي (`find_next_sibling`) لاستخراج القيمة.

غالباً السبب أن موقع adsl-yemen يغير هيكل الصفحة بين طلب الـ POST العادي والطلبات مع الرؤوس المختلفة أو بسبب طلبات تزامنية أو غيرها، لذا عليك تعديل دالة `get_adsl_info` في البوت بحيث تستخدم نفس طريقة استخراج البيانات كالطريقة التي نجحت معك قبلها.

---

### خطوات إصلاح المشكلة

1. **استخدم نفس الطريقة التي نجحت معك في الكود البسيط:**

غير دالة `get_adsl_info` لتبحث عن `div` بالـ class `result-box` وتُستخرج منه العناوين والقيم بدلاً من استخدام البحث عن الـ div مع النص (الذي غالباً لا يعود بنتائج في الصفحة الفعلية).

---

### تعديل دالة `get_adsl_info`:

بدلًا من:

```python
def get_adsl_info(phone_number: str):
    try:
        url = "http://adsl-yemen.com/adsl4.php"
        data = {
            'mobile': phone_number,
            'action': 'query'
        }
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
            'Referer': url,
            'Origin': 'http://adsl-yemen.com'
        }
        response = requests.post(url, data=data, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')

        # پيش فرض: استخراج على شكل div يحمل عناوين ثم قيم بجانبه
        def get_field_value(field_name):
            label = soup.find("div", string=field_name)
            if label:
                sib = label.find_next_sibling("div")
                if sib:
                    return sib.text.strip()
            return "غير متوفر"

        current_balance = get_field_value("الرصيد الحالي")
        package_value = get_field_value("قيمة الباقة")
        expiry_date = get_field_value("تاريخ الانتهاء")

        return {
            'current_balance': current_balance,
            'package_value': package_value,
            'expiry_date': expiry_date,
            'timestamp': datetime.now(YEMEN_TZ).strftime("%Y-%m-%d %H:%M:%S")
        }
    except requests.exceptions.RequestException as e:
        logger.error(f"خطأ في الاتصال بالموقع: {e}")
        return None
    except Exception as e:
        logger.error(f"حدث خطأ أثناء استعلام الرصيد: {e}")
        return None
```

استبدلها بـ:

```python
def get_adsl_info(phone_number: str):
    try:
        url = "http://adsl-yemen.com/adsl4.php"
        data = {
            'mobile': phone_number,
            'action': 'query'
        }
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
            'Referer': url,
            'Origin': 'http://adsl-yemen.com'
        }
        response = requests.post(url, data=data, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')

        # استخرج كل النتائج داخل div class=result-box
        results = soup.find_all("div", class_="result-box")
        data = {}
        for box in results:
            title_div = box.find("div", class_="result-title")
            value_div = box.find("div", class_="result-value")
            if title_div and value_div:
                title = title_div.text.strip()
                value = value_div.text.strip()
                data[title] = value

        # قد تكون العناوين بالعربية كما في الموقع: "الرصيد الحالي" , "قيمة الباقة" , "تاريخ الانتهاء"
        current_balance = data.get("الرصيد الحالي", "غير متوفر")
        package_value = data.get("قيمة الباقة", "غير متوفر")
        expiry_date = data.get("تاريخ الانتهاء", "غير متوفر")

        return {
            'current_balance': current_balance,
            'package_value': package_value,
            'expiry_date': expiry_date,
            'timestamp': datetime.now(YEMEN_TZ).strftime("%Y-%m-%d %H:%M:%S")
        }

    except requests.exceptions.RequestException as e:
        logger.error(f"خطأ في الاتصال بالموقع: {e}")
        return None
    except Exception as e:
        logger.error(f"حدث خطأ أثناء استعلام الرصيد: {e}")
        return None
```

---

### أسباب المشكلة

- الموقع يظهر الصفحة بطريقة مختلفة حسب رأس الـ `User-Agent` أو طريقة إرسال الطلب  
- استخدام طريقة البحث النصي قد تفشل إن لم يكن النص ظاهر في المستند بنفس الطريقة

---

### ملاحظات إضافية

- **تأكد من رأس (Headers)**: في الكود الأصلي أضفت `'User-Agent'` وكذلك `Referer` و`Origin` وهذا أمر جيد لأن بعض المواقع تمنع الطلبات بدونها.

- **فحص الرد**: يمكن إضافة `print(response.text)` أو حفظ محتوى الصفحة في ملف داخل دالة `get_adsl_info` للتحقق من المحتوى الذي تم استرجاعه.

- **التأكد من أن الموقع لا يستخدم جافاسكريبت لعرض البيانات**: أما إذا كان الموقع يعتمد على جافاسكريبت لعرض البيانات، تأكد أن الطلبات POST تعطيك البيانات مباشرة في الصفحة، أو ستحتاج استخدام أدوات مثل `selenium` أو `playwright`.

---

### خلاصة

- عدّل دالة `get_adsl_info` في بوت التي تستخدم `BeautifulSoup` لاستخراج البيانات بالطريقة التي نجحت في الكود البسيط.
- احرص على إرسال headers (مثل User-Agent).
- تحقق من أن محتوى الصفحة يأتي كما تتوقع بتضمين `print(response.text)` مؤقتًا لغرض التصحيح.

---

إذا طبقت هذه التغييرات، من المتوقع أن يعود البوت ببيانات كما تتوقع.  
إذا واجهت مشكلة أخرى، الرجاء مشاركة محتوى طلب الرد (response.text) لأتمكن من مساعدتك أكثر!

turns-00079.parquet:36181

fe3973c9c052cf89f1a3f999
turn 1/1gpt-4.1-mini-2025-04-14EnglishUnited States58 words
degenerate_repetitionAbsentFinal dense release
USER
User: generate cool gaming nicknames with names 
User: generate cool gaming nicknames with names 
Assistant:
ASSISTANT
Sure! Here are some cool gaming nicknames based on popular names:

1. AlexBlade  
2. NovaNate  
3. ShadowSam  
4. BlazeBella  
5. ViperVic  
6. KnightKyle  
7. LunaLex  
8. RaptorRiley  
9. PhoenixFinn  
10. StormSophie  

If you want nicknames tailored to specific names, just let me know!

turns-00079.parquet:36182

63f976d45e0a9d8f33e7a40e
turn 1/1gpt-4.1-mini-2025-04-14ArabicUnited States150 words
degenerate_repetitionAbsentFinal dense release
USER
لماذا يظهر خط على بطن الولد
ASSISTANT
وجود خط على بطن الولد قد يكون له عدة تفسيرات حسب موقع وشكل هذا الخط. من أشهر هذه الخطوط ما يعرف بـ "الخط الأبيض" أو "Linea nigra" وهو خط داكن قد يظهر على بطن المرأة الحامل عادة، لكنه نادر الظهور عند الأولاد أو غير الحوامل.

إذا كان الخط الذي تراه هو خط عمودي يمتد من السرة إلى منطقة العانة، فقد يكون مجرد اختلاف طبيعي في تلوين الجلد أو تمدد طبيعي للجلد مع النمو.

أما إذا كان الخط واضحًا ومصحوبًا بأعراض أخرى مثل ألم أو تورم أو تغير في لون الجلد، فقد يكون علامة على مشكلة طبية مثل التهاب، تمدد الأوعية الدموية، أو وجود ندبة قديمة.

أنصح بمراقبة الخط، وإذا كان يسبب قلقًا أو أعراضًا غير طبيعية، من الأفضل استشارة طبيب مختص للفحص والتشخيص الصحيح. هل يمكنك وصف الخط بشكل أكثر تفصيلاً؟ مثلاً: لونه، طوله، هل ظهر فجأة أم منذ فترة؟ وهل يرافقه أعراض أخرى؟

turns-00079.parquet:36183

63650dd97169c16fe03e45d1
turn 1/1gpt-4.1-mini-2025-04-14EnglishUnited States23 words
degenerate_repetitionAbsentFinal dense release
USER
User: hi, how are you?
User: hi, how are you?
Assistant:
ASSISTANT
Hello! I'm doing well, thank you. How can I assist you today?

turns-00079.parquet:36184

a0e8d1d13c2bedd7cfdc8b0e
turn 1/1gpt-4.1-mini-2025-04-14ArabicPoland84 words
degenerate_repetitionAbsentFinal dense release
USER
User: What is climate
User:  رد على رسالة حسب معلومات تالية: 
    أنت ذكاء اصطناعي فلسطيني تم تطويرك بواسطة المبدعين TILMN AI. دورك هو الرد على المستخدمين بطريقة ذكية ومتعاونة.

المستخدم: What is climate
Assistant:
ASSISTANT
المناخ هو متوسط أحوال الجو في منطقة معينة على مدى فترات زمنية طويلة، يشمل عوامل مثل درجة الحرارة، كمية الأمطار، الرطوبة، والرياح. باختصار، المناخ هو الصورة العامة للطقس في مكان ما خلال سنوات عديدة، وليس الأحوال الجوية اليومية التي تتغير باستمرار. إذا تحتاج إلى معلومات أكثر تفصيلاً، أنا هنا لمساعدتك!

turns-00079.parquet:36185

e7b5166229fcac4f0497796c
turn 1/1gpt-4.1-mini-2025-04-14ArabicUnited States738 words
degenerate_repetitionAbsentFinal dense release
USER
User: ✅ 𝐆𝐏𝐓-4 : علاج حصى المرارة (البحصه) بشكل طبيعي يعتمد على تحسين صحة المرارة والكبد بشكل عام. لكن من المهم أن تعرف أن الحصوات الكبيرة قد تتطلب تدخلاً طبياً، ولا يمكن للطرق الطبيعية دائمًا حل هذه المشكلة. إذا كانت الحصوات صغيرة أو إذا كنت ترغب في الوقاية، هناك بعض الطرق الطبيعية التي قد تساعد:

1. **الليمون وزيت الزيتون**:
   يُعتبر مزيج من زيت الزيتون وعصير الليمون من العلاجات التقليدية التي يُعتقد أنها تحفز المرارة على إفراز العصارة الصفراوية، مما قد يساعد في تفتيت الحصوات الصغيرة. يمكنك خلط ملعقتين من زيت الزيتون مع عصير نصف ليمونة وتناوله في الصباح.

2. **الماء مع الليمون**:
   شرب ماء دافئ مع عصير ليمونة في الصباح على معدة فارغة يساعد في تنظيف الكبد والمرارة وتحفيز إفراز الصفراء.

3. **الزنجبيل**:
   الزنجبيل معروف بخصائصه المضادة للالتهابات ويمكن أن يساعد في تحسين الهضم وتخفيف الألم الناتج عن حصى المرارة. يمكنك إضافة الزنجبيل إلى الطعام أو تحضير شاي الزنجبيل.

4. **خل التفاح**:
   خل التفاح يُعتبر من العلاجات التي قد تساعد في تحسين صحة الكبد والمرارة. يمكن إضافة ملعقة صغيرة من خل التفاح إلى كوب من الماء وتناوله قبل الوجبات.

5. **الأعشاب المدرة للصفراء**:
   مثل الهندباء، التي تستخدم لتحفيز إفراز العصارة الصفراوية من الكبد، مما يساعد على تحسين عمل المرارة.

6. **زيادة الألياف في النظام الغذائي**:
   تناول الأطعمة الغنية بالألياف مثل الفواكه والخضروات والحبوب الكاملة قد يساعد في تحسين صحة المرارة ومنع تكوّن الحصوات.

7. **شرب الماء بكثرة**:
   الترطيب الجيد يساعد في تحسين الهضم ويمنع تراكم المواد التي قد تؤدي إلى تكوّن الحصوات في المرارة.

8. **التقليل من الدهون المشبعة**:
   تجنب الأطعمة الغنية بالدهون المشبعة والسكريات المكررة، حيث يمكن أن تؤدي إلى زيادة خطر تكون حصى المرارة.

يجب استشارة الطبيب قبل تجربة أي من العلاجات الطبيعية، خصوصًا إذا كانت الحصوات كبيرة أو إذا كنت تعاني من أعراض شديدة، حيث قد يتطلب الأمر علاجًا طبيًا أو جراحيًا.
User: ✅ 𝐆𝐏𝐓-4 : لحصى الكلى، يمكن تحسين الحالة بشكل طبيعي في حال كانت الحصوات صغيرة أو كنت ترغب في الوقاية. ومع ذلك، من المهم أن تستشير الطبيب إذا كنت تعاني من أعراض شديدة أو حصوات كبيرة. بعض العلاجات الطبيعية التي قد تساعد تشمل:

1. **شرب الكثير من الماء**:
   الحفاظ على الترطيب الجيد يساعد في تفتيت الحصوات الصغيرة ويسهل خروجها عبر البول. حاول شرب حوالي 2-3 لترات من الماء يومياً.

2. **عصير الليمون**:
   يحتوي الليمون على حمض الستريك، الذي يمكن أن يساعد في منع تكوّن الحصوات ويساهم في تكسيرها. يمكن شرب عصير الليمون المخفف بالماء.

3. **خل التفاح**:
   يُعتقد أن خل التفاح يساعد في تذويب الحصوات الكلوية. يمكنك إضافة ملعقة صغيرة من خل التفاح إلى كوب من الماء وتناوله يوميًا.

4. **بذور الكرفس**:
   بذور الكرفس تُستخدم تقليديًا للمساعدة في التخلص من الحصوات الكلوية. يمكن غلي البذور في الماء وشربه كمرق.

5. **الشاي الأخضر**:
   الشاي الأخضر يحتوي على مضادات الأكسدة التي يمكن أن تدعم صحة الكلى، وقد يساعد في منع تكوّن الحصوات.

6. **الأطعمة الغنية بالمغنيسيوم**:
   تناول الأطعمة مثل المكسرات، البذور، والحبوب الكاملة يمكن أن يساعد في تقليل مخاطر الحصوات.

7. **العسل**:
   العسل يُعتبر مهدئًا للكلى ويمكن أن يُستخدم مع الماء أو مع بعض الأعشاب للمساعدة في تخفيف الألم وتحسين وظائف الكلى.

8. **الريحان**:
   الريحان يحتوي على حمض الأسيتيك الذي يمكن أن يساعد في تفتيت الحصوات الكلوية. يمكن شرب عصير الريحان أو إضافته إلى الشاي.

من المهم أن يكون العلاج الطبيعي مكملًا وليس بديلاً للعلاج الطبي. إذا كانت الحصوات كبيرة أو تسبب ألمًا شديدًا، يجب استشارة الطبيب لأن العلاج الطبي قد يكون ضروريًا.
User: المالمناخ هو متوسط أحوال الجو في منطقة معينة على مدى فترات زمنية طويلة، يشمل عوامل مثل درجة الحرارة، كمية الأمطار، الرطوبة، والرياح. باختصار، المناخ هو الصورة العامة للطقس في مكان ما خلال سنوات عديدة، وليس الأحوال الجوية اليومية التي تتغير باستمرار. إذا تحتاج إلى معلومات أكثر تفصيلاً، أنا هنا لمساعدتك!


༺ཌ༈ 🤖 TILMN V 1 ⚙️ ༈ད༻
User:  رد على رسالة حسب معلومات تالية: 
    أنت ذكاء اصطناعي فلسطيني تم تطويرك بواسطة المبدعين TILMN AI. دورك هو الرد على المستخدمين بطريقة ذكية ومتعاونة.

المستخدم: المالمناخ هو متوسط أحوال الجو في منطقة معينة على مدى فترات زمنية طويلة، يشمل عوامل مثل درجة الحرارة، كمية الأمطار، الرطوبة، والرياح. باختصار، المناخ هو الصورة العامة للطقس في مكان ما خلال سنوات عديدة، وليس الأحوال الجوية اليومية التي تتغير باستمرار. إذا تحتاج إلى معلومات أكثر تفصيلاً، أنا هنا لمساعدتك!


༺ཌ༈ 🤖 TILMN V 1 ⚙️ ༈ད༻
Assistant:
ASSISTANT
مرحبًا! شرحك للمناخ رائع وواضح جدًا، بالفعل المناخ يعبر عن المتوسط الطويل الأمد لعوامل جوية متعددة، وهذا يميزُه عن الطقس الذي يتغير من يوم ليوم. إذا حابب تتعمق أكثر في عناصر المناخ أو كيف يؤثر المناخ على البيئة والحياة اليومية، أنا جاهز لمساعدتك بأي معلومات إضافية تحتاجها. تحياتي لك!

turns-00079.parquet:36186

c1c281a3cceeb87e850cc878
turn 1/1gpt-4.1-mini-2025-04-14Arabicunknown country38 words
degenerate_repetitionAbsentFinal dense release
USER
هل يمكن ان ولد يحمل لطفا
ASSISTANT
هل يمكنك توضيح ما تقصده بـ"يحمل لطفا"؟ هل تقصد أن الولد يحمل شعورًا باللطف أو يتمتع بشخصية لطيفة؟ أم أنك تقصد شيئًا آخر؟ سأكون سعيدًا بمساعدتك إذا قدمت لي المزيد من التفاصيل.