Wątek przeniesiony 2015-04-19 18:33 z Newbie przez dzek69.

Pobieranie danych o dostępnym transferze w Orange Free

0

Cześć.

Zwykle radzę sobie sam. Ale tutaj nie potrafię. Poprzednia wersja strony klienta orange.pl po prawidłowym na nią zalogowaniu, pokazywała dane o transferze w zwróconym kodzie html. Teraz niestety używany jest do tego zdaje się Ajax i JS. Ponieważ po wyłączeniu obsługi JS w Operze nie pokazuje się w ogółe dostępny transfer.

Dołaczone kody w PHP oraz Delphi logują się na konto ok. Jeżeli jako zmienne (w PHP) i stałe (w Delphi) podamy prawidłową nazwę klienta/numer telefonu czy karty w modemie i hasło. Niestety nie wiem jak można pod Synapse w Delphi i curlem lub inną metodą pod PHP wywołać skrypt. W Snifferze WireShark widziałem tylko w zapisanym pliku *.pcap coś w stylu GET'a dla adresu /dynamic/ylion659vcso9itx/custom.js i tak dalej. Ale nie wiem jak to ogarnąć. A dlaczego kombinuje sam? Niestety aplikacja Orange na Androida jest nadal w wersji 2.2 i nie pokazuje nigdzie danych o pozostałym transferze. Pewnie z powodu zmian w zawartości strony.

Jedyną możliwością jest wejście na stronę WWW przeglądarką obsługującą JS. Jednak ja chcę mieć to docelowo zautomatyzowane poprzez skrypt PHP na swoim serwerze. Skrypt w PHP ma fragmenty poprzednio działającej wersji. Proszę o pomoc. Wszelkie popdpowiedzi oraz przkłady kodów mile widzane. Wszystkim z góry dziękuję.

P.S. @dzek69, @kAzek - przyzywam Was :) Ktokolwiek poza Nimi coś wie to też proszę się śmiało wypowiadać, wszelkie sugestie będą dla mnie przydatne.

0

nie używaj sniffera tylko naciśnij F12 w przeglądarce i na zakładce Network zaobserwuj co się dzieje - to prawdopodobnie prosty GET na konkretnym urlu; wyślij taki sam i tyle

0

Używam Opery. I po naciśnięciu F12 mam popup menu z poleceniami do ustawien dla danej strony www. Poza tym nawet jakbym widział url. To póki co nie umiem właśnie ustalić, ktory to .js lub inny url z danymi zwrotnymi jest wywoływany. I czy da się od niego uzyskać konkretne dane będąc zalogowanym. Patrząc w treść stron, też nie wiem, który jeszcze konkretnie adres mam odwiedzić.

EDIT: w kodzie html strony http://www.orange.pl/moj_orange/wykorzystanie/w_skrocie są nawet komentarze autorów, żeby pewne divy pozostawić puste bo będzie się w nich wyświetlać zawartość. No ale właśnie jak pobrać tę zawartość używając PHP i curl. Albo Delphi i Synapse. Jaki konkretnie adres. Ktoś kiedyś pisał, że ponoć gdy strony używa .js to i tak można się do tego dobrać narzędziami nie będącymi prawidzą przeglądarką www. Tylko tutaj nie wiem jak :/

1

Ale nie szukaj w jakim pliku to zostało napisane - na pewno nie na tym etapie. Kliknij w dowolnym miejscu na stronie prawym, daj "Zbadaj element", otworzą Ci się narzędzia deweloperskie. W zakładce Sieć sprawdzaj przy logowaniu jakie żądania wychodzą. Od razu przefiltruj sobie wg kategorii XHR (czyli AJAX). W tym szukaj swojej wartości - bardzo prawdopodobne jest, że nie potrzebujesz pliku js do wyciągnięcia tej informacji, bo taki link będzie stały. Dopiero jak będzie jakoś generowany to martw się jak - ale zapewne będzie to stały link + token, który to powinieneś znaleźć w treści HTML, którą pobierasz po zalogowaniu, czyli tu też nie potrzebujesz do tego js-a.

Dopiero, gdy takie zabawy nie wyjdą - myśl nad grzebaniem po js-ach - to będzie raczej trudniejsza zabawa.

A w starej Operze masz panel nazwany Info - w nim masz listę skryptów załadowanych na stronie (uwaga, nie pokaże to skryptów inline, tj tych bezpośrednio pomiędzy <script></script>, które są wstawione w kod HTML - o ile jakieś są).

0

