|
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 |
|
} |
|
} |
|
|
|
|
|
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 = [] |
|
|
|
|
|
image_path = None |
|
if image is not None: |
|
image_path = os.path.join(self.temp_dir, "temp_image.jpg") |
|
image.save(image_path) |
|
|
|
|
|
if twitter_enabled: |
|
twitter_log = self._post_to_twitter(message, image_path) |
|
log_messages.append(twitter_log) |
|
|
|
|
|
if facebook_enabled: |
|
facebook_log = self._post_to_facebook(message, image_path) |
|
log_messages.append(facebook_log) |
|
|
|
|
|
if instagram_enabled: |
|
instagram_log = self._post_to_instagram(message, image_path) |
|
log_messages.append(instagram_log) |
|
|
|
|
|
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)}" |
|
|
|
|
|
|
|
def create_app(): |
|
manager = SocialMediaManagerWeb() |
|
|
|
with gr.Blocks(title="Social Media Manager Web") as app: |
|
gr.Markdown("# Social Media Manager Web") |
|
|
|
with gr.Tabs(): |
|
|
|
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) |
|
|
|
|
|
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") |
|
|
|
|
|
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() |