Fourstore commited on
Commit
5f5d165
Β·
verified Β·
1 Parent(s): 5d2f7b7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +166 -60
app.py CHANGED
@@ -85,6 +85,7 @@ def get_ranges_with_count():
85
 
86
  date = get_search_date()
87
  print(f"\nπŸ” AMBIL RANGE - Tanggal: {date}")
 
88
 
89
  r = session.post(GET_RANGE_URL, data={
90
  "_token": csrf_token,
@@ -92,23 +93,43 @@ def get_ranges_with_count():
92
  "to": date
93
  }, timeout=15)
94
 
 
 
 
95
  soup = BeautifulSoup(r.text, "html.parser")
96
  ranges_data = []
97
  items = soup.select(".item")
 
98
 
99
- for item in items:
100
- name_div = item.select_one(".col-sm-4")
101
- if not name_div: continue
102
- rng = name_div.get_text(strip=True)
103
-
104
- count_p = item.select_one(".col-3 .mb-0.pb-0")
105
- count = int(count_p.get_text(strip=True)) if count_p else 0
106
-
107
- ranges_data.append({
108
- "name": rng,
109
- "count": count
110
- })
111
- print(f" πŸ“Œ {rng} - {count} SMS")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
 
113
  return ranges_data
114
 
@@ -123,6 +144,7 @@ def get_numbers_with_count(rng):
123
 
124
  date = get_search_date()
125
  print(f"\n πŸ“ž AMBIL NOMOR: {rng}")
 
126
 
127
  r = session.post(GET_NUMBER_URL, data={
128
  "_token": csrf_token,
@@ -131,26 +153,45 @@ def get_numbers_with_count(rng):
131
  "range": rng
132
  }, timeout=15)
133
 
 
 
 
 
 
 
134
  soup = BeautifulSoup(r.text, "html.parser")
135
  numbers_data = []
136
 
137
- for div in soup.find_all("div", onclick=True):
138
- onclick = div.get("onclick", "")
139
- if "getDetialsNumber" in onclick:
140
- num = div.get_text(strip=True)
141
- if num and num.isdigit() and len(num) > 5:
142
- parent = div.find_parent("div", class_="card")
143
- count = 0
144
- if parent:
145
- p_tag = parent.find("p", class_="mb-0 pb-0")
146
- if p_tag:
147
- count = int(p_tag.get_text(strip=True))
148
 
149
- numbers_data.append({
150
- "number": num,
151
- "count": count
152
- })
153
- print(f" βœ… {mask_number(num)} - {count} SMS")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
 
155
  return numbers_data
156
 
@@ -169,12 +210,14 @@ def get_sms_fast(rng, number):
169
  if cache_key in sms_cache:
170
  timestamp, results = sms_cache[cache_key]
171
  if time.time() - timestamp < 5:
 
172
  return results
173
 
174
  parts = rng.split()
175
  range_name = parts[0] + " " + parts[1] if len(parts) >= 2 else rng
176
 
177
  print(f" πŸ“¨ AMBIL SMS: {mask_number(number)}")
 
178
 
179
  r = session.post(GET_SMS_URL, data={
180
  "_token": csrf_token,
@@ -184,26 +227,41 @@ def get_sms_fast(rng, number):
184
  "Range": range_name
185
  }, timeout=20)
186
 
 
 
 
 
 
 
187
  soup = BeautifulSoup(r.text, "html.parser")
188
  results = []
189
  cards = soup.select("div.card.card-body")
 
190
 
191
- for card in cards:
192
  try:
193
  service = "UNKNOWN"
194
  service_div = card.select_one("div.col-sm-4")
195
  if service_div:
196
  raw = service_div.get_text(strip=True)
197
  service = map_service(raw)
 
198
 
199
  msg_p = card.find("p", class_="mb-0 pb-0")
200
  if msg_p:
201
  sms = msg_p.get_text(strip=True)
 
202
  otp = extract_otp(sms)
203
  if otp:
204
  results.append((service, sms, otp))
205
  print(f" βœ… OTP: {otp} - {service}")
206
- except:
 
 
 
 
 
 
207
  continue
208
 
209
  sms_cache[cache_key] = (time.time(), results)
@@ -510,16 +568,30 @@ def main():
510
  print(" πŸ“‹ TANPA INTEGRASI TELEGRAM")
511
  print("="*60 + "\n")
512
 
513
- for i in range(5):
 
514
  if login():
515
  break
 
 
516
  time.sleep(3)
517
 
 
 
 
 
518
  last_cleanup = time.time()
 
519
 
520
  while True:
521
  try:
 
 
 
 
 
522
  if not LOGIN_SUCCESS or not csrf_token:
 
