質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3222閲覧

LINE Messaging API で作ったリッチメニューが表示できない

turbo3681

総合スコア11

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/06 07:39

編集2021/05/07 05:07

LINE Messaging APIを利用して、リッチメニューの作成をしております。
使用言語はpython、AWS Lambda に関数を記載しています。

ご参考:リッチメニューについて

下記のコードをデプロイすると、エラーが出ないかわりに、リッチメニューが表示されません。。

----ソースコード----

python

1import os 2import json 3import requests 4 5from linebot import ( 6 LineBotApi, WebhookHandler 7) 8from linebot.models import ( 9 MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage,TemplateSendMessage,CarouselTemplate,CarouselColumn, 10 PostbackAction,MessageAction,PostbackTemplateAction,URIAction, 11 ButtonsTemplate,QuickReply,QuickReplyButton,FlexSendMessage,BubbleContainer,ImageComponent, 12 RichMenu, RichMenuArea, RichMenuBounds, RichMenuResponse, RichMenuSize 13) 14 15from linebot.exceptions import ( 16 InvalidSignatureError 17) 18 19handler = WebhookHandler(os.getenv('LINE_CHANNEL_SECRET')) 20line_bot_api = LineBotApi(os.getenv('LINE_CHANNEL_ACCESS_TOKEN')) 21 22 23 # RichMenuの作成 24 rich_menu_to_create = RichMenu( 25 size = RichMenuSize(width=2500, height=843), 26 selected = True, 27 name = "Nice richmenu", 28 chat_bar_text = "Tap here", 29 areas = [RichMenuArea(bounds = RichMenuBounds(x = 0, y = 0, width = 2500, height = 843),action = URIAction(label = 'Go to line.me', uri = 'https://line.me'))] 30 ) 31 32 richmenuid = line_bot_api.create_rich_menu(rich_menu = rich_menu_to_create) 33 34 # RichMenu用の画像 35 path = r"C:/Users/81909/Desktop/250-min.png" 36 37 # 画像をRichMenuに指定 38 with open(path, 'rb') as f: 39 line_bot_api.set_rich_menu_image(richmenuid, "image/png", f) 40 41 # デフォルトのRichMenuに設定する 42 line_bot_api.set_default_rich_menu(richmenuid) 43 44 45

----参考にしたもの----
1.LINE DEVELOPERSのサイト
2.GitHub line
/
line-bot-sdk-python

3.【LINE Messaging API】Pythonでリッチメニューを作成

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

lambdaでローカルの画像ファイルを直接指定することはできないと思います。
Amazon S3上にホスティングした画像ファイルを指定するならば、https://teratail.com/questions/212667 等を参考にしてはいかがでしょうか。

なお、リッチメニューに指定できる画像ファイルは、下記の制限があります。
https://developers.line.biz/ja/docs/messaging-api/using-rich-menus/#creating-a-rich-menu-using-the-messaging-api

画像フォーマット:JPEGまたはPNG
画像の幅サイズ(ピクセル):800以上、2500以下
画像の高さサイズ(ピクセル):250以上
画像のアスペクト比(幅/高さ):1.45以上
最大ファイルサイズ:1MB


他の方法

画像をホスティングしたくない場合は、画像データをbase64エンコードして利用する方法もあります。

img_encode.py

python

1from base64 import b64encode 2 3with open("ローカルの画像イメージのファイルパス", "rb") as f: 4 dat = b64encode(f.read()) 5 6with open("save.txt", "w") as f: 7 f.write(dat.decode()) 8

上のimg_encode.pyをローカルのpython環境で実行すると、同じフォルダに「save.txt」というファイルができるので、save.txtをテキストエディタで開いて、中の文字列(全部)をコピーします。
上のimg_encode.pyをローカルのpython環境で実行して、ターミナルに出力された「b'~」から「'」までの文字列をコピーします。
(何行にもわたる乱数みたいな長い文字列ですが全部コピー)
(このコードは画像をbase64エンコードした文字列データを得るために行うものであって、lambdaで実行する必要はありません)

元のlambdaで実行するコードを下記のように修正します。

diff

1from linebot import (~) 23+from base64 import b64decode 4 5handler = WebhookHandler(os.getenv('LINE_CHANNEL_SECRET')) 6line_bot_api = LineBotApi(os.getenv('LINE_CHANNEL_ACCESS_TOKEN')) 7 8 9 # RichMenuの作成 10 rich_menu_to_create = RichMenu( 11           略 12 ) 13 14 richmenuid = line_bot_api.create_rich_menu(rich_menu = rich_menu_to_create) 15 16 # RichMenu用の画像 17- path = r"C:/Users/81909/Desktop/250-min.png" 18+ encoded_img = "iVBORw0KGgoAA~~~~" # コピーした文字列 19 # 画像をRichMenuに指定 20- with open(path, 'rb') as f: 21- line_bot_api.set_rich_menu_image(richmenuid, "image/png", f) 22+ # Base64エンコードされた画像データをデコードしたバイト列を指定する。 23+ line_bot_api.set_rich_menu_image(richmenuid, "image/png", b64decode(encoded_img)) 24 25 # デフォルトのRichMenuに設定する 26 line_bot_api.set_default_rich_menu(richmenuid)

投稿2021/05/08 03:47

編集2021/05/08 10:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turbo3681

2021/05/08 10:36

