Vkontakteボットを使用してInstagramから写真をダウンロードする







この出版物では、Instagramからの写真へのリンクを受け入れ、この写真を送り返すVKontakteボットを作成します。







Vkontakteでグループを作成し、コミュニティ設定にメッセージを含めます:

コミュニティ管理-メッセージ。







まず、「エコーボット」を作成してみましょう。



動作するには、次のライブラリが必要です。







falcon==1.2.0 gunicorn==19.7.1 py-vkontakte==5.53.4 requests==2.18.3
      
      





コミュニティを代表してメッセージを送信できるトークンを取得する必要があります。







「コミュニティ管理」-「設定」-「APIの操作」-「アクセスキー」













新しいメッセージを受信するには、「Callback API」または「Long Poll」の2つの方法があります。

「コールバックAPI」を使用します。







「コールバックAPI」は、json形式でデータを送信します。







 {   "type":"message_new",   "object":{      "id":1,      "date":1499441696,      "out":0,      "user_id":1,      "read_state":0,      "title":" ... ",      "body":"Hello"   },   "group_id":1,   "secret":"111111" }
      
      





「コールバックAPI」では、サーバーアドレスを指定する必要があります。 サーバーとしてファルコンを使用します







「コミュニティ管理」-「設定」-「APIの操作」-「コールバックAPI」。



















「コールバックAPI」のサーバーを確認します。







 import falcon GROUP_ID = "YOUR GROUP ID" CONFIRMATION = "YOUR CONFIRMATION CODE" class Bot(object): def on_post(self, req, resp): if req.content_length: data = json.loads(req.stream.read()) if "confirmation" == data.get("type") and GROUP_ID == data.get("group_id"): resp.data = CONFIRMATION application = falcon.API() application.add_route('/', Bot())
      
      





次に、新しいメッセージを受信して​​送信するためのハンドラを作成します。 メッセージを送信するには、 py-vkontakteライブラリを使用します。







 # .... import vk api = vk.Api(TOKEN) #     group = api.get_group(GROUP_ID) class Bot(object): def on_post(self, req, resp): # .... user_id = data.get('object').get('user_id') text = data.get('object').get('body') if "message_new" == data.get("type"): group.send_message(user_id, text) resp.data = b"ok" # ....
      
      





メッセージを正常に読み取ったことをVkontakteに伝えるには、文字列「ok」を送信する必要があります。







「エコーボット」の準備ができたら、実行できます







 gunicorn bot:application
      
      





Instagramから写真を送信するボットを作成します



Instagramのドキュメントでは、 https://instagram.com/p/fA9uwTtkSN// mediaを追加すると、JPGファイルが返されると書かれています。







まず、ユーザーが送信したメッセージがInstagramサイトへのリンクであることを確認する関数を作成します。







 from urllib.parse import urlsplit def is_instagram_link(self, link): url = urlsplit(link) if url.netloc in ["www.instagram.com", "instagram.com"]: return True return False
      
      





リンクに/メディアを追加し、このJPGをダウンロードする関数を作成しましょう







 import io from urllib.parse import urljoin import requests def get_instagram_photo(self, instagram_photo_link): url = urljoin(instagram_photo_link, 'media/?size=l') response = requests.get(url) if not response.ok: raise ValueError() file_like = ('photo.jpg', io.BytesIO(response.content)) return file_like
      
      





?size = lは、返されたjpgのサイズを示すパラメーターです

response.okでない場合: -リンクが正しくない可能性があるため、これを確認する必要があります

file_like =( 'photo.jpg'、io.BytesIO(response.content)) -受信したJPGを送信用に準備します







is_instagram_link



get_instagram_photo



class Bot



追加し、作業のロジックを変更します。新しいメッセージが到着すると、JPGを送信します。







 class Bot(object): def on_post(self, req, resp): # .... if "message_new" == data.get("type"): if not self.is_instagram_link(message_text): group.send_messages(user_id, message='      instagram.com') else: try: instagram_photo = self.get_instagram_photo(instagram_photo_link=message_text) group.send_messages(user_id, image_files=[instagram_photo]) except ValueError: group.send_messages(user_id, message='   ,   ') resp.data = b'ok' # ....
      
      





ボットの例

ソースコード







追加リンク:










All Articles