2016-01-01 12 views
5

Robię trochę inżynierii wstecznej na Rapportive API w Gmailu.Uzyskiwanie dostępu do zmiennej JavaScript w pliku HTML

robię to żądanie

import requests 
url ='https://api.linkedin.com/uas/js/xdrpc.html' 
r = requests.get(url) 
print r.text 

Odpowiedź jest pusty plik HTML, który ma dużo JavaScript w nim. W linii 3661, ustawia RequestHeader dla późniejszego wywołania Rapportive:

ak.setRequestHeader("oauth_token", ae); 

Czy istnieje sposób mogę poprosić tę stronę, a następnie powrót ae?

+0

Jedyną rzeczą w pliku jest JS, czy też JS miesza się w treści HTML? –

+0

Tylko JS. Możesz faktycznie uruchomić ten kod i zobaczyć odpowiedź. Rapportive API jest bardzo elastyczny. –

+0

Musisz wykonać wszystkie Javascript, ponieważ to właśnie ustawia "ae". – Barmar

Odpowiedz

0

Jeśli interesuje tylko pobierania tokena nie można po prostu zrobić meczu regex:

var str = '<script>var a = 1;...ak.setRequestHeader("oauth_token", ae);...</script>'; 
var token = str.match(/setRequestHeader\("oauth_token",\s*([^)]+)/)[1]; 

Chociaż ta zakłada, ae jest rzeczywista wartość ciągu. Jeśli jest to zmienna, to podejście nie działałoby tak łatwo.

Edycja: Jeśli jest to zmienna mógłby zrobić coś takiego:

str.replace(/\w+\.setRequestHeader\([^,]+,\s*([^)]+)\s*\);/, 'oauthToken = \1'; 

przed uruchomieniem JavaScript wrócił ze strony, wówczas globalny oauthToken (zauważ brakujący „var”) będzie zawierać wartość Instrumentu token, zakładając, że ocena kodu przebiega w tym samym zakresie, co wywołujący.

+0

Cóż, mam nadzieję aby móc zażądać strony, przeanalizować ją i uzyskać dostęp do tokena. –

+0

To nie zadziała.'ae' jest obiektem, nie surowym tokenem – Valijon

+0

@Valijon Zobacz moją edycję, jest brudna, ale może wystarczyć. –

0

Myślę, że można spróbować:

  1. Get strony jak już robi;
  2. Usuń wszystkie niepodobne do javascript elementy ze strony odpowiedzi;
  3. Przygotuj javascript (opisany poniżej) w javascriptie strony, aby nadpisać jakiś kod;
  4. Wykonaj go z eval('<code>');
  5. Sprawdź, czy token został ustawiony poprawnie;

Proponuję następujący kod, aby zastąpić XMLHttpRequest. setRequestHeader Funkcjonalność, aby móc uzyskać token:

// this will keep the token 
var headerToken; 

// create a backup method 
XMLHttpRequest.prototype.setRequestHeaderBkp = 
XMLHttpRequest.prototype.setRequestHeader; 

// override the "setRequestHeader" method 
XMLHttpRequest.prototype.setRequestHeader = function(key, val) 
{ 
    if ('oauth_token' === key) 
    headerToken = val; 

    this.setRequestHeaderBkp(key, val); 
} 
+0

Spróbuję tego! –

+0

@MorganAllen wszelkie wiadomości o problemie? –

Powiązane problemy