Dziękuję @dzek69 - zrobiłem jak pisałeś. Jest kilka "tabów" w linku odpytywanych poprzez Ajax. Żeby się upewnić, który jest właściwy, na próbę poprzez arkusz stylu i preferencje dla witryny zablokowałem ten o nazwie tab1. Po odświeżeniu znikneła informacja o transferze. Wyłączyłem blokowanie. I skopiowałem url w postaci http://www.orange.pl/gear/moj_orange/infoservices/ajax?group=packages-tab1&toGet=packages-tab&toUpdate=tab1&tabId=1&pageId=320500042&tabsReq=true&jsp=dynamic_v2&modal=&onlyHeader=true&jsp=dynamic_v2&refreshCounter=0&_=1429464972988 - zawiera on po pobraniu między innymi to (cut):

<div id="tooltipdiv-3"> <a href="" id="steps-and-limits-icon-3" data-tooltip="#tooltip-3" class="tip b-icon b-icon-before-rang o-flexbox-image-tooltip right"> <br>  <div class="g-hide"> <div id="tooltip-3" class="tip-content">Co się stanie gdy przekroczę limit danych?</div> </div> </a> </div>           <!-- c:set value="" var="pGroup" scope="request"/-->    <span class="o-flexbox-description--big"> 7.03 GB </span> <span class="o-flexbox-explain">Pozostało </span>               <span class="o-flexbox-price o-flexbox-price">0.000000 zł </span> <span class="o-flexbox-explain">Ponad abonament </span>    </span> </div>                                  </div>   </div>

Także ze sparoswaniem parametrów z kodu html już sobie poradzę. I mam cenną lekcję na przyszłośc. I proszę @furious programming mi się nie wtryniać ;) I nie przenosić wątku, jeżeli jakieś pytanie jest przeze mnie zadane w Newbie. To na pewno znaczy, że dotyczy banałów. I ja innych działów jak wiesz nie czytam. Gdyby nie powiadomienia to bym nie wiedział gdzie mój wątek.

Sam tutaj widzisz, ze @dzek69 udzielił mi informacji na temat banalnego w obsłudze DragonFly'a zdaje się tak to się zwie. Jednak ja z tego nie miałem potrzeby korzystać. A zapytania ajaxowe w kodzie są po prostu dla mnie laika w tworzeniu stron, gdzie znam podstawy PHP tylko, jakby "zaciemnione". Ale Opera ładnie podaje je "na tacy". Jeszcze raz dzięki. I proponuje przenieść jednak do Newbie. Bo rozwiązanie jest banalne, a może się przyda komuś w przyszłości, nie tylko pod kątem Orange.

0

@olesio - ludzie do webmasteringu wrzucają problemy typu "jak policzyć ile a jest w ala ma kota" i podobne banały. Niektórzy czytają czterystustronicowe książki o css, a potem widząc kawałek kodu pytają "czy to css?", a jak im się da GOTOWCA w javascripcie, do nie wiedzą gdzie to wstawić.. Takie rzeczy właśnie należą do Newbie.

Natomiast analiza zapytań ajaxowych, spore prawdopodobieństwo na kopiowanie tokenów CSRF i ogólnie taki mały reverse engineering prawie - to już jest coś ponad Newbie, gdzie powinny leżeć porady o tym jak połączyć ze sobą komórki w tabeli i dlaczego milion <br> to zły pomysł ;)

