

Web Sitesi Python Uygulaması İle Yapılan Sorguyu Kesin Bloklayabilir Mi?
-
Merhaba, kullandığımız bir web sitesi için işlerimi kolaylaştırmak adına yapay zekaya python ile uygulama yaptırmaya çalışıyorum. Siteye login olacak, liste çağıracak, gelen listede şifrelenmiş id'ler var. Oradan id alıp hazır url sonuna ekleyip sonuçların olduğu sayfayı açacak. Login işini yaptı ancak liste çağırmaya gelince site python çağrısı engelleniyor deyip post yöntemi yerine browser açıp tıklama yaptıralım dedi.
----
Hata bu:
[DEBUG] DataTables status: 200 [DEBUG] DataTables content-type: text/html; charset=utf-8 [DEBUG] Body ilk 300 karakter: <html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 1111<br><br><a href='javascript:history.back();'>[Go Back]</a></body></html>
Yapay zeka ise :
Bu çıktı çok net:
WAF/Firewall (uygulama güvenlik duvarı) Python requestsçağrısını engelliyor.Request Rejected+support IDbunu gösterir. Yani problem “JSON parse” değil;sunucu DataTables endpoint’ine tarayıcı gibi görünmeyen istemcileri sokmuyor. Bu durumda “requests ile direkt POST atayım” yaklaşımı
bu endpoint için çalışmayacak (login çalışsa bile). ---
Normalde login olduktan sonra listenin olduğu sayfaya geçip orada liste için gerekli kriterleri girip arama yapıyoruz. Bu arama işini login olduktan sonraki sayfada chrome konsola yazınca sorunsuz yapıyor. Konsol'dan sorgu yapmam için bir kod hazırladı. Onu konsola girince cevap alıyorum. Liste geliyor. Benim takıldığım kısım login olurken engellemiyor ama python sorgu yapınca neden engelliyor? Acaba hatalı sorgu yaptık diye mi engelledi? Yoksa gerçekten python olduğunu anladığı için mi engelledi?
Bunu aşmanın yolu var mı? Browser açıp onun üstünden yaptırmak istemiyorum açıkçası. Şimdiden tşkler
-
Normalde site kolay kolay sorgunun pythondan geldiğini anlayamaz ama cloudflare waf varsa anlayabilir, eğer chrome açarak requestini gönderebiliyorsan o şekilde devam et derim. Ya da performansa gerçekten ihtiyacın varsa o chromeun network tabından requesti olduğu gibi alıp raw göndermeyi dene pyton ile öyle de aşabilirsin. ama waf birden fazla çağrıyı analiz ediyor olabilir onu bilemedim.
-
HolyOne bunu yazdı
Normalde site kolay kolay sorgunun pythondan geldiğini anlayamaz ama cloudflare waf varsa anlayabilir, eğer chrome açarak requestini gönderebiliyorsan o şekilde devam et derim. Ya da performansa gerçekten ihtiyacın varsa o chromeun network tabından requesti olduğu gibi alıp raw göndermeyi dene pyton ile öyle de aşabilirsin. ama waf birden fazla çağrıyı analiz ediyor olabilir onu bilemedim.
Tls fingerprintten falan da anlıyorlar artık şeyhim. Baya low level tcp paketini profilliyor lavuklar. Eğer requestlerde hata yapmiyorsa ve yine de site anlayıp naş çekiyorsa pip'teki curl-cffi paketini denesin bir arkadaş
-
HolyOne bunu yazdı
Normalde site kolay kolay sorgunun pythondan geldiğini anlayamaz ama cloudflare waf varsa anlayabilir, eğer chrome açarak requestini gönderebiliyorsan o şekilde devam et derim. Ya da performansa gerçekten ihtiyacın varsa o chromeun network tabından requesti olduğu gibi alıp raw göndermeyi dene pyton ile öyle de aşabilirsin. ama waf birden fazla çağrıyı analiz ediyor olabilir onu bilemedim.
Raw gönderme işi nasıl oluyor? Yapay zekka post u bash olarak kopyala gönder konsolda kontrol etmek için kod vericem demişti. O mu?
Bir de red sebebi kesin yapay zekanın dediği gibi midir? Requestte hata olsa bundan dolayı bloklar mı yoksa red yerine requestte hata mı var der?
Liquid tarafından 09/Oca/26 13:30 tarihinde düzenlenmiştir -
python ile yapma. playwright ile normal user profili imiş gibi imitate ederek sayfaya gir, javascript ile ne istiyorsan alıp pythona aktarabilirsin.
-
nonelabs bunu yazdı
python ile yapma. playwright ile normal user profili imiş gibi imitate ederek sayfaya gir, javascript ile ne istiyorsan alıp pythona aktarabilirsin.
playwright ile bişey yaptırıyor hocam şuan. Kodlama bilmediğim için ne derse deniyorum. Tabi sürekli her şeyi de denemek istemiyorum. Sistem yöneticisi de hataları fark ederse hayırdır diyecek :)
ben istiyordum ki uygulamayı açayım, bağlanıp sonuçları alıp excel'e aktarsın. öyle browser falan açıp, yüklemesini beklemesin ama o şekilde olmayacak gibi.
-
user agent gönderdin mi ? chrome vs gibi
-
Cosmic bunu yazdı
user agent gönderdin mi ? chrome vs gibi
yazdığı kodu atıcam hocam ama yazışma uzadıkça acayip kasıyor. ulaşınca atıcam. sanırım onu atlamamıştır.
-
aşağıda bir kısmı var.
----------
import re import sys from typing import Dict, Any, List, Optional, Tuple import requests GKLS_BASE = "xx" GKLS_TUM_NUMUNELER = f"{xx)" # TODO: Burayı Network'ten bulduğun "Request URL" ile güncelle DATATABLES_URL = f"{xxr" YETKI_LOGIN_MARKER = "xxx" def verify_logged_in(session: requests.Session) -> None: r = session.get(xxxx, allow_redirects=False, timeout=30) if r.status_code in (301, 302, 303, 307, 308): loc = r.headers.get("Location", "") if xxxx in loc: raise RuntimeError("Oturum yok / login gerekli.") if r.status_code != 200: raise RuntimeError(f"Beklenmeyen durum kodu: {r.status_code}") def prompt_credentials() -> Tuple[str, str]: import getpass username = input("Kullanıcı Adı: ").strip() password = getpass.getpass("Şifre: ").strip() return username, password def extract_form_inputs(html: str) -> Dict[str, str]: from bs4 import BeautifulSoup soup = BeautifulSoup(html, "lxml") form = soup.find("form") if not form: return {} data: Dict[str, str] = {} for inp in form.select("input[name]"): name = inp.get("name") if not name: continue itype = (inp.get("type") or "").lower() if itype in ("checkbox", "radio"): continue data[name] = inp.get("value", "") return data def do_login(session: requests.Session, username: str, password: str) -> None: # xxx'e git r = session.get(xxx, allow_redirects=True, timeout=30) if xxxx not in r.url: verify_logged_in(session) return payload = extract_form_inputs(r.text) payload["txtKullaniciAdi"] = username payload["txtSifre"] = password payload["__EVENTTARGET"] = "btnGiris" payload["__EVENTARGUMENT"] = "" payload.setdefault("btnGiris", "Giriş") session.headers.update({ "Origin": "xxxx", "Referer": r.url, }) session.post(r.url, data=payload, allow_redirects=True, timeout=30) verify_logged_in(session) def build_datatables_payload(search_value: str, start: int, length: int, draw: int = 1) -> Dict[str, Any]: """ DataTables server-side payload. Senin paylaştığın payload ile uyumlu olacak şekilde minimum alanları gönderiyoruz. (columns[] listesi şart olabiliyor.) """ cols = [xxx] payload: Dict[str, Any] = { "draw": draw, "start": start, "length": length, "search[value]": search_value, "search[regex]": "false", "order[0][column]": "1", # xx "order[0][dir]": "desc", "xxxx": "false", # diğer filtreleri boş geçiyoruz: } for i, c in enumerate(cols): payload[f"columns[{i}][data]"] = c payload[f"columns[{i}][name]"] = "" payload[f"columns[{i}][searchable]"] = "true" payload[f"columns[{i}][orderable]"] = "true" if c != "xxx" else "false" payload[f"columns[{i}][search][value]"] = "" payload[f"columns[{i}][search][regex]"] = "false" return payload def extract_xxx(islemler_html: str) -> Optional[str]: """ IsLeMLeR HTML string'inden xxx parametresini çeker. Örnek: xxxx"""--------------
devamı da var ama bundan sonra aşağıdakini güncelledi. login işlemi olmuştu sorgu olmamıştı.
---------------------------------------
def fetch_numune_page(session: requests.Session, search_value: str, start: int = 0, length: int = 100):
verify_logged_in(session)payload = build_datatables_payload(search_value=search_value, start=start, length=length, draw=1)
headers = {
"X-Requested-With": "XMLHttpRequest",
"Referer": xxxxxx,
"Accept": "application/json, text/javascript, */*; q=0.01",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
}# Redirect olursa yakalayalım (login sayfasına atıyor mu?)
r = session.post(DATATABLES_URL, data=payload, headers=headers, timeout=30, allow_redirects=False)print("\n[DEBUG] DataTables status:", r.status_code)
print("[DEBUG] DataTables content-type:", r.headers.get("Content-Type", ""))# Redirect kontrolü
if r.status_code in (301, 302, 303, 307, 308):
loc = r.headers.get("Location", "")
print("[DEBUG] Redirect Location:", loc)
raise RuntimeError("DataTables isteği redirect oldu (muhtemelen login düştü).")r.raise_for_status()
text = (r.text or "")
print("[DEBUG] Body ilk 300 karakter:\n", text[:300].replace("\n", "\\n"))# JSON parse
return r.json().get("data", [])--------
bundan sonra da firewall bloklamış dedi.