523
  login()
524
  time.sleep(2)
525
  continue
@@ -528,59 +600,93 @@ def main():
528
  sms_cache.clear()
529
  sms_counter.clear()
530
  range_counter.clear()
531
- print("🧹 Cache cleared")
532
  last_cleanup = time.time()
533
 
534
  ranges_data = get_ranges_with_count()
535
 
 
 
 
 
 
 
 
536
  for range_item in ranges_data:
537
  rng = range_item["name"]
538
  current_count = range_item["count"]
539
  prev_count = range_counter.get(rng, 0)
540
 
 
 
 
541
  if current_count > prev_count:
542
  country = clean_country(rng)
543
- print(f"\nπŸ”₯ RANGE BERUBAH: {country}")
544
- print(f" πŸ“Š {prev_count} β†’ {current_count} SMS")
545
  range_counter[rng] = current_count
546
 
547
  numbers_data = get_numbers_with_count(rng)
548
 
549
- for number_item in numbers_data:
550
- num = number_item["number"]
551
- num_count = number_item["count"]
552
- key = f"{rng}-{num}"
553
- prev_num_count = sms_counter.get(key, 0)
554
 
555
- if num_count > prev_num_count:
556
- print(f" πŸ“± Nomor: {mask_number(num)}")
557
- print(f" πŸ“¨ {prev_num_count} β†’ {num_count} SMS")
558
- sms_counter[key] = num_count
 
559
 
560
- all_sms = get_sms_fast(rng, num)
561
- new_sms = all_sms[prev_num_count:]
562
 
