File size: 2,132 Bytes
24e0afd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from shiny import reactive, render, ui
import os
import requests
from dotenv import load_dotenv
from llm_connect import get_response  # your existing function

load_dotenv()

PAGE_ID = os.getenv("FB_PAGE_ID")
ACCESS_TOKEN = os.getenv("FB_PAGE_ACCESS_TOKEN")

generated_fb_post = reactive.Value("")

def generate_facebook_post(topic: str) -> str:
    prompt = (
        f"You are a social media manager for a hobby e-commerce company called 'Ultima Supply'.\n"
        f"Write a short, engaging Facebook post (max 500 characters) about: '{topic}'.\n"
        f"Use casual and friendly tone. Include emojis and 3-5 relevant hashtags."
    )
    return get_response(
        input=prompt,
        template=lambda x: x,
        llm="gemini",
        md=False,
        temperature=0.9,
        max_tokens=500
    )

def post_to_facebook(message: str) -> str:
    url = f"https://graph.facebook.com/{PAGE_ID}/feed"
    payload = {
        "message": message,
        "access_token": ACCESS_TOKEN
    }

    response = requests.post(url, data=payload)
    if response.status_code != 200:
        return f"❌ Facebook post failed: {response.status_code} - {response.text}"
    
    post_id = response.json().get("id", "Unknown")
    return f"✅ Post successful! Facebook Post ID: {post_id}"

def server(input, output, session):
    post_status = reactive.Value("")

    @output
    @render.ui
    @reactive.event(input.gen_btn_fb)
    def fb_post_draft():
        topic = input.fb_topic()
        if not topic.strip():
            return ui.HTML("<p><strong>⚠️ Enter a topic first.</strong></p>")
        post = generate_facebook_post(topic)
        generated_fb_post.set(post)
        return ui.HTML(f"<p><strong>Generated Facebook Post:</strong><br>{post}</p>")

    @output
    @render.text
    def fb_post_status():
        return post_status()

    @reactive.effect
    @reactive.event(input.post_btn_fb)
    def _():
        post = generated_fb_post()
        if not post:
            post_status.set("⚠️ No post generated yet.")
        else:
            result = post_to_facebook(post)
            post_status.set(result)