دلوقتي انا عايز اعمل صفحه فيس بوك اخباريه كل اللي ...
創建於:2026年6月28日
使用 GPT-5.5 Thinking 回答 Chat01
創建於:2026年6月28日
使用 GPT-5.5 Thinking 回答 Chat01
دلوقتي انا عايز اعمل صفحه فيس بوك اخباريه
كل اللي عليك هتجيب الاخبار من https://news.google.com/
و بعدها هتجيب صوره
و هتاخد كلام الخبر و تخلي chatgpt يغير الصيغة ليخليه تشد و تكون كويسه
وخلي chatgpt يخلي الخبر دا من 3 لي 10 كلمات
و عايز برضه الكلمات دي احطها علي الصوره
و هديلك اسطنبه فيها اللوجو الخاص بيه و صوره تحطها تحت الكلام اللي هتكتبه و علامات السوشيال ميديا
العنوان : إعلام إسرائيلي ينشر "الملحق السري" لاتفاق لبنان وإسرائيل
جواها صوره
انت هتاخد الكلام دا
علام إسرائيلي ينشر "الملحق السري" لاتفاق لبنان وإسرائيل
تديه لي chatgpt يظبطه عن كده و يخليه شكله افضل و عنوان جذاب
و تحط الاستنبات كلها و بعدها تجهزلي الصوره و طول ما الاسكربت شغال يفضل يجيب في اخبار و اي خبر جديد ينزل يجهزه
تمام، اللي إنت عايزه ممكن يتعمل أوتوماتيك بالكامل.
والفكرة مناسبة جدًا، لأن Google News فيه عناوين رئيسية وروابط أخبار بشكل مستمر، ومثال سكاي نيوز اللي إنت بعته واضح فيه العنوان + صورة الخبر + بداية المحتوى، وده يكفي عشان السكربت يلقط البيانات ويحوّلها لصورة جاهزة للنشر【turn861917view0†L29-L45】【turn861917view1†L118-L129】.
السكربت هيشتغل كده:
بدل ما نكشط واجهة Google News نفسها، الأفضل نستخدم RSS feed الخاص بـ Google News
لأنه:
مثال:
txthttps://news.google.com/rss?hl=ar&gl=EG&ceid=EG:ar
bashpip install requests beautifulsoup4 feedparser pillow python-bidi arabic-reshaper openai python-dotenv lxml
اعمل فولدر بالشكل ده:
txtproject/ │ ├── bot.py ├── .env ├── assets/ │ ├── template.png │ ├── logo.png │ ├── social_icons.png │ ├── under_text.png │ └── Cairo-Bold.ttf │ ├── output/ └── state/
.envحط فيه مفتاح OpenAI:
envOPENAI_API_KEY=ضع_المفتاح_هنا
ده سكربت جاهز كبداية قوية:
pythonimport os import io import re import time import json import textwrap import requests import feedparser from bs4 import BeautifulSoup from urllib.parse import urlparse from PIL import Image, ImageDraw, ImageFont, ImageOps from dotenv import load_dotenv import arabic_reshaper from bidi.algorithm import get_display from openai import OpenAI # ========================= # الإعدادات # ========================= load_dotenv() OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") client = OpenAI(api_key=OPENAI_API_KEY) RSS_URL = "https://news.google.com/rss?hl=ar&gl=EG&ceid=EG:ar" CHECK_INTERVAL = 300 # كل 5 دقائق TEMPLATE_PATH = "assets/template.png" LOGO_PATH = "assets/logo.png" SOCIAL_ICONS_PATH = "assets/social_icons.png" UNDER_TEXT_PATH = "assets/under_text.png" FONT_PATH = "assets/Cairo-Bold.ttf" OUTPUT_DIR = "output" STATE_DIR = "state" SEEN_FILE = os.path.join(STATE_DIR, "seen.json") HEADERS = { "User-Agent": "Mozilla/5.0" } os.makedirs(OUTPUT_DIR, exist_ok=True) os.makedirs(STATE_DIR, exist_ok=True) # ========================= # أدوات مساعدة # ========================= def load_seen(): if os.path.exists(SEEN_FILE): with open(SEEN_FILE, "r", encoding="utf-8") as f: return set(json.load(f)) return set() def save_seen(seen): with open(SEEN_FILE, "w", encoding="utf-8") as f: json.dump(list(seen), f, ensure_ascii=False, indent=2) def clean_filename(text): text = re.sub(r'[\\/*?:"<>|]', "", text) text = re.sub(r"\s+", "_", text.strip()) return text[:120] def reshape_ar(text): reshaped = arabic_reshaper.reshape(text) return get_display(reshaped) def wrap_arabic_text(draw, text, font, max_width): words = text.split() lines = [] current = "" for word in words: test = (current + " " + word).strip() shaped = reshape_ar(test) bbox = draw.textbbox((0, 0), shaped, font=font) width = bbox[2] - bbox[0] if width <= max_width: current = test else: if current: lines.append(current) current = word if current: lines.append(current) return lines def download_image(url): try: r = requests.get(url, headers=HEADERS, timeout=20) r.raise_for_status() return Image.open(io.BytesIO(r.content)).convert("RGB") except Exception: return None def image_fit(img, size): return ImageOps.fit(img, size, method=Image.LANCZOS) def get_domain_name(url): try: domain = urlparse(url).netloc.replace("www.", "") return domain except: return "news source" # ========================= # سحب الأخبار # ========================= def fetch_google_news(): feed = feedparser.parse(RSS_URL) items = [] for entry in feed.entries: title = entry.get("title", "").strip() link = entry.get("link", "").strip() published = entry.get("published", "").strip() if title and link: items.append({ "title": title, "link": link, "published": published }) return items def resolve_final_url(google_news_url): try: r = requests.get(google_news_url, headers=HEADERS, timeout=20, allow_redirects=True) return r.url except Exception: return google_news_url # ========================= # استخراج بيانات الخبر # ========================= def extract_article_data(url): try: r = requests.get(url, headers=HEADERS, timeout=20) r.raise_for_status() soup = BeautifulSoup(r.text, "lxml") title = None desc = None image_url = None og_title = soup.find("meta", property="og:title") og_desc = soup.find("meta", property="og:description") og_image = soup.find("meta", property="og:image") if og_title and og_title.get("content"): title = og_title["content"].strip() if og_desc and og_desc.get("content"): desc = og_desc["content"].strip() if og_image and og_image.get("content"): image_url = og_image["content"].strip() if not title and soup.title: title = soup.title.get_text(strip=True) if not desc: meta_desc = soup.find("meta", attrs={"name": "description"}) if meta_desc and meta_desc.get("content"): desc = meta_desc["content"].strip() source = get_domain_name(url) return { "title": title or "", "desc": desc or "", "image_url": image_url, "source": source, "url": url } except Exception as e: print("extract_article_data error:", e) return None # ========================= # إعادة صياغة العنوان بـ ChatGPT # ========================= def generate_short_headline(original_title, description=""): prompt = f""" حوّل عنوان الخبر التالي إلى عنوان عربي جذاب للنشر على فيسبوك. الشروط: - من 3 إلى 10 كلمات فقط - يكون إخباري ومباشر وجذاب - بدون مبالغة رخيصة - بدون هاشتاج - بدون علامات اقتباس - أعد العنوان فقط لا غير العنوان الأصلي: {original_title} وصف الخبر: {description} """.strip() try: response = client.responses.create( model="gpt-5-mini", input=prompt ) text = response.output_text.strip() text = text.replace("\n", " ").strip() return text except Exception as e: print("OpenAI error:", e) return original_title[:60] # ========================= # تصميم البوست # ========================= def create_news_poster(article_image, short_title, source_name, output_path): # تحميل الاستنبة if os.path.exists(TEMPLATE_PATH): base = Image.open(TEMPLATE_PATH).convert("RGBA") else: base = Image.new("RGBA", (1080, 1350), (20, 20, 20, 255)) W, H = base.size # مناطق التوزيع - تقدر تغيّرها حسب الاستنبة news_img_box = (60, 140, 1020, 760) # left, top, right, bottom text_box = (70, 800, 1010, 1040) source_y = 1060 under_text_y = 1110 social_y = 1230 # صورة الخبر if article_image: fitted = image_fit(article_image, (news_img_box[2] - news_img_box[0], news_img_box[3] - news_img_box[1])) base.paste(fitted, (news_img_box[0], news_img_box[1])) # طبقة شفافة تحت النص overlay = Image.new("RGBA", base.size, (0, 0, 0, 0)) draw_overlay = ImageDraw.Draw(overlay) draw_overlay.rounded_rectangle(text_box, radius=25, fill=(0, 0, 0, 145)) base = Image.alpha_composite(base, overlay) draw = ImageDraw.Draw(base) # اللوجو if os.path.exists(LOGO_PATH): logo = Image.open(LOGO_PATH).convert("RGBA") logo.thumbnail((180, 180)) base.alpha_composite(logo, (50, 30)) # الخط title_font = ImageFont.truetype(FONT_PATH, 56) source_font = ImageFont.truetype(FONT_PATH, 28) # لف النص العربي max_text_width = text_box[2] - text_box[0] - 40 lines = wrap_arabic_text(draw, short_title, title_font, max_text_width) # تقليل الخط لو السطور كتير while len(lines) > 3: size = title_font.size - 4 if size < 34: break title_font = ImageFont.truetype(FONT_PATH, size) lines = wrap_arabic_text(draw, short_title, title_font, max_text_width) # رسم العنوان current_y = text_box[1] + 20 for line in lines: shaped = reshape_ar(line) bbox = draw.textbbox((0, 0), shaped, font=title_font) line_width = bbox[2] - bbox[0] x = (W - line_width) // 2 draw.text((x, current_y), shaped, font=title_font, fill="white") current_y += title_font.size + 16 # اسم المصدر source_text = f"المصدر: {source_name}" shaped_source = reshape_ar(source_text) bbox = draw.textbbox((0, 0), shaped_source, font=source_font) source_x = (W - (bbox[2] - bbox[0])) // 2 draw.text((source_x, source_y), shaped_source, font=source_font, fill=(230, 230, 230)) # صورة تحت الكلام if os.path.exists(UNDER_TEXT_PATH): under = Image.open(UNDER_TEXT_PATH).convert("RGBA") under.thumbnail((850, 100)) under_x = (W - under.size[0]) // 2 base.alpha_composite(under, (under_x, under_text_y)) # أيقونات السوشيال if os.path.exists(SOCIAL_ICONS_PATH): icons = Image.open(SOCIAL_ICONS_PATH).convert("RGBA") icons.thumbnail((360, 60)) icons_x = (W - icons.size[0]) // 2 base.alpha_composite(icons, (icons_x, social_y)) base.convert("RGB").save(output_path, quality=95) print("Saved:", output_path) # ========================= # معالجة خبر واحد # ========================= def process_one_news(item, seen): google_link = item["link"] final_url = resolve_final_url(google_link) if final_url in seen: return article = extract_article_data(final_url) if not article: return title = article["title"] or item["title"] desc = article["desc"] image_url = article["image_url"] source = article["source"] short_title = generate_short_headline(title, desc) article_image = None if image_url: article_image = download_image(image_url) if article_image is None: print("No image found, skipping:", final_url) return filename = clean_filename(short_title) + ".jpg" output_path = os.path.join(OUTPUT_DIR, filename) create_news_poster( article_image=article_image, short_title=short_title, source_name=source, output_path=output_path ) seen.add(final_url) save_seen(seen) # ========================= # اللوب الرئيسي # ========================= def main(): seen = load_seen() print("Bot started...") while True: try: news_items = fetch_google_news() print(f"Found {len(news_items)} items") for item in news_items[:10]: process_one_news(item, seen) except Exception as e: print("Main loop error:", e) print(f"Sleeping {CHECK_INTERVAL} sec...") time.sleep(CHECK_INTERVAL) if __name__ == "__main__": main()
لازم تبعتلي أو تجهّز:
الاستنبة الأساسية
template.png
اللوجو
logo.png
أيقونات السوشيال
social_icons.png
الصورة/الشريط اللي تحت الكلام
under_text.png
خط عربي كويس
زي:
خد:
وده كفاية جدًا لتوليد عنوان جذاب.
بدل JSON تقدر تستخدم SQLite لو المشروع هيكبر.
ممكن بعد تجهيز الصورة:
وده يتم عن طريق Facebook Graph API.
مثلاً:
لو هتستخدم صور الأخبار الأصلية من المواقع، لازم تتأكد من حقوق الاستخدام.
للاستخدام المهني الأفضل:
ابعتلي دول:
وساعتها أقدر أرتب لك النسخة النهائية بالمقاسات الدقيقة داخل الكود
بحيث يبقى Plug & Play وتشغله على طول.
ولو تحب، أقدر كمان أجهز لك في الرسالة الجاية:
لو تحب، أبعتهالك دلوقتي.
ايوه و انا عايز الاسكربت كامل
جهزت لك السكربت كامل في مشروع جاهز للتحميل:
تحميل مشروع سكربت صفحة الأخبار Facebook News Bot
النسخة دي فيها:
output./{page-id}/photos. (Postproxy - Unified Social Media API)استخدمت RSS بدل كشط واجهة Google News لأن Google News RSS مناسب للمتابعة المستمرة وتخصيص الدولة/اللغة/البحث، مع ملاحظة أن Google لا توفر له توثيقًا رسميًا واضحًا مثل API كامل. (WP RSS Aggregator)
والسكربت يعتمد على مكتبة OpenAI Python الرسمية، وهي مصممة للاستخدام من تطبيقات Python. (OpenAI Developers)
بعد ما تفك الضغط:
bashcd fb_news_bot python -m venv venv
على Windows:
bashvenv\Scripts\activate
على macOS / Linux:
bashsource venv/bin/activate
ثم:
bashpip install -r requirements.txt
انسخ ملف الإعدادات:
bashcp .env.example .env
افتح .env وحط مفتاح OpenAI:
envOPENAI_API_KEY=ضع_مفتاح_OpenAI_هنا
ضع ملفات التصميم داخل فولدر assets:
txtassets/template.png assets/logo.png assets/under_text.png assets/social_icons.png assets/font.ttf
جرّبه مرة واحدة:
bashpython run_once.py
لو الصور طلعت كويسة في فولدر output، شغله باستمرار:
bashpython bot.py
في ملف .env غيّر:
envAUTO_POST_TO_FACEBOOK=true FACEBOOK_PAGE_ID=رقم_الصفحة FACEBOOK_PAGE_ACCESS_TOKEN=توكن_الصفحة FACEBOOK_GRAPH_VERSION=v23.0
أنصحك أولًا تشغله بـ:
envAUTO_POST_TO_FACEBOOK=false
لحد ما تتأكد إن التصميم طالع مظبوط، وبعدها فعّل النشر.
من .env تقدر تغيّر الإحداثيات:
envARTICLE_IMAGE_BOX=60,150,1020,760 HEADLINE_BOX=70,800,1010,1035 SOURCE_BOX=70,1045,1010,1095 LOGO_BOX=45,35,225,155 UNDER_TEXT_BOX=160,1110,920,1190 SOCIAL_ICONS_BOX=360,1240,720,1305
كل قيمة معناها:
txtleft,top,right,bottom
مهم: لو هتستخدم صور الأخبار الأصلية تجاريًا، راجع حقوق الاستخدام أو اكتفِ بوضع رابط المصدر في الكابشن.