563
- for service, sms, otp in new_sms:
564
- if otp:
565
- sms_id = f"{rng}-{num}-{otp}"
566
- if sms_id not in sent_cache:
567
- masked = mask_number(num)
568
- sent_cache.add(sms_id)
569
- add_otp_log(country, masked, service, otp, sms)
570
- print(f" βœ… OTP: {otp} - {service} (DASHBOARD ONLY)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
571
 
572
- print(f" βœ… Selesai proses {country}")
573
  time.sleep(0.5)
 
 
574
 
575
- print("\n⏳ Tidur 2 detik...")
576
- time.sleep(2)
577
 
578
  except Exception as e:
579
- print(f"❌ Error: {e}")
580
- time.sleep(3)
 
 
581
 
582
  if __name__ == "__main__":
583
  try:
584
  main()
585
  except KeyboardInterrupt:
586
- print("\nπŸ›‘ BOT STOPPED")
 
 
 
 
85
 
86
  date = get_search_date()
87
  print(f"\nπŸ” AMBIL RANGE - Tanggal: {date}")
88
+ print(f"πŸ“€ POST ke: {GET_RANGE_URL}")
89
 
90
  r = session.post(GET_RANGE_URL, data={
91
  "_token": csrf_token,
 
93
  "to": date
94
  }, timeout=15)
95
 
96
+ print(f"πŸ“Š Response status: {r.status_code}")
97
+ print(f"πŸ“„ Response preview: {r.text[:200]}")
98
+
99
  soup = BeautifulSoup(r.text, "html.parser")
100
  ranges_data = []
101
  items = soup.select(".item")
102
+ print(f"πŸ“¦ Ditemukan {len(items)} item range")
103
 
104
+ for idx, item in enumerate(items, 1):
105
+ try:
106
+ name_div = item.select_one(".col-sm-4")
107
+ if not name_div:
108
+ print(f" {idx}. ❌ Tidak ada name_div")
109
+ continue
110
+
111
+ rng = name_div.get_text(strip=True)
112
+ print(f" {idx}. Nama range: {rng}")
113
+
114
+ count_p = item.select_one(".col-3 .mb-0.pb-0")
115
+ count = 0
116
+ if count_p:
117
+ count_text = count_p.get_text(strip=True)
118
+ print(f" Count text: '{count_text}'")
119
+ try:
120
+ count = int(count_text)
121
+ except:
122
+ count = 0
123
+
124
+ ranges_data.append({
125
+ "name": rng,
126
+ "count": count
127
+ })
128
+ print(f" βœ… {rng} - {count} SMS")
129
+
130
+ except Exception as e:
131
+ print(f" ❌ Error parse item {idx}: {e}")
132
+ continue
133
 
134
  return ranges_data
135
 
 
144
 
145
  date = get_search_date()
146
  print(f"\n πŸ“ž AMBIL NOMOR: {rng}")
147
+ print(f" πŸ“€ POST ke: {GET_NUMBER_URL}")
148
 
149
  r = session.post(GET_NUMBER_URL, data={
150
  "_token": csrf_token,
 
153
  "range": rng
154
  }, timeout=15)
155
 
156
+ print(f" πŸ“Š Status: {r.status_code}")
157
+
158
+ if r.status_code != 200:
159
+ print(f" ❌ Gagal! Status: {r.status_code}")
160
+ return []
161
+
162
  soup = BeautifulSoup(r.text, "html.parser")
163
  numbers_data = []
164
 
165
+ divs = soup.find_all("div", onclick=True)
166
+ print(f" πŸ“¦ Ditemukan {len(divs)} div dengan onclick")
167
+
168
+ for div in divs:
169
+ try:
170
+ onclick = div.get("onclick", "")
171
+ if "getDetialsNumber" in onclick:
172
+ num = div.get_text(strip=True)
173
+ print(f" Nomor ditemukan: {num}")
 
 
174
 
175
+ if num and num.isdigit() and len(num) > 5:
176
+ parent = div.find_parent("div", class_="card")
177
+ count = 0
178
+ if parent:
179
+ p_tag = parent.find("p", class_="mb-0 pb-0")
180
+ if p_tag:
181
+ try:
182
+ count = int(p_tag.get_text(strip=True))
183
+ except:
184
+ count = 0
185
+
186
+ numbers_data.append({
187
+ "number": num,
188
+ "count": count
189
+ })
190
+ print(f" βœ… {mask_number(num)} - {count} SMS")
191
+
192
+ except Exception as e:
193
+ print(f" ❌ Error: {e}")
194
+ continue
195
 
196
  return numbers_data
197
 
 
210
  if cache_key in sms_cache:
211
  timestamp, results = sms_cache[cache_key]
212
  if time.time() - timestamp < 5:
213
+ print(f" πŸ’Ύ Cache hit: {len(results)} SMS")
214
  return results
215
 
216
  parts = rng.split()
217
  range_name = parts[0] + " " + parts[1] if len(parts) >= 2 else rng
218
 
219
  print(f" πŸ“¨ AMBIL SMS: {mask_number(number)}")
220
+ print(f" πŸ“€ POST ke: {GET_SMS_URL}")
221
 
222
  r = session.post(GET_SMS_URL, data={
223
  "_token": csrf_token,
 
227
  "Range": range_name
228
  }, timeout=20)
229
 
230
+ print(f" πŸ“Š Status: {r.status_code}")
231
+
232
+ if r.status_code != 200:
233
+ print(f" ❌ Gagal! Status: {r.status_code}")
234
+ return []
235
+
236
  soup = BeautifulSoup(r.text, "html.parser")
237
  results = []
238
  cards = soup.select("div.card.card-body")
239
+ print(f" πŸ“¦ Ditemukan {len(cards)} SMS cards")
240
 
241
+ for idx, card in enumerate(cards, 1):
242
  try:
243
  service = "UNKNOWN"
244
  service_div = card.select_one("div.col-sm-4")
245
  if service_div:
246
  raw = service_div.get_text(strip=True)
247
  service = map_service(raw)
248
+ print(f" Card {idx}: Service = {service}")
249
 
250
  msg_p = card.find("p", class_="mb-0 pb-0")
251
  if msg_p:
252
  sms = msg_p.get_text(strip=True)
253
+ print(f" SMS: {sms[:50]}...")
254
  otp = extract_otp(sms)
255
  if otp:
256
  results.append((service, sms, otp))
257
  print(f" βœ… OTP: {otp} - {service}")
258
+ else:
259
+ print(f" ⚠️ Tidak ada OTP dalam SMS")
260
+ else:
261
+ print(f" ❌ Tidak ada msg_p")
262
+
263
+ except Exception as e:
264
+ print(f" ❌ Error parse card {idx}: {e}")
265
  continue
266
 
267
  sms_cache[cache_key] = (time.time(), results)
 
568
  print(" πŸ“‹ TANPA INTEGRASI TELEGRAM")
569
  print("="*60 + "\n")
570
 
571
+ login_attempts = 0
572
+ while login_attempts < 5:
573
  if login():
574
  break
575
+ login_attempts += 1
576
+ print(f"⏳ Login gagal, percobaan ke-{login_attempts}/5...")
577
  time.sleep(3)
578
 
579
+ if not LOGIN_SUCCESS:
580
+ print("\n❌❌❌ GAGAL LOGIN! BOT TIDAK BISA JALAN ❌❌❌")
581
+ print("πŸ’‘ CEK USERNAME/PASSWORD!")
582
+
583
  last_cleanup = time.time()
584
+ loop_count = 0
585
 
586
  while True:
587
  try:
588
+ loop_count += 1
589
+ print(f"\n{'='*50}")
590
+ print(f"πŸ”„ LOOP KE-{loop_count}")
591
+ print(f"{'='*50}")
592
+
593
  if not LOGIN_SUCCESS or not csrf_token:
594
+ print("⚠️ Session expired, login ulang...")
595
  login()
596
  time.sleep(2)
597
  continue
 
600
  sms_cache.clear()
601
  sms_counter.clear()
602
  range_counter.clear()
603
+ print("🧹 Cache cleared (5 menit)")
604
  last_cleanup = time.time()
605
 
606
  ranges_data = get_ranges_with_count()
607
 
608
+ if not ranges_data:
609
+ print("⚠️ TIDAK ADA DATA RANGE! Cek session atau struktur HTML")
610
+ time.sleep(5)
611
+ continue
612
+
613
+ print(f"\nπŸ“‹ RANGES DITEMUKAN: {len(ranges_data)}")
614
+
615
  for range_item in ranges_data:
616
  rng = range_item["name"]
617
  current_count = range_item["count"]
618
  prev_count = range_counter.get(rng, 0)
619
 
620
+ print(f"\n πŸ“Œ RANGE: {rng}")
621
+ print(f" Current: {current_count} | Previous: {prev_count}")
622
+
623
  if current_count > prev_count:
624
  country = clean_country(rng)
625
+ print(f" πŸ”₯πŸ”₯πŸ”₯ RANGE BERUBAH: {country} πŸ”₯πŸ”₯πŸ”₯")
626
+ print(f" πŸ“Š {prev_count} β†’ {current_count} SMS (baru: {current_count - prev_count})")
627
  range_counter[rng] = current_count
628
 
629
  numbers_data = get_numbers_with_count(rng)
630
 
631
+ if numbers_data:
632
+ print(f" πŸ“ž Ditemukan {len(numbers_data)} nomor dengan SMS")
 
 
 
633
 
634
+ for number_item in numbers_data:
635
+ num = number_item["number"]
636
+ num_count = number_item["count"]
637
+ key = f"{rng}-{num}"
638
+ prev_num_count = sms_counter.get(key, 0)
639
 
640
+ print(f" πŸ“± Nomor: {mask_number(num)} - Count: {num_count} (prev: {prev_num_count})")
 
641
 
642
+ if num_count > prev_num_count:
643
+ print(f" πŸ“¨ {prev_num_count} β†’ {num_count} SMS (baru: {num_count - prev_num_count})")
644
+ sms_counter[key] = num_count
645
+
646
+ all_sms = get_sms_fast(rng, num)
647
+ new_sms = all_sms[prev_num_count:]
648
+
649
+ if new_sms:
650
+ print(f" πŸ“¦ {len(new_sms)} SMS BARU DITEMUKAN!")
651
+
652
+ for service, sms, otp in new_sms:
653
+ if otp:
654
+ sms_id = f"{rng}-{num}-{otp}"
655
+ if sms_id not in sent_cache:
656
+ masked = mask_number(num)
657
+ sent_cache.add(sms_id)
658
+ add_otp_log(country, masked, service, otp, sms)
659
+ print(f" βœ… OTP: {otp} - {service} (DITAMBAHKAN KE DASHBOARD)")
660
+ else:
661
+ print(f" ⏭️ OTP {otp} sudah ada di cache")
662
+ else:
663
+ print(f" ⚠️ SMS tanpa OTP")
664
+ else:
665
+ print(f" ⚠️ TIDAK ADA SMS BARU (semua sudah diproses)")
666
+ else:
667
+ print(f" ⏭️ Tidak ada SMS baru untuk nomor ini")
668
+ else:
669
+ print(f" ⚠️ TIDAK ADA NOMOR dengan SMS di range {country}")
670
 
671
+ print(f" βœ… Selesai proses {country}")
672
  time.sleep(0.5)
673
+ else:
674
+ print(f" ⏭️ RANGE TIDAK BERUBAH (count sama: {current_count})")
675
 
676
+ print("\n⏳ Tidur 3 detik sebelum scan ulang...")
677
+ time.sleep(3)
678
 
679
  except Exception as e:
680
+ print(f"\n❌❌❌ ERROR UTAMA: {str(e)}")
681
+ print(f"πŸ“‹ Tipe error: {type(e).__name__}")
682
+ print("⏳ Coba lagi dalam 5 detik...")
683
+ time.sleep(5)
684
 
685
  if __name__ == "__main__":
686
  try:
687
  main()
688
  except KeyboardInterrupt:
689
+ print("\nπŸ›‘ BOT STOPPED")
690
+ except Exception as e:
691
+ print(f"\nπŸ’₯ FATAL ERROR: {e}")
692
+ time.sleep(5)