2016-01-01 24 views
5

Tôi đang thực hiện một chút kỹ thuật đảo ngược trên API Rapportive trong Gmail.Truy cập biến Javascript bên trong tệp HTML

tôi thực hiện yêu cầu này

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

Câu trả lời là một file HTML có sản phẩm nào đó có rất nhiều Javascript trong nó. On line 3661, nó đặt RequestHeader cho cuộc gọi tiếp theo để Rapportive:

ak.setRequestHeader("oauth_token", ae); 

Có cách nào tôi có thể yêu cầu trang đó và sau đó trở về ae?

+0

Điều duy nhất trong tệp là JS, hoặc có JS được trộn lẫn trong một cơ thể HTML? –

+0

Chỉ JS. Bạn thực sự có thể chạy mã đó và xem phản hồi. API Rapportive thực sự linh hoạt. –

+0

Bạn cần phải thực hiện tất cả Javascript, bởi vì đó là những gì đặt 'ae'. – Barmar

Trả lời

0

Nếu bạn chỉ quan tâm đến việc lấy token có thể bạn không chỉ cần làm một trận đấu regex:

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

Mặc dù điều này giả định ae là giá trị chuỗi thực tế. Nếu đó là một biến, phương pháp này sẽ không hoạt động dễ dàng.

Edit: Nếu đó là một biến bạn có thể làm một cái gì đó như:

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

Trước khi chạy JavaScript được trả lại từ trang, sau đó toàn cầu oauthToken (chú ý 'var' mất tích) sẽ chứa các giá trị của mã thông báo, giả sử việc đánh giá mã được chạy trong cùng phạm vi với người gọi.

+0

Vâng, tôi hy vọng để có thể yêu cầu trang, phân tích cú pháp bằng cách nào đó và mã thông báo truy cập. –

+0

Nó sẽ không hoạt động.'ae' là đối tượng, không phải là mã thông báo thô – Valijon

+0

@Valijon Xem bản chỉnh sửa của tôi, nó bẩn nhưng có thể làm điều đó. –

0

Tôi nghĩ rằng bạn có thể thử:

  1. Nhận trang như bạn đã thực hiện;
  2. Xóa tất cả các phần tử không phải javascript khỏi trang phản hồi;
  3. Chuẩn bị javascript (được mô tả bên dưới) trong javascript của trang để ghi đè một số mã;
  4. Thực hiện nó với eval('<code>');
  5. Kiểm tra xem mã thông báo đã được đặt chính xác hay chưa;

Tôi đang đề xuất mã sau để ghi đè số XMLHttpRequest. setRequestHeader chức năng để có thể nhận mã thông báo:

// 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

Tôi sẽ cung cấp cho một thử! –

+0

@MorganAllen có bất kỳ tin tức nào về sự cố không? –

Các vấn đề liên quan