PS. Dragonfly to najlepsze narzędzia developerskie jakie były :( Szkoda, że umarło wraz z nową operą...

0

Dlatego używam starej dobrej 12.17. A nie tego czegoś na co przerobiono Operę, wywalając użyteczne funkcjonalności i robiąc Chrome. A co do mojego problemu. To wiesz akurat dzięki Twoim wskazówkom ogarnałem link. Ale pytanie co to może być ta ostatnia wartość? I do końca chyba nie umiem zrobić jak należy. Bo albo ten url AJAXowy, który podałem będzie stały bo cały czas działa i to na logowaniu osobnym kodem PHP. Jednak wyciąganęte chyba dobrze PageId nie przechodzi. Bo robię tak:

<?php
//...
$packagesURL = 'http://www.orange.pl/moj_orange/wykorzystanie/w_skrocie';
//...
function regex($expression, $text)
{
    $expression = str_replace("/", "\/", $expression);
    if (preg_match('/' . $expression . '/ims', $text, $matches)) {
        return $matches[1];
    }
}
//...
$packagesdata = curl_get($packagesURL, $loginURL);
$Page_Id = regex('&tabId=1&pageId=(.+?)&', $packagesdata);
$test = curl_get('http://www.orange.pl/gear/moj_orange/infoservices/ajax?group=packages-tab1&toGet=packages-tab&toUpdate=tab1&tabId=1&pageId=' . $Page_Id . '&tabsReq=true&jsp=dynamic_v2&modal=&onlyHeader=true&jsp=dynamic_v2&refreshCounter=0&_=142946497298');
file_put_contents('test.htm', $test);
die;
// ...
?>

Mam taki pusty niemal HTML bez danych:

                                                             <span class="js-ajax-data" data-ajax-dest="tab1" data-ajax-fx="" data-ajax-action="refresh" style="display:none;"></span> <!--@@@@@@ @@@@@@-->                                                                                                                                                                                       </div>                                                    <!--@@@@@@-->       

Zmienna $Page_Id zawiera według mnie dobre dane wyodrębnione z kodu strony. Ale jednak pod Operą inne. Wygląda jakby to była jakaś "długo żywotna" wartość. I skąd wziąć te końcowe refreshCounter=0&_=142946497298. To jakiś czas? Może on musi się pokrywać żeby Page_Id załapało? W kodzie html jaki mam zalogowany do pliku, bo nie umiem debugować PHP ;) Mam...
{ group:'packages-tab1',url:'/gear/moj_orange/infoservices/ajax',params:'toUpdate=tab1&tabId=1&pageId=320500014&tabsReq=true&jsp=dynamic_v2&modal=&onlyHeader=&jsp=dynamic_v2',element:'packages-tab',delay:2,tries:4,toUpdate:'tab1',eventName:'sun.ajax.refresh.trigger' } }, 'packages-tab2-ajaxify-refresh'
Logowanie na pewno przebiega prawidłowo. Jakieś podpowiedzi @dzek69? Czy mogę zaryzykować i na sztywno posługiwać się zawsze urlem który wyciągnałem z pod Opery, czyli
http://www.orange.pl/gear/moj_orange/infoservices/ajax?group=packages-tab1&toGet=packages-tab&toUpdate=tab1&tabId=1&pageId=320500042&tabsReq=true&jsp=dynamic_v2&modal=&onlyHeader=true&jsp=dynamic_v2&refreshCounter=0&_=142946497298
Bo takowy mimo, że mineło już na pewno dużo czasu od pierwszego jego ustalenia nadal po zalogowaniu nawet innym browserem pokazuje prawidłowe dane. Z tym, że musiał bym poużywać trochę netu mobilnego żeby mieć pewność czy wartość ta się odświeża.

0

W zasadzie tylko pageId wygląda tu na zmienną. Jest szansa, że to po prostu Twój id abonencki = jest stały. Zmienna refreshCounter do olania, natomiast zmienna _ to tylko do zapobiegania cachowania requestu, standardowa praktyka przy ajax. Zupełnie się tym nie przejmuj.

Co do wybierania z kodu Twojego pageId = zapewne regex Ci nawala. Wrzuć sobie zwrotkę kodu HTML w jakiś edytor z wyszukiwaniem po regexach i dopasuj sobie wyrażenie.

Zapoznaj się też z funkcją preg_quote ;)

1

Dzięki za odpowiedź. Ale nie, problemem był jednak zły url. Po prostu trzeba wchodzić na podstronę kończącą się /moj_orange/ i wtedy w treści mamy taki pageid jak należy. Regex był ok, teraz jest dorpasowany do zawartości tej strony, gdzie ma wystąpić. Co do ostatniej wartości po prostu przyjmuje time(), a to co pokazuje Opera to chyba to samo wzbogacone pewnie o milisekundy albo inaczej liczone. Teraz wszystko działa. Przykładowy kod poniżej. Nie jestem specem od PHP. Kod wygląda jak wygląda. Można zawsze dopracować. Mnie póki co ten efekt zadowala.

Te użycie curla zostało zaczerpnięte ze skryptu do słania smsów, ktory można wygooglować. W poprzedniej wersji dodawałem info o autorze. Jednak teraz oczekiwane dane i większośc linków się pozmieniała. W przyszłości moze machnę wersję bez curla. Niektóre serwery mogą nie pozwalać na jego użycie. Ale ja tego problemu nie mam.

<?php
error_reporting(0);
$thecookie = md5(microtime());
$user      = 'wpisz_swoj_login';
$pass      = 'wpisz_swoje_haslo';
date_default_timezone_set('Europe/Warsaw');
Header("Content-Type: text/html; charset=cp1250");
$myOrangeUrl = 'https://www.orange.pl/moj_orange';
$startURL    = 'https://www.orange.pl/zaloguj.phtml';
$userAgent   = 'Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/12.17';
$loginURL    = 'https://www.orange.pl/zaloguj.phtml?_DARGS=/ocp/gear/infoportal/portlets/login/login-box.jsp';

function curl_get($url, $referer = "")
{
    global $userAgent, $thecookie;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
    if ($referer != "") {
        curl_setopt($ch, CURLOPT_REFERER, $referer);
    }
    curl_setopt($ch, CURLOPT_COOKIEJAR, $thecookie);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $thecookie);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    $out = curl_exec($ch);
    curl_close($ch);
    return $out;
}

