turns-00079.parquet:36177
a105c09fc922942df53f19afdegenerate_repetitionAbsentFinal dense release
Select one behavior. Every returned turn has one binary label: Present or Absent. Source: final dense boolean release.
a105c09fc922942df53f19afYou 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:
Could you please provide the summary of your problem so I can generate the appropriate CBT-based tasks?
5e00c4d8fce5e91d7805fbb6متى يخرج شعر الصدر
يبدأ ظهور شعر الصدر عادةً خلال فترة البلوغ، والتي تكون في العادة بين سن 12 و16 سنة، ولكن هذا يختلف من شخص لآخر بناءً على العوامل الوراثية والهرمونية. يظهر شعر الصدر عادة بعد بداية نمو شعر العانة ويكون جزءًا من علامات البلوغ عند الذكور. إذا كان لديك أي قلق بشأن نمو الشعر أو التطورات الجسدية، من الأفضل استشارة طبيب مختص.
63650dd97169c16fe03e45d1User: hi, how are you? User: hi, how are you? Assistant:
Hello! I'm doing well, thank you. How can I assist you today?
e614d00aa6722920c2e23a4cاريد اصلاح الكود
للعلم انة بهذة الطريقة يعمل ويقوم بارجاع البيانات
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}")لديك نقطة مهمة جداً في الكود الخاص بك، وهي أن طريقة استخراج بيانات الاستعلام من موقع 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) لأتمكن من مساعدتك أكثر!fe3973c9c052cf89f1a3f999User: generate cool gaming nicknames with names User: generate cool gaming nicknames with names 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!
63f976d45e0a9d8f33e7a40eلماذا يظهر خط على بطن الولد
وجود خط على بطن الولد قد يكون له عدة تفسيرات حسب موقع وشكل هذا الخط. من أشهر هذه الخطوط ما يعرف بـ "الخط الأبيض" أو "Linea nigra" وهو خط داكن قد يظهر على بطن المرأة الحامل عادة، لكنه نادر الظهور عند الأولاد أو غير الحوامل. إذا كان الخط الذي تراه هو خط عمودي يمتد من السرة إلى منطقة العانة، فقد يكون مجرد اختلاف طبيعي في تلوين الجلد أو تمدد طبيعي للجلد مع النمو. أما إذا كان الخط واضحًا ومصحوبًا بأعراض أخرى مثل ألم أو تورم أو تغير في لون الجلد، فقد يكون علامة على مشكلة طبية مثل التهاب، تمدد الأوعية الدموية، أو وجود ندبة قديمة. أنصح بمراقبة الخط، وإذا كان يسبب قلقًا أو أعراضًا غير طبيعية، من الأفضل استشارة طبيب مختص للفحص والتشخيص الصحيح. هل يمكنك وصف الخط بشكل أكثر تفصيلاً؟ مثلاً: لونه، طوله، هل ظهر فجأة أم منذ فترة؟ وهل يرافقه أعراض أخرى؟
63650dd97169c16fe03e45d1User: hi, how are you? User: hi, how are you? Assistant:
Hello! I'm doing well, thank you. How can I assist you today?
a0e8d1d13c2bedd7cfdc8b0eUser: What is climate
User: رد على رسالة حسب معلومات تالية:
أنت ذكاء اصطناعي فلسطيني تم تطويرك بواسطة المبدعين TILMN AI. دورك هو الرد على المستخدمين بطريقة ذكية ومتعاونة.
المستخدم: What is climate
Assistant:المناخ هو متوسط أحوال الجو في منطقة معينة على مدى فترات زمنية طويلة، يشمل عوامل مثل درجة الحرارة، كمية الأمطار، الرطوبة، والرياح. باختصار، المناخ هو الصورة العامة للطقس في مكان ما خلال سنوات عديدة، وليس الأحوال الجوية اليومية التي تتغير باستمرار. إذا تحتاج إلى معلومات أكثر تفصيلاً، أنا هنا لمساعدتك!
e7b5166229fcac4f0497796cUser: ✅ 𝐆𝐏𝐓-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:مرحبًا! شرحك للمناخ رائع وواضح جدًا، بالفعل المناخ يعبر عن المتوسط الطويل الأمد لعوامل جوية متعددة، وهذا يميزُه عن الطقس الذي يتغير من يوم ليوم. إذا حابب تتعمق أكثر في عناصر المناخ أو كيف يؤثر المناخ على البيئة والحياة اليومية، أنا جاهز لمساعدتك بأي معلومات إضافية تحتاجها. تحياتي لك!
c1c281a3cceeb87e850cc878هل يمكن ان ولد يحمل لطفا
هل يمكنك توضيح ما تقصده بـ"يحمل لطفا"؟ هل تقصد أن الولد يحمل شعورًا باللطف أو يتمتع بشخصية لطيفة؟ أم أنك تقصد شيئًا آخر؟ سأكون سعيدًا بمساعدتك إذا قدمت لي المزيد من التفاصيل.