Lấy cắp dữ liệu API dịch của Google

Là một phần của Google Cloud, Google cung cấp Google Dịch API với cấu trúc chi phí dựa trên mức sử dụng. Ngoài ra còn có một API không có tài liệu có thể được sử dụng mà không cần khóa , nhưng từ chối hoạt động chỉ sau một vài yêu cầu. Khi sử dụng chức năng dịch trang web của Google Chrome, có thể nhận thấy rằng các trang có thể được dịch với chất lượng rất tốt mà không có bất kỳ hạn chế nào đáng chú ý.


Rõ ràng là mô hình nmt tiên tiến đã được sử dụng ở đây. Nhưng Google Chrome sử dụng API nào trong nội bộ để dịch nội dung và API này cũng có thể được giải quyết trực tiếp - ngay cả ở phía máy chủ? Để phân tích lưu lượng mạng, các công cụ như Wireshark hoặc Telerik Fiddler , cũng có thể phân tích lưu lượng được mã hóa, được khuyến nghị. Nhưng Chrome thậm chí còn cung cấp các yêu cầu mà nó gửi cho bản dịch trang miễn phí : Bạn có thể dễ dàng xem chúng bằng cách sử dụng Công cụ dành cho nhà phát triển của Chrome:

Nếu bạn thực hiện bản dịch, thì hãy bắt yêu cầu ĐĂNG quan trọng tới https://translate.googleapis.com qua "Sao chép> Sao chép dưới dạng cURL (bash)" và thực thi nó trong một công cụ như Postman , chẳng hạn, bạn có thể gửi lại yêu cầu mà không gặp sự cố:

Ý nghĩa của các tham số URL cũng rất rõ ràng:

Chìa khóaGiá trị mẫuÝ nghĩa
làm phiền3Chế độ chú thích (ảnh hưởng đến định dạng trả về)
khách hàngte_libThông tin khách hàng (thay đổi, giá trị là "ứng dụng web" thông qua giao diện web của Google Dịch; có ảnh hưởng đến định dạng trả lại và giới hạn tỷ lệ)
định dạnghtmlĐịnh dạng chuỗi (quan trọng để dịch các thẻ HTML)
v1.0Số phiên bản Google Dịch
Chìa khóaAIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgwKhóa API (xem bên dưới)
logldvTE_20200210_00Phiên bản giao thức
sldeNgôn ngữ nguồn
tlenNgôn ngữ mục tiêu
spnmtMô hình ML
tc1không xác định
sr1không xác định
tk709408.812158Token (xem bên dưới)
Thời trang1không xác định

Một số tiêu đề yêu cầu cũng được đặt - nhưng chúng hầu như có thể bị bỏ qua. Sau khi bỏ chọn tất cả các tiêu đề theo cách thủ công, bao gồm cả những tiêu đề từ tác nhân người dùng , sự cố mã hóa được phát hiện khi nhập các ký tự đặc biệt (tại đây khi dịch " Hello World "):

Nếu bạn kích hoạt lại tác nhân người dùng (thường không gây hại gì), API sẽ cung cấp các ký tự được mã hóa UTF-8:

Chúng tôi đã ở đó chưa và chúng tôi có tất cả thông tin để sử dụng API này bên ngoài Google Chrome không? Nếu bạn thay đổi chuỗi ký tự cần dịch (trường dữ liệu q của yêu cầu ĐĂNG), ví dụ: “Xin chào thế giới” thành “Xin chào thế giới ! “, Chúng tôi nhận được thông báo lỗi:

Bây giờ chúng tôi dịch lại bản sửa đổi này trong Google Chrome bằng chức năng dịch trang web và thấy rằng ngoài tham số q , tham số tk cũng đã thay đổi (tất cả các tham số khác vẫn giữ nguyên):

Rõ ràng nó là một mã thông báo phụ thuộc vào chuỗi, cấu trúc của nó không dễ nhìn thấy. Khi bạn bắt đầu dịch trang web, các tệp sau sẽ được tải:

  • 1 tệp CSS: translateelement.css
  • 4 đồ họa: translate_24dp.png (2x), gen204 (2x)
  • 2 tệp JS: main_de.js , element_main.js