function curl_post($url, $data, $referer)
{
    global $userAgent, $thecookie;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $thecookie);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $thecookie);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    $out = curl_exec($ch);
    curl_close($ch);
    return $out;
}

function regex($expression, $text)
{
    $expression = str_replace("/", "\/", $expression);
    if (preg_match('/' . $expression . '/ims', $text, $matches)) {
        return $matches[1];
    }
}

$time  = microtime();
$time  = explode(' ', $time);
$time  = $time[1] + $time[0];
$start = $time;
echo '<html><title>Sprawdzanie pozostałego transferu w Orange Free.</title>';
echo '<br><img src="orange.png" alt="Orange logo" height="80" width="80"/><br><br>';
$startPage = curl_get($startURL);
if (strpos($startPage, 'W tej chwili nie ma mo') != false) {
    echo "W tej chwili nie ma możliwości logowania. Spróbuj później.<br>";
    unlink($thecookie);
    exit;
}
$doc = new DOMDocument();
@$doc->loadHTML($startPage);
$xpath     = new DOMXPath($doc);
$sesToken  = $xpath->evaluate('//input[@name="_dynSessConf"]')->item(0)->getAttribute('value');
$loginData = array(
    '_dyncharset' => 'UTF-8',
    '_dynSessConf' => $sesToken,
    '/tp/core/profile/login/ProfileLoginFormHandler.loginErrorURL' => 'https://www.orange.pl/zaloguj.phtml',
    '_D:/tp/core/profile/login/ProfileLoginFormHandler.loginErrorURL' => '+',
    '/tp/core/profile/login/ProfileLoginFormHandler.loginSuccessURL' => '',
    '_D:/tp/core/profile/login/ProfileLoginFormHandler.loginSuccessURL' => '+',
    '/tp/core/profile/login/ProfileLoginFormHandler.firstEnter' => 'true',
    '_D:/tp/core/profile/login/ProfileLoginFormHandler.firstEnter' => '+',
    '/tp/core/profile/login/ProfileLoginFormHandler.value.login' => $user,
    '_D:/tp/core/profile/login/ProfileLoginFormHandler.value.login' => '+',
    '/tp/core/profile/login/ProfileLoginFormHandler.value.password' => $pass,
    '_D:/tp/core/profile/login/ProfileLoginFormHandler.value.password' => '',
    '_D:/tp/core/profile/login/ProfileLoginFormHandler.rememberMe' => '+',
    '/tp/core/profile/login/ProfileLoginFormHandler.login' => 'Zaloguj+siÄ™',
    '_D:/tp/core/profile/login/ProfileLoginFormHandler.login' => '+',
    '_DARGS' => '/ocp/gear/infoportal/portlets/login/login-box.jsp'
);
$loginPost = '';
foreach ($loginData as $a => $b) {
    $loginPost .= urlencode($a) . '=' . urlencode($b) . '&';
}
$loginPost = substr($loginPost, 0, -1);
$login     = curl_post($loginURL, $loginPost, $startURL);
if (preg_match('/login lub has/', $login)) {
    echo "Błędne dane użytkownika.<br>";
    unlink($thecookie);
    exit;
}
if (preg_match('/wyloguj/', $login)) {
    echo "Zalogowano pomyślnie.<br>";
    flush();
} else {
    echo "Serwer przesłał nieoczekiwany status procesu logowania.<br>";
    unlink($thecookie);
    exit;
}
$myorangepage = curl_get($myOrangeUrl);
$sumpageident = regex('summaryPageId=(.+?)&', $myorangepage);
$transferpage = curl_get('http://www.orange.pl/gear/moj_orange/infoservices/ajax?group=packages-tab1&toGet=packages-tab&toUpdate=tab1&tabId=1&pageId=' . $sumpageident . '&tabsReq=true&jsp=dynamic_v2&modal=&onlyHeader=true&jsp=dynamic_v2&refreshCounter=0&_=' . time());
$freetransfer = regex('var.+?"pGroup".+?<span class.+?> (.+?) <', $transferpage);
echo "<h2><b>Pozostała ilość danych to " . $freetransfer . ".</b></h2>";
$time       = microtime();
$time       = explode(' ', $time);
$time       = $time[1] + $time[0];
$finish     = $time;
$total_time = round(($finish - $start), 4);
unlink($thecookie);
if ($finish > 0) {
    echo '<br><hr>Pobranie danych o transferze trwało ' . $total_time . ' sekund.<br>';
}
?>

1 użytkowników online, w tym zalogowanych: 0, gości: 1