Q&A

S3に保存した画像をMesseagingAPIで送信したい

前提・実現したいこと

S3に保存した画像をMesseagingAPIで送信したい

発生している問題・エラーメッセージ

  1. Lambda(python3.7)でQRコードを作成し、S3に保存し、presignedURLを取得する
  2. presigniedURLを用いて画像を送信する

2において、AndroidOSのスマートフォンで受信すると正しく表示されるのですが、ios(iPad,iphone)だと画像が表示されないです。

該当のソースコード

def create_qr_code_on_s3(user_id):
    local_path = '/tmp/' + 'sample' + '.png'
    remote_path = 'images/'+'sample'+'.png'
    
    #qrコード生成
    img = qrcode.make('https://xxxxxxxxxxxxxxxxxxxxxxx.com?code=' ) //URLは伏せています
    
    img.save(local_path)
#s3にアップロード
    bucket = s3.Bucket(BUCKET_NAME)
    res=bucket.upload_file(local_path, remote_path, ExtraArgs={"ContentType": "image/json"})
    qr_code_url = client.generate_presigned_url(
            ClientMethod = 'get_object',
            Params={'Bucket':BUCKET_NAME, 'Key': remote_path,
            },
            ExpiresIn=300,
            HttpMethod='GET'
        )
    print(qr_code_url)
    print(len(qr_code_url))
    return qr_code_url

BUCKET_NAME='xxxxxxxxxxxxxxxxxxxxxxxxxxxx' //伏せています

#メッセージを受け取る・受け取ったら受け取ったテキストを返信する
    @handler.add(MessageEvent, message=TextMessage)
    def message(line_event):
        url = '/' + 'sample';
        qr_code_url =create_qr_code_on_s3(url)

        image_message = ImageSendMessage(
            type='image',
           original_content_url=qr_code_url,
           preview_image_url=qr_code_url
        ) 
        # QRコードを送信
        line_bot_api.reply_message(line_event.reply_token,image_message )

試したこと

補足情報(FW/ツールのバージョンなど)

  • 1
  • 4
  • 444
  • twitter facebook

本件、LINE社に問い合わせていたのですが、最新のアップデートでバグを修正したとの連絡をいただきました。 ただ、まだアプリをアップデートしていない人もいると思いますので、しばらくは対応が必要ですね。

  • 0

S3で同じ現象が起こり困っていましたがこちらで原因がわかりスッキリです!

PCラインではs3から取得した画像が見えるのにiPad、iPhineでは見えたり見えなかったりとランダムで意味がわからない…と思っていました。

が、おそらく発行されるurlの中にデコーディングのエラーが発生すれば見えず、発生しなければ見える、といったランダム性があったのだと思います。

現在はURLをプログラム的にベタ打ちして(良いのかどうかはわかりませんが)、問題は解決された方に思われます。

早急なバグの修正を期待したいです。

  • 1

GCPですが、同じ現象が発生いたしました!

調査の結果、iPhoneのLINEアプリから画像URLにアクセスする際に、クエリパラメータの値が一部改変されてしまうことが原因だということが分かりました。 具体的には「%2B」などのパーセントエンコーディングされた値がデコーディングされて、「+」に置き換わってしまいます。

調査の過程を下記に示します。 下記のようなURLの画像をLINE Message APIで投稿し、iPhone側から閲覧してみました。 オリジナル画像URL: https://my-awesome-app.com/a.jpg?val=%2B サムネイル画像URL: https://my-awesome-app.com/a.jpg?val=%2B%2B

通知画面には正常にサムネイルが表示されました。(スクショ画像1: https://rsasage.s3.ap-northeast-1.amazonaws.com/images/line-bug/attachment02.png )

トーク画面には画像アイコンのようなものだけ表示されました。(スクショ画像2: https://rsasage.s3.ap-northeast-1.amazonaws.com/images/line-bug/attachment01.png )

iPhoneからのリクエストURLは下記になります。(スクショ画像3: https://rsasage.s3.ap-northeast-1.amazonaws.com/images/line-bug/attachment03_01.png )

https://my-awesome-app.com/a.jpg?val=%2B%2B https://my-awesome-app.com/a.jpg?val=+ https://my-awesome-app.com/a.jpg?val=++

この調査から分かるように、クエリパラメータをiPhone側でデコーディングしてしまっているものと思われます。 1件目の正常なURLは通知時のURLだと思われます。

回避策として、パーセントエンコーディングなどを含まない別のURLを発行して、そこにアクセスすると元の期限付きURLにリダイレクトされるようにすると良いかと思います。

LINEアプリのバグと言えるので、LINEさんには修正お願いしたいです。

  • 2

ContentTypeが image/json になっていますが、これって image/png の間違いだったりしませんか?

  • 1
本当によろしいですか? question.vm