とてもご丁寧に解説していただきましてありがとうございました!! 見た瞬間、これならうまくいきそうな感触を得ました・・・が、 結論としてまだリッチメニューの表示にはいたっておりません。 頂いたアドバイスを元にやったこと、疑問に思ったことなどを以下にまとめます。 1.今回リッチメニューに使う画像ファイル  2500px × 843px のためサイズは問題なし  2500/843=2.97 のため画像のアスペクト比は問題なし  863kb のためファイルサイズは問題なし 2.画像ファイルのホスティング  Amazon S3上にホスティングした画像ファイルを指定しましたが、  同じようにエラー表示は出ず、またリッチメニューの表示もない状態です。 3.新たなimportについて  こちらはアドバイスいただかないとわからなかった点で、とても助かりました。  ちなみにfrom base64 import b64decodeだけでなく、from base64 import b64encodeも  必要ですよね??(という理解で大丈夫でしょうか) 4.encoded_imgの文字列について  こちら長文のコードが出たのですが、アドバイス頂いたのとは少し違います。  これがうまくいかない理由なのかなと思っています・・・  「b'~」で始まり「'」で終わるとありましたが、  「単なるアルファベット」で始まり「'」で終わっています。  こんな感じです。  「Xq/ufSJ0LS6fSc1omwjPpbQ3AM7K4xiJtnVBaB・・・」で始まり  「・・・jg7/k+/+P5mASfM/t00hAAAAAElFTkSuQmCC'」で終わっています。  あと、この文字列をencoded_imgに代入する際は、''で囲う必要はありますでしょうか?  こんな感じです。  「'Xq/ufSJ0LS6fSc1omwjPpbQ3AM7K4xiJtnVBaB・・・」から  「・・・jg7/k+/+P5mASfM/t00hAAAAAElFTkSuQmCC''」まで
退会済みユーザー

退会済みユーザー

2021/05/08 10:54 編集

2.画像ファイルのホスティング  すみませんが、手元ではAmazon S3の環境がないため、適切なやり方はわかりません。 3.新たなimportについて ご指摘の通りエンコード用のプログラムにb64encodeをimportする必要がありましたので、修正しました。 4.多分出力テキストが大きすぎてターミナルからあふれてしまったのだと思われます。 エンコード用プログラムについて、ターミナルへの出力ではなく、テキストファイルへの出力に変更しました。 img_encode.pyをローカルで実行するとimg_encode.pyの実行ディレクトリにsave.txtというテキストファイルができるはずなので、その中の文字列をコピーし、lamdaのコード内に記述してください。 (ここでできるテキストファイルの中身はbでは始まっていません。 回答欄記載コードのように、save.txt内の文字列をそのまま引用符で囲んでいただければokだと思います(bで始める必要なし)
turbo3681

2021/05/08 11:26

早速ありがとうございます。 ちょっと試してみたのですが、やはりうまくいきません(今までと同じくエラーもでない状況です)。 参考までに現状のコードを記載しておきます。 ちなみに、richmenuidの取得までは出来ていることは確認済です。 # RichMenuの作成 rich_menu_to_create = RichMenu( size = RichMenuSize(width=2500, height=843), selected = True, name = "Nice richmenu", chat_bar_text = "Tap here", areas = [RichMenuArea(bounds = RichMenuBounds(x = 0, y = 0, width = 2500, height = 843),action = URIAction(label = 'Go to line.me', uri = 'https://line.me'))] ) richmenuid = line_bot_api.create_rich_menu(rich_menu = rich_menu_to_create) # 画像をRichMenuに指定 encoded_img = "save.txtに記載された文字列" # Base64エンコードされた画像データをデコードしたバイト列を指定する。 line_bot_api.set_rich_menu_image(richmenuid, "image/png", b64decode(encoded_img)) # デフォルトのRichMenuに設定する line_bot_api.set_default_rich_menu(richmenuid)
退会済みユーザー

退会済みユーザー

2021/05/08 11:43

手元ではできたのですが、上記が無理だと、基本に戻ってS3経由で画像を表示した方がよいかもしれません。 https://qiita.com/yutake27/items/30ca4bdffd130087b708 等は参考にならないでしょうか。
turbo3681

2021/05/08 12:27

ありがとうございます! そちらの手元で動いているということは、プログラム自体は間違っていないということですよね。 そういう意味では一安心です。 だとすれば、私のコードがどこかで間違っているということになると思いますが それが何なのか・・・解決するまでモヤモヤしますね。 ちなみにリンクの記事についてですが、 APIのテストをした結果得られるバイナリデータを コードに貼り付ける、ことをするためにご提供いただいたものでしょうか?
turbo3681

2021/05/08 12:43

引き続きトライしてみたところ、無事動きました!!! 少しコードを修正して、以下でやってみたところ成功しました。 お忙しいところ、とても親身にアドバイスしていただきまして心から感謝致します。 どうもありがとうございました。 ----動いたコード---- # 画像をRichMenuに指定 with open("C:/Users/81909/Desktop/linebot-lecture-src/250-min.png", "rb") as f: encoded_img = b64encode(f.read()) # Base64エンコードされた画像データをデコードしたバイト列を指定する。 line_bot_api.set_rich_menu_image(richmenuid, "image/png", b64decode(encoded_img)) # デフォルトのRichMenuに設定する line_bot_api.set_default_rich_menu(richmenuid)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問