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 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à bạn cũng có thể truy cập trực tiếp vào API này - ngay cả ở phía máy chủ không? Để phân tích lưu lượng mạng, chúng tôi khuyên dùng các công cụ như Wireshark hoặc Telerik Fiddler , những công cụ này cũng có thể phân tích lưu lượng được mã hóa. Nhưng Chrome thậm chí còn cung cấp các yêu cầu mà nó gửi khi dịch các trang miễn phí: bạn có thể dễ dàng xem chúng thông qua Chrome DevTools:

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 hầu hết khá 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 (có thể khác nhau; thông qua giao diện web của Google Translate, giá trị là "webapp"; ảnh hưởng đến định dạng trả về và giới hạn tốc độ)
đị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 ta đã đạt được mục tiêu và có đủ thông tin để sử dụng API này bên ngoài Google Chrome chưa? Tuy nhiên, nếu bạn thay đổi chuỗi cần dịch (trường dữ liệu q của yêu cầu POST) từ, ví dụ, "Hello World" thành "Hello World ! ", bạn sẽ nhận được thông báo lỗi.:

Chúng tôi tiến hành dịch lại chuỗi đã chỉnh sửa này trong Google Chrome bằng chức năng dịch trang web và nhận 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

Trình giải mã đã để lại một số rác ở đây; sau khi chúng tôi thay thế String.fromCharCode('...') bằng các chuỗi tương ứng, loại bỏ a() lỗi thời và ghép các lệnh gọi hàm [c(), c()] lại với nhau, chúng tôi nhận được:

b7739bf50b2edcf636c43a8f8910def9

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

b7739bf50b2edcf636c43a8f8910def9

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

b7739bf50b2edcf636c43a8f8910def9

Vì vậy, 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? Ít nhất thì nó cũng có sẵn ngay từ đầu trong tệp JS được tải trước đó main_de.js . 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ã thêm), chúng tôi sẽ thấy mục nhập cố định c._ctkk - đối tượng google.translate cũng được đặt tương ứng và quá trình 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, thử nghiệm cho thấy các lệnh gọi API vẫn hoạt động tốt ngay cả khi không có tham số quan trọng này. Thử nghiệm với API hiện trả về mã trạng thái 200 cho các lệnh gọi thành công. Nếu đạt đến giới hạn, mã trạng thái 411 sẽ được trả về cùng với thông báo " Yêu cầu POST yêu cầu tiêu đề Content-length ". Do đó, bạn nên bao gồm cả tiêu đề này (tiêu đề này được tự động thiết lập 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

Dưới đâ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 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