パケットをキャプチャして Google Translate API を逆に取得する

最初の試み

  • Google の翻訳 API は常に変化しています。Google の翻訳 API を自分で見つける必要があります。これが最も安全な解決策です。

  • まず、Google Chrome で Google の翻訳インターフェースを開き、データのリクエスト方法を確認します

  • 図に示すように、右クリックして確認し、開発者ツールに入り、ネットワーク (ネットワーク) を選択します。

  • clear をクリックして以前のすべてのリクエストを視覚的にクリアし、後で実際の API リクエストを見つけることができるようにします

  • Google 翻訳は 1 秒に 1 回程度リクエストを送信し、まもなく Google サーバーから翻訳結果が返されます. 調査の結果、batchexecute の最初にある次のリクエストが必要です.

  • さらに分析するためにクリックしてみましょう。これが投稿リクエストであることがわかります。

  • ペイロードから、フォーム データであるポスト リクエストを送信するときに使用されるパラメータを確認できます。

  • プレビューから、JSON形式のデータである翻訳結果を見ることができます

  • 2022.12.26

  • 上記の方法でも問題ありませんが、このインターフェースは以前ほど見つけにくいため、Google 検索エンジンで提供されている Google 翻訳を使用してこのインターフェースを見つけます。

  • 最初に Web ページで翻訳をテストしてみましょう。結果が返されることがわかります。

  • これは投稿リクエストです。翻訳する必要があるテキストを次の URL に送信すると、サーバーは対応する結果を返します。

Google Translate API 関連情報

URLを送る

### https://www.google.com/async/translate?vet=12ahUKEwjp-9mwmZf8AhXT0GEKHQc7Cs8QqDh6BAgFECw..i&ei=6YepY6njDdOhhwOH9qj4DA&yv=3&cs=0
  • この URL は長いですが、コア部分は
### https://www.google.com/async/translate
  • 次のパラメーターはあまり役に立ちませんが、最初にここに保持し、後で合理化された検証を行います。

提出データ

### async=translate,sl:zh-TW,tl:zh-CN,st:1111,id:1672054875193,qc:true,ac:true,_id:tw-async-translate,_pms:s,_fmt:pc

  • postman を使用して投稿リクエストを作成する

でも意外と失敗した

  • 返されるのは 404 ウェブページであり、私が望む翻訳結果ではありません。

  • Cookie の追加に関係はないと思います。パラメーターに Cookie を追加しましょう。
  • しかし、Cookie を追加した後に失敗するとは思っていませんでした

実験

パラメータを削除

  • すべてのパラメータを削除した後でも、結果は正常に取得できることがわかりました

ヘッダーを削除

  • Content-Length を削除した後、結果が返されない #設定されたヘッダー パラメータが不十分です

  • 結論: ヘッダーにはできるだけ多くのパラメーターを含める必要があり、すべてのパラメーターを元の要求に含めるのが最善です。

  • 対応する Python コードを記述します

コード

import requests 
 
url = "https://www.google.com.hk/async/translate" 
 
payload = "async=translate,sl:en,tl:zh-CN,st:1111,id:1672056488960,qc:true,ac:true,_id:tw-async-translate,_pms:s,_fmt:pc" 
headers = { 
  'sec-ch-ua': '"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"', 
  'DNT': '1', 
  'sec-ch-ua-mobile': '?0', 
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 
  'sec-ch-ua-arch': '"x86"', 
  'sec-ch-ua-full-version': '"108.0.5359.125"', 
  'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 
  'sec-ch-ua-platform-version': '"10.0.0"', 
  'sec-ch-ua-full-version-list': '"Not?A_Brand";v="8.0.0.0", "Chromium";v="108.0.5359.125", "Google Chrome";v="108.0.5359.125"', 
  'sec-ch-ua-bitness': '"64"', 
  'sec-ch-ua-model': '', 
  'sec-ch-ua-wow64': '?0', 
  'sec-ch-ua-platform': '"Windows"', 
  'Accept': '*/*', 
  'X-Client-Data': 'CKW1yQEIhbbJAQiktskBCMS2yQEIqZ3KAQjb08oBCLD+ygEIlaHLAQjv8swBCN75zAEI5PrMAQjxgM0BCLKCzQEI7ILNAQjIhM0BCO+EzQEIt4XNAQ==', 
  'Sec-Fetch-Site': 'same-origin', 
  'Sec-Fetch-Mode': 'cors', 
  'Sec-Fetch-Dest': 'empty', 
  'host': 'www.google.com.hk', 
  'Cookie': '1P_JAR=2022-12-26-12; NID=511=eVLI1bG9nhyOZtqU14JBHm5Be00epdxfR4XmfQeehYyIkzgpXi6dbpNY75ZMVyS7aOjoM2oZ5WdoR8eNq6wi1-e_J0NeoyI0dtsHW-_8Ik4PGrqvuGHdcvVC03zTOEK2TY1FZL85Wimo_ZPIE3hGIrmGPSiel6-rRRW9lD30UPs' 
} 
 