Hai tệp JavaScript bị xáo trộn và rút gọn. Các công cụ như JS Nicede4js hiện đang giúp chúng tôi làm cho các tệp này dễ đọc hơn. Để gỡ lỗi chúng trực tiếp, chúng tôi khuyên bạn nên sử dụng Tiện ích mở rộng Chrome theo yêu cầu, tiện ích này sẽ chuyển các tệp từ xa vào cục bộ một cách nhanh chóng:

Bây giờ chúng ta có thể gỡ lỗi mã ( CORS trước tiên phải được kích hoạt trên máy chủ cục bộ). Phần mã liên quan để tạo mã thông báo dường như bị ẩn trong phần này trong tệp element_main.js:

b7739bf50b2edcf636c43a8f8910def9

Ở đây, văn bản được băm với sự trợ giúp của một số dịch chuyển bit . Nhưng thật không may, chúng ta vẫn còn thiếu một phần của câu đố: Ngoài đối số a (là văn bản cần dịch), một đối số b khác được chuyển cho hàm Bp () - một loại hạt giống dường như thay đổi theo thời gian và điều đó cũng bao gồm chảy vào băm. Nhưng anh ta đến từ đâu? Nếu chúng ta chuyển đến lệnh gọi hàm của Bp () , chúng ta sẽ tìm thấy đoạn mã sau:

b7739bf50b2edcf636c43a8f8910def9

Hàm Hq được khai báo trước như sau:

b7739bf50b2edcf636c43a8f8910def9

Deobfuscater đã để lại một số rác ở đây; Sau khi chúng ta đã thay thế String.fromCharCode ('...') bằng các chuỗi ký tự tương ứng, hãy xóa a () lỗi thời và phân mảnh các lệnh gọi hàm [c (), c ()] , kết quả là:

b7739bf50b2edcf636c43a8f8910def9

Hoặc thậm chí dễ dàng hơn:

b7739bf50b2edcf636c43a8f8910def9

Hàm yq trước đây được định nghĩa là:

b7739bf50b2edcf636c43a8f8910def9

Hạt giống dường như nằm trong đối tượng toàn cầu google.translate._const._ctkk , có sẵn trong thời gian chạy. Nhưng nó được đặt ở đâu? Trong tệp JS khác, main_de.js đã được tải trước đó, ít nhất nó cũng có sẵn ở đầu. Chúng tôi thêm phần sau vào đầu:

b7739bf50b2edcf636c43a8f8910def9

Trong bảng điều khiển, chúng tôi thực sự nhận được Hạt giống hiện tại:

Điều này khiến chính Google Chrome, nơi dường như cung cấp hạt giống, là tùy chọn cuối cùng. May mắn thay, mã nguồn của nó (Chromium, bao gồm cả thành phần Dịch) là mã nguồn mở và do đó có sẵn công khai. Chúng tôi kéo kho lưu trữ cục bộ và tìm lệnh gọi của hàm TranslateScript :: GetTranslateScriptURL trong tệp translate_script.cc trong thư mục component / translate / core / browser:

b7739bf50b2edcf636c43a8f8910def9

Biến có URL được xác định cố định trong cùng một tệp:

b7739bf50b2edcf636c43a8f8910def9

Nếu bây giờ chúng tôi kiểm tra tệp element.js kỹ hơn (sau khi giải mã nó một lần nữa), chúng tôi thấy mục nhập tập hợp cứng c._ctkk - đối tượng google.translate cũng được đặt tương ứng và việc tải tất cả nội dung có liên quan (mà chúng tôi đã phát hiện trước đó) được kích hoạt:

b7739bf50b2edcf636c43a8f8910def9

Bây giờ, khóa tham số vẫn được xem xét (với giá trị AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw). Đây dường như là một khóa API trình duyệt chung (cũng có thể được tìm thấy trong một số kết quả của Google ). Nó được đặt trong Chromium trong tệp translate_url_util.cc trong thư mục component / translate / core / browser:

