v2.5.2
Giriş yap

NodJs veya Pph Curl ile Paraşüt web uygulamasına giriş?

trsherlock
1,183 defa görüntülendi

Merhaba arkadaşlar aşağıdaki web tabanlı Paraşüt ön muhasebe uygulamasına otomatik giriş yaptırmak istiyorum.

Php curl ile denemek istedim name = "authenticity_token" değeri de sayfada ile yüklendiği için direk giriş yaptırmadım. Oturum aç dediğim de arka planda post eder zannettim adres çubuğunu localhost/kullanici-girisi şeklinde değiştirerek post etti.
Beni aşan bir sorun yardımlarınız için şimdiden teşekkürler.

Paraşüt Giriş Bağlantısı
e-posta: [email protected]
şifre: parasut

<form class="new_user" id="new_user" action="/kullanici-girisi" accept-charset="UTF-8" method="post">
<input type="hidden" name="authenticity_token" value="smhvSLLINoDT4Y1KnXRU4NkXzRrcodaA8XHkSDKhMaYR6bDYjYKYJO5aUzet2hWZgoZ57FrglQytuR5oE4VAIA==">
<div class="l-col16 l-offset-s3 l-col-s10 l-offset-l5 l-col-l6">
<div class="form u-clearfix u-mt1 u-pv15">
<div class="form-content">
<input placeholder="E-posta Adresi" class="field" type="email" value="" name="user[email]" id="user_email">
<input placeholder="Parola" class="field u-mb1" type="password" name="user[password]" id="user_password">
<div class="u-textLeft u-pullRight u-pt05">
<input name="user[remember_me]" type="hidden" value="0">
<input class="u-pullLeft u-width1 u-mr025" style="margin-top:0.15rem;" type="checkbox" value="1" name="user[remember_me]" id="user_remember_me">
<label class="u-pullLeft" for="user_remember_me">Oturum açık kalsın</label>
</div>
<input type="submit" name="commit" value="OTURUM AÇ" class="button button-primary button-big u-pullLeft" id="Sign_In" data-disable-with="OTURUM AÇ">
</div>
</div>
</div>
</form>

NodeJs ile yaptığımda gelen sonuç: <html><body>You are being <a href="https://uygulama.parasut.com/tarayicinizi-guncelleyin">redirected</a>.</body></html>
Şifreyi hatalı post ettiğimde giriş sayfasının html sayfasını döküyor sanırsam Nodejs ile post başarılı fakat sorgu yapan tarayıcı ile ilgili bir problem.
Bu konuda da yardımcı olursanız sevinirim.

var request = require("request");
var HTMLParser = require('node-html-parser');


login()
function login() {
    var authenticity_token = {
        method: 'GET', url: 'https://uygulama.parasut.com/kullanici-girisi',
    };

    request(authenticity_token, function (error, response, body) {
        console.log(HTMLParser.parse(body).querySelector("input[name='authenticity_token']")["_attrs"]["value"])
        var options = {
            method: 'POST',
            url: 'https://uygulama.parasut.com/kullanici-girisi',
            qs:
            {
                authenticity_token: HTMLParser.parse(body).querySelector("input[name='authenticity_token']")["_attrs"]["value"],
                'user[email]': '[email protected]',
                'user[password]': 'parasut',
                'user[remember_me]': '0',
                commit: 'OTURUM AÇ'
            }
        };

        request(options, function (error, response, body) {
            if (error) throw new Error(error);
            console.log(body)
        });
    })
}
munzevi
855 gün önce

@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}/accounta 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/accounta 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
        ]);
    }
}