response = requests.request("POST", url, headers=headers, data=payload) 
 
print(response.text)
  • 現在の結果を正常に返すことができます。
  • しかし、この結果は私たちが望んでいるものではありません。一緒に分析する必要があります

返された結果の解析

  • 実際、見つけるのも非常に簡単です。 <span id="tw-answ-target-text"> </span>の間のテキストを見つけるだけです。
  • 抽出後はとてもいい

完全なコード

def Google_Translate(origin_string): 
  import requests 
 
  url = "https://www.google.com.hk/async/translate" 
 
  payload = "async=translate,sl:en,tl:zh-CN,st:{},id:1672056488960,qc:true,ac:true,_id:tw-async-translate,_pms:s,_fmt:pc".format(origin_string) 
  headers = { 
    'sec-ch-ua': '"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"', 
    'DNT': '1', 
    'sec-ch-ua-mobile': '?0', 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 
    'sec-ch-ua-arch': '"x86"', 
    'sec-ch-ua-full-version': '"108.0.5359.125"', 
    'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 
    'sec-ch-ua-platform-version': '"10.0.0"', 
    'sec-ch-ua-full-version-list': '"Not?A_Brand";v="8.0.0.0", "Chromium";v="108.0.5359.125", "Google Chrome";v="108.0.5359.125"', 
    'sec-ch-ua-bitness': '"64"', 
    'sec-ch-ua-model': '', 
    'sec-ch-ua-wow64': '?0', 
    'sec-ch-ua-platform': '"Windows"', 
    'Accept': '*/*', 
    'X-Client-Data': 'CKW1yQEIhbbJAQiktskBCMS2yQEIqZ3KAQjb08oBCLD+ygEIlaHLAQjv8swBCN75zAEI5PrMAQjxgM0BCLKCzQEI7ILNAQjIhM0BCO+EzQEIt4XNAQ==', 
    'Sec-Fetch-Site': 'same-origin', 
    'Sec-Fetch-Mode': 'cors', 
    'Sec-Fetch-Dest': 'empty', 
    'host': 'www.google.com.hk', 
    'Cookie': '1P_JAR=2022-12-26-12; NID=511=eVLI1bG9nhyOZtqU14JBHm5Be00epdxfR4XmfQeehYyIkzgpXi6dbpNY75ZMVyS7aOjoM2oZ5WdoR8eNq6wi1-e_J0NeoyI0dtsHW-_8Ik4PGrqvuGHdcvVC03zTOEK2TY1FZL85Wimo_ZPIE3hGIrmGPSiel6-rRRW9lD30UPs' 
  } 
 
  response = requests.request("POST", url, headers=headers, data=payload) 
 
  def find_string_between_A_amd_B(string, string_A, string_B):  # 查找两段字符串之间的字符 
    import re 
 
    regular = '{}(.*?){}'.format(string_A, string_B) 
    result = re.findall(regular, string) 
    return result 
 
  result = find_string_between_A_amd_B(response.text, '', '') 
  return result 
 
 
result = Google_Translate('222') 
print("result:", result)


結果を返す

result = Google_Translate('222')
print(“結果:”, 結果)


[外链图片转存中...(img-nfuTyPwt-1672058973251)] 
[外链图片转存中...(img-ICHoHbvS-1672058973252)] 

# 

おすすめ

転載: blog.csdn.net/u014723479/article/details/128449232