Spaces:
Sleeping
Sleeping
import gradio as gr | |
import tweepy | |
import facebook | |
from instabot import Bot | |
import tempfile | |
import os | |
from datetime import datetime | |
import json | |
class SocialMediaManagerWeb: | |
def __init__(self): | |
self.temp_dir = tempfile.mkdtemp() | |
self.credentials_cache = {} | |
def save_credentials_temp(self, twitter_api_key, twitter_api_secret, twitter_access_token, | |
twitter_token_secret, facebook_token, instagram_user, instagram_pass): | |
"""Speichert Credentials temporär im Browser-Speicher""" | |
credentials = { | |
"twitter": { | |
"api_key": twitter_api_key, | |
"api_secret": twitter_api_secret, | |
"access_token": twitter_access_token, | |
"token_secret": twitter_token_secret | |
}, | |
"facebook": { | |
"token": facebook_token | |
}, | |
"instagram": { | |
"username": instagram_user, | |
"password": instagram_pass | |
} | |
} | |
# Hier werden die Credentials im Browser-Cache gespeichert | |
self.credentials_cache = credentials | |
return "Credentials wurden temporär gespeichert. Diese werden nicht dauerhaft gespeichert." | |
def post_to_social(self, message, image, twitter_enabled, facebook_enabled, instagram_enabled): | |
"""Hauptfunktion zum Posten auf sozialen Netzwerken""" | |
if not message.strip(): | |
return "Fehler: Nachricht darf nicht leer sein!" | |
if not (twitter_enabled or facebook_enabled or instagram_enabled): | |
return "Fehler: Wähle mindestens ein Netzwerk aus!" | |
log_messages = [] | |
# Bild temporär speichern, falls hochgeladen | |
image_path = None | |
if image is not None: | |
image_path = os.path.join(self.temp_dir, "temp_image.jpg") | |
image.save(image_path) | |
# Auf Twitter posten | |
if twitter_enabled: | |
twitter_log = self._post_to_twitter(message, image_path) | |
log_messages.append(twitter_log) | |
# Auf Facebook posten | |
if facebook_enabled: | |
facebook_log = self._post_to_facebook(message, image_path) | |
log_messages.append(facebook_log) | |
# Auf Instagram posten | |
if instagram_enabled: | |
instagram_log = self._post_to_instagram(message, image_path) | |
log_messages.append(instagram_log) | |
# Temporäre Datei löschen | |
if image_path and os.path.exists(image_path): | |
os.remove(image_path) | |
return "\n".join(log_messages) | |
def _post_to_twitter(self, message, image_path): | |
"""Auf Twitter posten""" | |
timestamp = datetime.now().strftime('%H:%M:%S') | |
if len(message) > 280: | |
return f"[{timestamp}] Twitter Fehler: Nachricht überschreitet 280 Zeichen ({len(message)})" | |
if not self.credentials_cache.get("twitter", {}).get("api_key"): | |
return f"[{timestamp}] Twitter Fehler: Keine API-Credentials gefunden" | |
try: | |
twitter_creds = self.credentials_cache["twitter"] | |
auth = tweepy.OAuthHandler( | |
twitter_creds["api_key"], | |
twitter_creds["api_secret"] | |
) | |
auth.set_access_token( | |
twitter_creds["access_token"], | |
twitter_creds["token_secret"] | |
) | |
api = tweepy.API(auth) | |
if image_path: | |
media = api.media_upload(image_path) | |
api.update_status(status=message, media_ids=[media.media_id]) | |
else: | |
api.update_status(status=message) | |
return f"[{timestamp}] Erfolgreich auf Twitter gepostet" | |
except Exception as e: | |
return f"[{timestamp}] Twitter Fehler: {str(e)}" | |
def _post_to_facebook(self, message, image_path): | |
"""Auf Facebook posten""" | |
timestamp = datetime.now().strftime('%H:%M:%S') | |
if not self.credentials_cache.get("facebook", {}).get("token"): | |
return f"[{timestamp}] Facebook Fehler: Kein Access Token gefunden" | |
try: | |
fb_token = self.credentials_cache["facebook"]["token"] | |
graph = facebook.GraphAPI(fb_token) | |
if image_path: | |
with open(image_path, "rb") as image: | |
graph.put_photo(image=image, message=message) | |
else: | |
graph.put_object("me", "feed", message=message) | |
return f"[{timestamp}] Erfolgreich auf Facebook gepostet" | |
except Exception as e: | |
return f"[{timestamp}] Facebook Fehler: {str(e)}" | |
def _post_to_instagram(self, message, image_path): | |
"""Auf Instagram posten""" | |
timestamp = datetime.now().strftime('%H:%M:%S') | |
if not image_path: | |
return f"[{timestamp}] Instagram Fehler: Bild ist für Instagram-Posts erforderlich" | |
if not self.credentials_cache.get("instagram", {}).get("username"): | |
return f"[{timestamp}] Instagram Fehler: Keine Anmeldedaten gefunden" | |
try: | |
insta_creds = self.credentials_cache["instagram"] | |
bot = Bot() | |
bot.login( | |
username=insta_creds["username"], | |
password=insta_creds["password"] | |
) | |
bot.upload_photo(image_path, caption=message) | |
return f"[{timestamp}] Erfolgreich auf Instagram gepostet" | |
except Exception as e: | |
return f"[{timestamp}] Instagram Fehler: {str(e)}" | |
# Gradio Interface erstellen | |
def create_app(): | |
manager = SocialMediaManagerWeb() | |
with gr.Blocks(title="Social Media Manager Web") as app: | |
gr.Markdown("# Social Media Manager Web") | |
with gr.Tabs(): | |
# Post Tab | |
with gr.TabItem("Beitrag posten"): | |
with gr.Row(): | |
with gr.Column(): | |
message_input = gr.Textbox( | |
label="Nachricht", | |
placeholder="Gib deine Nachricht hier ein...", | |
lines=5 | |
) | |
image_input = gr.Image(label="Bild (optional)", type="pil") | |
with gr.Row(): | |
twitter_check = gr.Checkbox(label="Twitter", value=False) | |
facebook_check = gr.Checkbox(label="Facebook", value=False) | |
instagram_check = gr.Checkbox(label="Instagram", value=False) | |
post_button = gr.Button("Auf ausgewählten Netzwerken posten") | |
with gr.Column(): | |
output_log = gr.Textbox(label="Log", lines=10) | |
# Credentials Tab | |
with gr.TabItem("Anmeldedaten"): | |
gr.Markdown(""" | |
### Deine Anmeldedaten | |
Diese werden nur temporär im Browser gespeichert und nicht auf dem Server. | |
""") | |
with gr.Group(): | |
gr.Markdown("#### Twitter") | |
twitter_api_key = gr.Textbox(label="API Key") | |
twitter_api_secret = gr.Textbox(label="API Secret") | |
twitter_access_token = gr.Textbox(label="Access Token") | |
twitter_token_secret = gr.Textbox(label="Token Secret") | |
with gr.Group(): | |
gr.Markdown("#### Facebook") | |
facebook_token = gr.Textbox(label="Access Token") | |
with gr.Group(): | |
gr.Markdown("#### Instagram") | |
instagram_user = gr.Textbox(label="Benutzername") | |
instagram_pass = gr.Textbox(label="Passwort", type="password") | |
save_button = gr.Button("Anmeldedaten speichern") | |
save_output = gr.Textbox(label="Status") | |
# Event-Handler | |
post_button.click( | |
fn=manager.post_to_social, | |
inputs=[message_input, image_input, twitter_check, facebook_check, instagram_check], | |
outputs=output_log | |
) | |
save_button.click( | |
fn=manager.save_credentials_temp, | |
inputs=[twitter_api_key, twitter_api_secret, twitter_access_token, | |
twitter_token_secret, facebook_token, instagram_user, instagram_pass], | |
outputs=save_output | |
) | |
return app | |
if __name__ == "__main__": | |
app = create_app() | |
app.launch() |