b7739bf50b2edcf636c43a8f8910def9

Khóa được tạo trong google_apis / google_api_keys.cc từ một giá trị giả:

b7739bf50b2edcf636c43a8f8910def9

Tuy nhiên, một thử nghiệm cho thấy rằng các lệnh gọi API hoạt động giống nhau mà không cần tham số khóa này. Nếu bạn thử nghiệm với API, bạn sẽ nhận lại mã trạng thái 200 nếu bạn thành công. Nếu sau đó bạn gặp phải giới hạn, bạn sẽ nhận được mã trạng thái 411 trở lại với thông báo " Yêu cầu POST yêu cầu tiêu đề có độ dài nội dung ". Do đó, bạn nên bao gồm tiêu đề này (được tự động đặt làm tiêu đề tạm thời trong Postman).

Định dạng trả về của các chuỗi đã dịch là không bình thường khi có nhiều câu trong một yêu cầu. Các câu riêng lẻ được bao bọc bởi các thẻ i- / b-HTML:

Ngoài ra, Google Chrome không gửi HTML hoàn chỉnh đến API, nhưng lưu các giá trị thuộc tính như href trong yêu cầu (và thay vào đó đặt các chỉ số để sau này có thể chỉ định thẻ ở phía máy khách):

Nếu bạn thay đổi giá trị của ứng dụng khách khóa POST từ te_lib (Google Chrome) trên webapp ( trang web Google Dịch ), bạn nhận được chuỗi đã dịch cuối cùng:

Vấn đề là bạn có nhiều khả năng gặp phải giới hạn tỷ lệ hơn là thông qua te_lib (để so sánh: với ứng dụng web, con số này đạt được sau 40.000 ký tự, với te_lib thì không có giới hạn tỷ lệ). Vì vậy, chúng ta cần xem xét kỹ hơn cách Chrome phân tích kết quả. Chúng tôi sẽ tìm thấy nó ở đây trong element_main.js:

b7739bf50b2edcf636c43a8f8910def9

Nếu bạn gửi toàn bộ mã HTML tới API, nó sẽ để lại các thuộc tính trong phản hồi đã dịch. Do đó, chúng tôi không phải bắt chước toàn bộ hành vi phân tích cú pháp, mà chỉ trích xuất chuỗi cuối cùng, đã dịch từ phản hồi. Để làm điều này, chúng tôi xây dựng một trình phân tích cú pháp thẻ HTML nhỏ để loại bỏ các thẻ <i> ngoài cùng bao gồm nội dung của chúng và xóa các thẻ <b> ngoài cùng. Với kiến ​​thức này, bây giờ chúng tôi có thể (sau khi cài đặt các phụ thuộc với trình soạn nhạc, yêu cầu fzaninotto / faker vielhuber / stringhelper ) xây dựng phiên bản phía máy chủ của API dịch:

b7739bf50b2edcf636c43a8f8910def9

Sau đây là kết quả của thử nghiệm ban đầu được thực hiện trên năm hệ thống khác nhau với các băng thông và địa chỉ IP khác nhau:

Tính cáchCác ký tự cho mỗi yêu cầuThời lượngTỷ lệ lỗiChi phí qua API chính thức
13.064.662~25003:36: 17h0%237,78€
24.530.510~25011: 09: 13h0%446,46€
49.060.211~25020: 39: 100%892,90€
99.074.487~100061: 24: 37h0%1803,16€
99.072.896~100062: 22: 20h0%1803,13€
Σ284.802.766~ Ø550Σ159: 11: 37 giờ0%Σ € 5183,41

Lưu ý: Bài đăng trên blog này bao gồm tất cả các tập lệnh chỉ được viết cho mục đích thử nghiệm. Không sử dụng các kịch bản để sử dụng hiệu quả, thay vì làm việc với các quan chức của Google Translation API .

Trở lại