Akwbw commited on
Commit
991ecaf
Β·
verified Β·
1 Parent(s): c85b8de

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +257 -0
app.py ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+ import json
4
+ import time
5
+ import threading
6
+ import base64
7
+ from datetime import datetime
8
+ from playwright.sync_api import sync_playwright
9
+ from groq import Groq
10
+
11
+ # --- CONFIGURATION ---
12
+ GROQ_API_KEY = "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" # Apni key yahan lagayen
13
+ DATA_DIR = "/code/data"
14
+ AUTH_FILE = os.path.join(DATA_DIR, "auth.json")
15
+ MEMORY_FILE = os.path.join(DATA_DIR, "bot_memory.json")
16
+
17
+ # Initialize Groq
18
+ client = Groq(api_key=GROQ_API_KEY)
19
+
20
+ # --- GLOBAL STATE MANAGED IN MEMORY ---
21
+ if "bot_status" not in st.session_state:
22
+ st.session_state.bot_status = "Idle"
23
+ if "logs" not in st.session_state:
24
+ st.session_state.logs = []
25
+
26
+ # Global variables for background thread access
27
+ class BotState:
28
+ browser = None
29
+ context = None
30
+ page = None
31
+ playwright = None
32
+ is_running = False
33
+ latest_screenshot = None
34
+
35
+ bot = BotState()
36
+
37
+ # --- HELPER FUNCTIONS ---
38
+
39
+ def log(message):
40
+ timestamp = datetime.now().strftime("%H:%M:%S")
41
+ entry = f"[{timestamp}] {message}"
42
+ print(entry)
43
+ st.session_state.logs.append(entry)
44
+ # Keep log size manageable
45
+ if len(st.session_state.logs) > 50:
46
+ st.session_state.logs.pop(0)
47
+
48
+ def save_memory(task, status):
49
+ """AI ki memory save karta hai taake usay yaad rahe"""
50
+ data = {"last_task": task, "status": status, "timestamp": str(datetime.now())}
51
+ with open(MEMORY_FILE, 'w') as f:
52
+ json.dump(data, f)
53
+
54
+ def get_ai_decision(page_content, current_url):
55
+ """Groq AI se poochta hai ke ab kya karna chahiye"""
56
+ prompt = f"""
57
+ You are an autonomous CoinPayU Bot.
58
+ Current URL: {current_url}
59
+ Page Text Summary: {page_content[:1000]}...
60
+
61
+ GOAL: Watch Ads, Click 'View', Solve Captchas (if simple), Complete Surveys.
62
+
63
+ Return JSON ACTION:
64
+ {{"action": "click", "selector": "..."}}
65
+ OR {{"action": "wait", "seconds": 10}}
66
+ OR {{"action": "navigate", "url": "..."}}
67
+ OR {{"action": "done"}}
68
+ """
69
+ try:
70
+ completion = client.chat.completions.create(
71
+ model="llama-3.3-70b-versatile",
72
+ messages=[{"role": "system", "content": "You are a JSON-only bot controller."},
73
+ {"role": "user", "content": prompt}],
74
+ response_format={"type": "json_object"}
75
+ )
76
+ return json.loads(completion.choices[0].message.content)
77
+ except Exception as e:
78
+ log(f"AI Error: {e}")
79
+ return {"action": "wait", "seconds": 5}
80
+
81
+ # --- BROWSER MANAGEMENT ---
82
+
83
+ def start_browser():
84
+ if bot.browser: return
85
+
86
+ bot.playwright = sync_playwright().start()
87
+ bot.browser = bot.playwright.chromium.launch(
88
+ headless=True,
89
+ args=['--no-sandbox', '--disable-blink-features=AutomationControlled']
90
+ )
91
+
92
+ # Load session if exists
93
+ if os.path.exists(AUTH_FILE):
94
+ log("♻️ Loading saved session...")
95
+ bot.context = bot.browser.new_context(storage_state=AUTH_FILE, viewport={'width': 1280, 'height': 800})
96
+ else:
97
+ log("πŸ†• Starting fresh session...")
98
+ bot.context = bot.browser.new_context(viewport={'width': 1280, 'height': 800})
99
+
100
+ bot.page = bot.context.new_page()
101
+ bot.page.goto("https://www.coinpayu.com/dashboard")
102
+ update_screenshot()
103
+
104
+ def save_session():
105
+ """Login cookies save karta hai"""
106
+ if bot.context:
107
+ bot.context.storage_state(path=AUTH_FILE)
108
+ log("βœ… Session Saved! Next time auto-login.")
109
+
110
+ def update_screenshot():
111
+ if bot.page:
112
+ try:
113
+ screenshot_bytes = bot.page.screenshot(type='jpeg', quality=50)
114
+ bot.latest_screenshot = base64.b64encode(screenshot_bytes).decode('utf-8')
115
+ except: pass
116
+
117
+ # --- AUTOMATION LOOPS ---
118
+
119
+ def manual_interaction(action, selector=None, text=None):
120
+ """User ke commands handle karta hai"""
121
+ if not bot.page: start_browser()
122
+
123
+ try:
124
+ if action == "click":
125
+ if selector: bot.page.click(selector)
126
+ else: # Click center if no selector (generic)
127
+ pass
128
+ elif action == "goto":
129
+ bot.page.goto(text)
130
+ elif action == "type":
131
+ bot.page.keyboard.type(text)
132
+ bot.page.keyboard.press("Enter")
133
+ elif action == "scroll":
134
+ bot.page.mouse.wheel(0, 500)
135
+
136
+ update_screenshot()
137
+ except Exception as e:
138
+ log(f"Error: {e}")
139
+
140
+ def auto_farm_thread():
141
+ """Background thread jo chalta rahega"""
142
+ log("πŸ€– Auto-Bot Started...")
143
+ start_browser()
144
+
145
+ while bot.is_running:
146
+ try:
147
+ page = bot.page
148
+
149
+ # 1. Check if on Surf Ads Page
150
+ if "ads_surf" not in page.url:
151
+ log("Navigating to Surf Ads...")
152
+ page.goto("https://www.coinpayu.com/dashboard/ads_surf")
153
+ time.sleep(5)
154
+
155
+ # 2. Find Ads
156
+ ads = page.query_selector_all(".ag-cell-value") # Common selector for CoinPayU ads
157
+
158
+ if not ads:
159
+ log("No ads found or page loading. Checking AI...")
160
+ # Ask AI what to do if stuck
161
+ content = page.inner_text("body")
162
+ decision = get_ai_decision(content, page.url)
163
+ # Process AI decision (Simplified for this snippet)
164
+ time.sleep(5)
165
+ continue
166
+
167
+ # 3. Process Ads
168
+ log(f"Found {len(ads)} Ads. Clicking first one...")
169
+
170
+ # Context handle for new tab
171
+ with bot.context.expect_page() as new_page_info:
172
+ ads[0].click()
173
+
174
+ ad_page = new_page_info.value
175
+ log("Watching Ad... (20s)")
176
+
177
+ # Simulate Human behavior
178
+ time.sleep(5)
179
+ ad_page.mouse.wheel(0, 200)
180
+ time.sleep(15)
181
+
182
+ ad_page.close()
183
+ log("Ad Closed. Earnings +++")
184
+
185
+ # Save Memory
186
+ save_memory("Watched Ad", "Success")
187
+
188
+ # Refresh to get new list
189
+ page.reload()
190
+ time.sleep(3)
191
+ update_screenshot()
192
+
193
+ except Exception as e:
194
+ log(f"Bot Error: {e}")
195
+ time.sleep(5)
196
+
197
+ # --- UI LAYOUT (STREAMLIT) ---
198
+
199
+ st.set_page_config(layout="wide", page_title="CoinPayU AI Bot")
200
+
201
+ st.title("πŸ€– CoinPayU Auto-Farmer (AI Powered)")
202
+
203
+ col1, col2 = st.columns([2, 1])
204
+
205
+ with col1:
206
+ st.subheader("Live Browser View")
207
+ image_placeholder = st.empty()
208
+
209
+ # Auto-refresh loop for UI
210
+ if bot.latest_screenshot:
211
+ image_bytes = base64.b64decode(bot.latest_screenshot)
212
+ image_placeholder.image(image_bytes, caption="Live Feed", use_column_width=True)
213
+ else:
214
+ image_placeholder.info("Browser stopped or loading...")
215
+
216
+ with col2:
217
+ st.subheader("Controls Panel")
218
+
219
+ # Manual Controls
220
+ if st.button("πŸ”΅ Start Browser / Connect"):
221
+ start_browser()
222
+ st.rerun()
223
+
224
+ if st.button("πŸ’Ύ Save Login Session"):
225
+ save_session()
226
+ st.success("Session Saved! Bot will auto-login next time.")
227
+
228
+ st.markdown("---")
229
+ st.write("**Manual Override:**")
230
+ user_input = st.text_input("Type text / URL")
231
+ c1, c2, c3 = st.columns(3)
232
+ if c1.button("Type"): manual_interaction("type", text=user_input)
233
+ if c2.button("Enter"): manual_interaction("type", text="\n") # Hack for Enter
234
+ if c3.button("Scroll"): manual_interaction("scroll")
235
+
236
+ st.markdown("---")
237
+ st.subheader("πŸ€– AI Auto-Pilot")
238
+
239
+ if st.button("πŸ”₯ START FARMING"):
240
+ if not bot.is_running:
241
+ bot.is_running = True
242
+ t = threading.Thread(target=auto_farm_thread)
243
+ t.start()
244
+ st.success("Bot is running in background!")
245
+
246
+ if st.button("πŸ›‘ STOP"):
247
+ bot.is_running = False
248
+ st.warning("Stopping bot...")
249
+
250
+ st.markdown("---")
251
+ st.subheader("System Logs")
252
+ log_text = "\n".join(st.session_state.logs[::-1])
253
+ st.text_area("Logs", log_text, height=200)
254
+
255
+ # Auto-refresh UI every 2 seconds to show live updates
256
+ time.sleep(2)
257
+ st.rerun()