文書化されていないサイトAPI captionbot.aiを使用する

この記事では、ドキュメントがない場合や公式に公開されていない場合に、サイトAPIを取得して使用する方法について説明します。 このガイドは、単純なAPIを元に戻そうとしていない初心者向けに書かれています。 同様のことに従事していた人たちにとって、ここには新しいものは何もありません。







Microsoftが最近オープンしたAPIサービスhttps://www.captionbot.ai/を使用して分析します(これに感謝します)。 多くの人がGeektimesの記事で彼について読むことができました 。 このサイトはJSON形式のajaxリクエストを使用しているため、それらをコピーするのは簡単で快適です。 行こう!







KDPV







リクエストを分析します



まず、開発者ツールを開き、サイトがサーバーに送信するリクエストを分析します。







画像







私たちの場合、私たちに興味があるすべてのリクエストはベースURL https://www.captionbot.ai/apiを持っています







初期化



最初にサイトを開くと、パラメーターなしでGETリクエストが/api/init



送信されます。

応答にはContent-Type: application/json



がありますが、応答本文には次の形式の行があります:







 "54cER5HILuE"
      
      





これを覚えて、次に進んでください。







URL送信



画像をアップロードするには、URLを使用する方法とファイルをアップロードする方法の2つがあります。 テストのために、WikiからLena画像のURLを取得して送信します。 ネットワークアクティビティでは、 /api/message



POST要求が次のパラメーターとともに表示されます。







 { "conversationId": "54cER5HILuE", "waterMark": "", "userMessage": "https://upload.wikimedia.org/wikipedia/ru/2/24/Lenna.png" }
      
      





そうです、 init



メソッドがconversationId



文字列を返し、リンクがuserMessage



に入ったことをuserMessage



ます。 waterMark



とはまだ明確ではありません。 応答データを確認します。







 "{\"ConversationId\":null,\"WaterMark\":\"131071012038902294\",\"UserMessage\":\"I am not really confident, but I think it's a woman wearing a hat\\nand she seems . \",\"Status\":null}"
      
      





何らかの理由で、JSONを2回エンコードしましたが、まあまあです。 人間の形では、次のようになります。







 { "ConversationId": null, "WaterMark": "131071012038902294", "UserMessage": "I am not really confident, but I think it's a woman wearing a hat\\nand she seems .", "Status": null }
      
      





途中のすべてのパラメーターは書き方を変えましたが、これらは人生の些細なことです。 そのため、何らかの理由で、値がWaterMark



に返され、空のConversationId



UserMessage



フィールドの写真の実際のキャプション、および空のステータスがUserMessage



れました。







画像のアップロード



さらに、タブを閉じずに、ローカルファイルから写真をダウンロードして同じ操作を試みます。 file



フィールド名を/api/upload



/api/upload



multipart/form-data



形式でのPOSTリクエストが表示されfile









 -----------------------------50022246920687 Content-Disposition: form-data; name="file"; filename="Lenna.png" Content-Type: image/png
      
      





応答として、ダウンロードしたファイルのURL文字列を取得し、それを確認してこれを確認できます。







 "https://captionbot.blob.core.windows.net/images-container/2ogw3q4m.png"
      
      





次に、 /api/message



既知のリクエストを送信し/api/message









 { "conversationId": "54cER5HILuE", "waterMark": "131071012038902294", "userMessage": "https://captionbot.blob.core.windows.net/images-container/2ogw3q4m.png" }
      
      





そのwaterMark



、前の回答のwaterMark



、URLはupload



メソッドから返されたものです。 応答データは以前のものと似ています。







ラッパーを書く



この知識を便利に使用するために、お気に入りのプログラミング言語で簡単なラッパーを作成します。 Pythonで行います。 サイトへのリクエストには、リクエストを使用します。これは便利で、Cookieを保存するセッションがあるためです。 サイトはSSLを使用しますが、デフォルトでは、リクエストは証明書を誓います:







 hostname 'www.captionbot.ai' doesn't match either of '*.azurewebsites.net', '*.scm.azurewebsites.net', '*.azure-mobile.net', '*.scm.azure-mobile.net'
      
      





これは、各リクエストにverify = Falseフラグを設定することで解決されます。







完全なソース
 import json import mimetypes import os import requests import logging logger = logging.getLogger("captionbot") class CaptionBot: BASE_URL = "https://www.captionbot.ai/api/" def __init__(self): self.session = requests.Session() url = self.BASE_URL + "init" resp = self.session.get(url, verify=False) logger.debug("init: {}".format(resp)) self.conversation_id = json.loads(resp.text) self.watermark = '' def _upload(self, filename): url = self.BASE_URL + "upload" mime = mimetypes.guess_type(filename)[0] name = os.path.basename(filename) files = {'file': (name, open(filename, 'rb'), mime)} resp = self.session.post(url, files=files, verify=False) logger.debug("upload: {}".format(resp)) return json.loads(resp.text) def url_caption(self, image_url): data = json.dumps({ "userMessage": image_url, "conversationId": self.conversation_id, "waterMark": self.watermark }) headers = { "Content-Type": "application/json" } url = self.BASE_URL + "message" resp = self.session.post(url, data=data, headers=headers, verify=False) logger.debug("url_caption: {}".format(resp)) if not resp.ok: return None res = json.loads(json.loads(resp.text)) self.watermark = res.get("WaterMark") return res.get("UserMessage") def file_caption(self, filename): upload_filename = self._upload(filename) return self.url_caption(upload_filename)
      
      





ソースコードはGithubにあり、完成したパッケージはpipにあります。








All Articles