Alibrown commited on
Commit
7c7b615
·
verified ·
1 Parent(s): d4361c5

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +224 -0
app.py ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import tweepy
3
+ import facebook
4
+ from instabot import Bot
5
+ import tempfile
6
+ import os
7
+ from datetime import datetime
8
+ import json
9
+
10
+ class SocialMediaManagerWeb:
11
+ def __init__(self):
12
+ self.temp_dir = tempfile.mkdtemp()
13
+ self.credentials_cache = {}
14
+
15
+ def save_credentials_temp(self, twitter_api_key, twitter_api_secret, twitter_access_token,
16
+ twitter_token_secret, facebook_token, instagram_user, instagram_pass):
17
+ """Speichert Credentials temporär im Browser-Speicher"""
18
+ credentials = {
19
+ "twitter": {
20
+ "api_key": twitter_api_key,
21
+ "api_secret": twitter_api_secret,
22
+ "access_token": twitter_access_token,
23
+ "token_secret": twitter_token_secret
24
+ },
25
+ "facebook": {
26
+ "token": facebook_token
27
+ },
28
+ "instagram": {
29
+ "username": instagram_user,
30
+ "password": instagram_pass
31
+ }
32
+ }
33
+
34
+ # Hier werden die Credentials im Browser-Cache gespeichert
35
+ self.credentials_cache = credentials
36
+ return "Credentials wurden temporär gespeichert. Diese werden nicht dauerhaft gespeichert."
37
+
38
+ def post_to_social(self, message, image, twitter_enabled, facebook_enabled, instagram_enabled):
39
+ """Hauptfunktion zum Posten auf sozialen Netzwerken"""
40
+ if not message.strip():
41
+ return "Fehler: Nachricht darf nicht leer sein!"
42
+
43
+ if not (twitter_enabled or facebook_enabled or instagram_enabled):
44
+ return "Fehler: Wähle mindestens ein Netzwerk aus!"
45
+
46
+ log_messages = []
47
+
48
+ # Bild temporär speichern, falls hochgeladen
49
+ image_path = None
50
+ if image is not None:
51
+ image_path = os.path.join(self.temp_dir, "temp_image.jpg")
52
+ image.save(image_path)
53
+
54
+ # Auf Twitter posten
55
+ if twitter_enabled:
56
+ twitter_log = self._post_to_twitter(message, image_path)
57
+ log_messages.append(twitter_log)
58
+
59
+ # Auf Facebook posten
60
+ if facebook_enabled:
61
+ facebook_log = self._post_to_facebook(message, image_path)
62
+ log_messages.append(facebook_log)
63
+
64
+ # Auf Instagram posten
65
+ if instagram_enabled:
66
+ instagram_log = self._post_to_instagram(message, image_path)
67
+ log_messages.append(instagram_log)
68
+
69
+ # Temporäre Datei löschen
70
+ if image_path and os.path.exists(image_path):
71
+ os.remove(image_path)
72
+
73
+ return "\n".join(log_messages)
74
+
75
+ def _post_to_twitter(self, message, image_path):
76
+ """Auf Twitter posten"""
77
+ timestamp = datetime.now().strftime('%H:%M:%S')
78
+
79
+ if len(message) > 280:
80
+ return f"[{timestamp}] Twitter Fehler: Nachricht überschreitet 280 Zeichen ({len(message)})"
81
+
82
+ if not self.credentials_cache.get("twitter", {}).get("api_key"):
83
+ return f"[{timestamp}] Twitter Fehler: Keine API-Credentials gefunden"
84
+
85
+ try:
86
+ twitter_creds = self.credentials_cache["twitter"]
87
+ auth = tweepy.OAuthHandler(
88
+ twitter_creds["api_key"],
89
+ twitter_creds["api_secret"]
90
+ )
91
+ auth.set_access_token(
92
+ twitter_creds["access_token"],
93
+ twitter_creds["token_secret"]
94
+ )
95
+ api = tweepy.API(auth)
96
+
97
+ if image_path:
98
+ media = api.media_upload(image_path)
99
+ api.update_status(status=message, media_ids=[media.media_id])
100
+ else:
101
+ api.update_status(status=message)
102
+
103
+ return f"[{timestamp}] Erfolgreich auf Twitter gepostet"
104
+ except Exception as e:
105
+ return f"[{timestamp}] Twitter Fehler: {str(e)}"
106
+
107
+ def _post_to_facebook(self, message, image_path):
108
+ """Auf Facebook posten"""
109
+ timestamp = datetime.now().strftime('%H:%M:%S')
110
+
111
+ if not self.credentials_cache.get("facebook", {}).get("token"):
112
+ return f"[{timestamp}] Facebook Fehler: Kein Access Token gefunden"
113
+
114
+ try:
115
+ fb_token = self.credentials_cache["facebook"]["token"]
116
+ graph = facebook.GraphAPI(fb_token)
117
+
118
+ if image_path:
119
+ with open(image_path, "rb") as image:
120
+ graph.put_photo(image=image, message=message)
121
+ else:
122
+ graph.put_object("me", "feed", message=message)
123
+
124
+ return f"[{timestamp}] Erfolgreich auf Facebook gepostet"
125
+ except Exception as e:
126
+ return f"[{timestamp}] Facebook Fehler: {str(e)}"
127
+
128
+ def _post_to_instagram(self, message, image_path):
129
+ """Auf Instagram posten"""
130
+ timestamp = datetime.now().strftime('%H:%M:%S')
131
+
132
+ if not image_path:
133
+ return f"[{timestamp}] Instagram Fehler: Bild ist für Instagram-Posts erforderlich"
134
+
135
+ if not self.credentials_cache.get("instagram", {}).get("username"):
136
+ return f"[{timestamp}] Instagram Fehler: Keine Anmeldedaten gefunden"
137
+
138
+ try:
139
+ insta_creds = self.credentials_cache["instagram"]
140
+ bot = Bot()
141
+ bot.login(
142
+ username=insta_creds["username"],
143
+ password=insta_creds["password"]
144
+ )
145
+ bot.upload_photo(image_path, caption=message)
146
+ return f"[{timestamp}] Erfolgreich auf Instagram gepostet"
147
+ except Exception as e:
148
+ return f"[{timestamp}] Instagram Fehler: {str(e)}"
149
+
150
+
151
+ # Gradio Interface erstellen
152
+ def create_app():
153
+ manager = SocialMediaManagerWeb()
154
+
155
+ with gr.Blocks(title="Social Media Manager Web") as app:
156
+ gr.Markdown("# Social Media Manager Web")
157
+
158
+ with gr.Tabs():
159
+ # Post Tab
160
+ with gr.TabItem("Beitrag posten"):
161
+ with gr.Row():
162
+ with gr.Column():
163
+ message_input = gr.Textbox(
164
+ label="Nachricht",
165
+ placeholder="Gib deine Nachricht hier ein...",
166
+ lines=5
167
+ )
168
+ image_input = gr.Image(label="Bild (optional)", type="pil")
169
+
170
+ with gr.Row():
171
+ twitter_check = gr.Checkbox(label="Twitter", value=False)
172
+ facebook_check = gr.Checkbox(label="Facebook", value=False)
173
+ instagram_check = gr.Checkbox(label="Instagram", value=False)
174
+
175
+ post_button = gr.Button("Auf ausgewählten Netzwerken posten")
176
+
177
+ with gr.Column():
178
+ output_log = gr.Textbox(label="Log", lines=10)
179
+
180
+ # Credentials Tab
181
+ with gr.TabItem("Anmeldedaten"):
182
+ gr.Markdown("""
183
+ ### Deine Anmeldedaten
184
+ Diese werden nur temporär im Browser gespeichert und nicht auf dem Server.
185
+ """)
186
+
187
+ with gr.Group():
188
+ gr.Markdown("#### Twitter")
189
+ twitter_api_key = gr.Textbox(label="API Key")
190
+ twitter_api_secret = gr.Textbox(label="API Secret")
191
+ twitter_access_token = gr.Textbox(label="Access Token")
192
+ twitter_token_secret = gr.Textbox(label="Token Secret")
193
+
194
+ with gr.Group():
195
+ gr.Markdown("#### Facebook")
196
+ facebook_token = gr.Textbox(label="Access Token")
197
+
198
+ with gr.Group():
199
+ gr.Markdown("#### Instagram")
200
+ instagram_user = gr.Textbox(label="Benutzername")
201
+ instagram_pass = gr.Textbox(label="Passwort", type="password")
202
+
203
+ save_button = gr.Button("Anmeldedaten speichern")
204
+ save_output = gr.Textbox(label="Status")
205
+
206
+ # Event-Handler
207
+ post_button.click(
208
+ fn=manager.post_to_social,
209
+ inputs=[message_input, image_input, twitter_check, facebook_check, instagram_check],
210
+ outputs=output_log
211
+ )
212
+
213
+ save_button.click(
214
+ fn=manager.save_credentials_temp,
215
+ inputs=[twitter_api_key, twitter_api_secret, twitter_access_token,
216
+ twitter_token_secret, facebook_token, instagram_user, instagram_pass],
217
+ outputs=save_output
218
+ )
219
+
220
+ return app
221
+
222
+ if __name__ == "__main__":
223
+ app = create_app()
224
+ app.launch()