sorunun sebebini hala anlamış değilim, yinede çözüldü. işletim sistemini güncelledim, bazı unicode karakterleri görüyor bazılarını görmüyordu tarayıcı ve charset fark etmeksizin. muhtemelen debian da eksik kalmış bazı paketlerden kaynaklanıyor bilemiyorum. bilgisayarı formatlayınca sorun çözüldü.
kontrolü sadece if olarak belirttiğinde bazı durumlarda tutarsız davranabiliyor, eşittir dediğinde ise true değerini değişken tanımlı olarak algılaması da mümkün. bool değerlerle çalışırken denktir kullan.
is_loggedin() === true ? print("giriş yapıldı") : die("yetkisiz giriş");
bunu bi test eder misin?
document.querySelectorAll('#btn-1, #btn-2').forEach( btn => {
btn.addEventListener('click', event => {
alert(event.target.id)
})
});
@trsherlock madem çözdün, kodunu ekleyip çözüldü yapsaydın ya. boşuna uğraştım : ) senin örneğin ile benim örneğimin çalışma prensipleri aslında aynı, farkı anlamak için senin kodunu çalıştırdım; aynı sonucu aldım 302. benim örneğimde de 302'yi tek tek takip ettiğim kısmı atarsak, aslında kodlama aynı kodlama. gözden kaçırdığım ne var burada anlamadım. madem senin ki çalışıyor, benimki de çalışmalı. niye giriş yapmıyorlar? başta bir şeyi eksik yaptım diye düşündüm ama, bi saniye şimdi anladım. id değerinizi bildiğiniz için, manuel istek gönderiyorsunuz muhtemelen. bu da buraya eklediğiniz kodun eksik olduğu anlamına geliyor, eğer şöyle yaparsam;
$this->url = 'https://uygulama.parasut.com/accounts/426236/account';
$this->curlGet(["curl" => $c, "post" => false]);
evet giriş yaptım
bunu en başta da yapabilirdim, önceki mesajda belirtmiştim {id}/account
a yönlendirmesi gerekiyor diye. elle url girmek doğru gelmedi bana, bu yüzden bana göre benim sınıfım hala başarısız; giriş yaptığı halde. hadi üşenmeyim başarılı hale getireyim dedim ama, curl ile bağlanırken, site beklenildiği gibi çalışmıyor. post istediğinin ardından alınan son 302'nin ardından https://uygulama.parasut.com adresine yapılan yönlendirmenin sayfayı accounts/426236/account
a yönlendirmesi gerekiyor. ama yönlendirmiyor. header da konuyla alakalı bilgi çıktılamadığı için, neticede elle url girmekten başka çare bırakmıyor gibi duruyor. neyse. çözdüğün halde bile eksik kod göndermen enteresan, konuyu hortlatan arkadaşa bari yardım için bıraksaydın kodu. diğer arkadaş için çalışan tam kod örneğini aşağıya bırakıyorum, eposta, şifre ve id bilgilerini düzenlemeniz yeterli olur;
error_reporting(E_ALL);
class Parasut{
private $url = 'https://uygulama.parasut.com/kullanici-girisi';
private $eposta = '[email protected]';
private $sifre = 'parasut';
private $id = 426236;
private $hatirla = 0;
function giris(){
$curl = $this->curlCustom();
echo $curl["status"] === true ? $curl["output"] : "curl bağlanamadı";
}
private function curlCustom(){
$c = curl_init();
$this->curlGet(["curl" => $c, "post" => false]);
$sonuc = curl_exec($c);
if(curl_getinfo($c, CURLINFO_RESPONSE_CODE) === 200){
preg_match('/name="authenticity_token" value="(.*?)"/si', $sonuc, $token);
$data = array(
"authenticity_token" => $token[1],
"user[email]" => $this->eposta,
"user[password]" => $this->sifre,
"user[remember_me]" => $this->hatirla,
"commit" => "OTURUM AÇ"
);
$this->curlGet([
"curl" => $c,
"post" => true,
"data" => http_build_query($data)
]);
curl_exec($c);
$this->url = sprintf('https://uygulama.parasut.com/accounts/%d/account', $this->id);
$this->curlGet(["curl" => $c, "post" => false]);
$curlInfo = array(
"status" => true,
"request" => curl_getinfo($c,CURLINFO_HEADER_OUT),
"output" => curl_exec($c),
"token" => $token[1]
);
}else{
$curlInfo = array("status" => false);
}
curl_close($c);
return $curlInfo;
}
private function curlGet($init){
$key = $init["post"] === true ? CURLOPT_POSTFIELDS : CURLOPT_HEADER;
$val = $init["post"] === true ? $init["data"] : false;
return curl_setopt_array($init["curl"], [
CURLOPT_URL => $this->url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLINFO_HEADER_OUT => true,
CURLOPT_POST => $init["post"],
CURLOPT_COOKIESESSION => true,
CURLOPT_COOKIEJAR => './cerez',
CURLOPT_COOKIEFILE => './cerez',
$key => $val
]);
}
}
konuyu aktif görünce çözeyim istedim ama gözden kaçırdığım bir şeyler var sanırım. teoride çalışması gereken bir sınıf yazdım. ama umduğumdan fazla yönlendirme mevcuttu, önce followlocation ile takip edeyim dedim, baktım ki doğrulama için gereken çerez her yönlendirilmede yenisiyle değişiyor. o zaman sırasıyla takip edeyim dedim, son yönlendirmede id ile alakalı bir bağlantı vermesi daha sonrasında bunu {id}/account/
şeklinde yönlendirmesi gerekiyordu ama, 200 için doğrudan giriş sayfasına yönlendirdi. sanırım curl ayarlamalarındaki çerez yapısını kaldırıp, ilk bağlantıda üst bilgiden okuyarak devam etmem gerekiyordu. küçük bir ihtimal de refereransları doğru belirtmedim bundan da kaynaklanabilir. sıfırdan bir daha yazayım diye düşündüm ama, enerjim kalmadı. devam etmek isteyen varsa benim örneğim;
error_reporting(E_ALL);
class Parasut{
private $url = 'https://uygulama.parasut.com/kullanici-girisi';
private $eposta = '[email protected]';
private $sifre = 'parasut';
private $hatirla = 0;
function giris(){
$curl = $this->curlCustom();
echo $curl["status"] === true ? $curl["output"] : "hata";
}
private function curlCustom(){
$c = curl_init();
$this->curlGet(["curl" => $c, "post" => false, "cookie" => 0]);
$sonuc = curl_exec($c);
if(curl_getinfo($c, CURLINFO_RESPONSE_CODE) === 200){
$httpRequest = preg_replace('/^.+\n/', '', curl_getinfo($c,CURLINFO_HEADER_OUT));
preg_match('/name="authenticity_token" value="(.*?)"/si', $sonuc, $token);
preg_match('/_parasut_session_production_(.*?)$/si', file_get_contents('./cerez'), $cerez);
$cerez = "_parasut_session_production_=".trim($cerez[1]);
$data = array(
"authenticity_token" => $token[1],
"user[email]" => $this->eposta,
"user[password]" => $this->sifre,
"user[remember_me]" => $this->hatirla,
"commit" => "OTURUM AÇ"
);
$this->curlGet([
"curl" => $c,
"post" => true,
"cookie" => $cerez,
"data" => http_build_query($data)
]);
$sonuc2 = curl_exec($c);
$httpRequest2 = preg_replace('/^.+\n/', '', curl_getinfo($c,CURLINFO_HEADER_OUT));
if(curl_getinfo($c, CURLINFO_RESPONSE_CODE) === 302){
$reg = $this->cookieRegex([$httpRequest2, $sonuc2]);
$this->url = $reg[1];
$this->curlGet([
"curl" => $c,
"post" => false,
"cookie" => $reg[0],
]);
$sonuc3 = curl_exec($c);
$httpRequest3 = preg_replace('/^.+\n/', '', curl_getinfo($c,CURLINFO_HEADER_OUT));
if(curl_getinfo($c, CURLINFO_RESPONSE_CODE) === 302){
$reg = $this->cookieRegex([$httpRequest3, $sonuc3]);
$this->url = $reg[1];
$this->curlGet([
"curl" => $c,
"post" => false,
"cookie" => $reg[0],
]);
$sonuc4 = curl_exec($c);
$httpRequest4 = preg_replace('/^.+\n/', '', curl_getinfo($c,CURLINFO_HEADER_OUT));
}
}
$curlInfo = array(
"status" => true,
"request" => [$httpRequest, $httpRequest2, $httpRequest3, $httpRequest4],
"output" => $sonuc4,
"token" => $token[1]
);
}else{
$curlInfo = array("status" => false);
}
curl_close($c);
return $curlInfo;
}
private function cookieRegex($header){
preg_match('/cookie: _parasut_session_production_=(.*?)authority/si', $header[0], $cerez);
preg_match('/Location: (.*?)Cache/si', $header[1], $url);
return array(trim($cerez[1]), trim($url[1]));
}
private function curlGet($init){
$key = $init["post"] === true ? CURLOPT_POSTFIELDS : CURLOPT_HEADER;
$val = $init["post"] === true ? $init["data"] : true;
return curl_setopt_array($init["curl"], [
CURLOPT_URL => $this->url,
CURLOPT_RETURNTRANSFER => true,
//CURLOPT_FOLLOWLOCATION => $init["post"],
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLINFO_HEADER_OUT => true,
CURLOPT_HTTPHEADER => $this->getHeaders($init["cookie"]),
CURLOPT_POST => $init["post"],
CURLOPT_COOKIESESSION => true,
CURLOPT_COOKIEJAR => './cerez',
CURLOPT_COOKIEFILE => './cerez',
CURLOPT_COOKIE => $init["cookie"],
$key => $val
]);
}
private function getHeaders($cerez){
return array(
'authority: uygulama.parasut.com',
'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-language: tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7',
'cache-control: max-age=0',
'content-type: application/x-www-form-urlencoded',
"cookie: $cerez",
'origin: https://uygulama.parasut.com',
'referer: https://uygulama.parasut.com/kullanici-girisi',
'sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
'sec-ch-ua-mobile: ?0',
'sec-ch-ua-platform: "Windows"',
'sec-fetch-dest: document',
'sec-fetch-mode: navigate',
'sec-fetch-site: same-origin',
'sec-fetch-user: ?1',
'upgrade-insecure-requests: 1',
'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
);
}
}
edit: api hazırlamışlar https://apidocs.parasut.com/ işinizi görmüyor mu, neden kullanmıyorsunuz?
sayfa kaynağında gözüken kodlar sunucuda işlenmiş kodlardır. javascript ile döküman yüklendikten sonra oluşturulan kodlar sayfa kaynağında gözükmez. seo açısından kötü sonuçlar doğurur.
kaynak da gözükmesini istemediğin kodları sayfa yüklendikten sonra oluşturmalısın. örnek;
$('body').appendChild('<p>merhaba dünya</p>');
kaynak da gözükmez ama sayfada gözükür.
anladım. aşağıdaki kodların php karşılığı lazım deyince, bende php karşılığını yazdım. hedef api de ki gereksinimler hakkında haliyle fikrim yoktu hala da yok. header'dan gelen verileri ayrıştırmak için preg_match
kullanabilirsin https://www.php.net/manual/en/function.preg-match
çerezi almak istedğini varsaydığım bir örnek;
$header = 'HTTP/1.1 200
Set-Cookie: JSESSIONID=63D6B8E04778547F25B3ABBB20B5E94D; Path=/; HttpOnly
Server-Time: 1658310818544
Token: **************
Content-Type: application/json;charset=UTF-8
Content-Length: 133
Date: Wed, 20 Jul 2022 09:53:38 GMT';
preg_match('/JSESSIONID=(.*?);/si',$header, $cerez);
echo $cerez[1];
anladım. o zaman word de çalış aynı tasarımı yakalayana kadar. hem pdf hem html olarak farklı kaydetme seçeneğini var word'un. hiç css'e bulaşma.
$header = [
"referrer: https://portal.defterbeyan.gov.tr/",
"referrerPolicy: strict-origin-when-cross-origin",
"body: 67b58efa-7c9a-43e0-b74a-e7d97bdb7eba",
//"method: POST",
"mode: cors",
"credentials: omit",
"content-type: text/plain"
];
$url = "https://backend-p.defterbeyan.gov.tr/rs/external/auth/loginWithToken";
$defterBeyan = curl_init();
curl_setopt_array($defterBeyan, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HTTPHEADER => $header
]);
bu bir post verisi değil üstbilgi (header
), dolayısıyla post methodunu kullanmanıza gerek yok, header içerisinde iletmeniz yeterli. kontrol etmek için de istek gönderdiğiniz sayfada aşağıdaki kodu çalıştırmanız yeterli.
print_r(getallheaders());
https://github.com/coolwanglu/pdf2htmlEX github da şöyle bir repo mevcut.
bu bir seferlik bir şey mi, yoksa sürekli olarak farklı pdf dosyalarını aynı formatta html'e dökmeyi mi amaçlıyorsun? html'e tasarım işini pdf'den aldığın verileri javascript ile işleyerek mi yapacaksın, yoksa baka baka css ve html'i kendin mi kodlayacaksın? biraz detaylandır lütfen.