Flex Message是Line提供給開發者更靈活的顯示訊息的工具
這也是我最喜歡的一部分
可以把訊息做成自己喜歡的樣子
但是要用Flex Message沒有想像中的簡單
尤其是陷入各種少一個大括號一個小括號的問題
又或者是Python的縮排問題時
真的非常無解、會解非常久~
所以誠心建議大家使用好的外掛來幫助開發
(但我沒有試到一個我喜歡的,如果有人有推薦的VSCode外掛可以分享一下嗎)
建立Flex Message
- 用Flex Message Simulator建立一個範本並產生JSON
- 建立function用來處理一些放入變數的問題,並迴圈產生多個FlexMessage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| def flex_result(restaurant_detail): result_len = len(restaurant_detail) print("搜尋結果:" + str(result_len)) if(result_len>=10): random_index = random.sample(range(0, result_len), 10) elif(result_len==0): print("no result") return "" else: random_index = list(range(0, result_len)) contents = "{'type': 'carousel','contents': [" for i in random_index: res = restaurant_detail.iloc[i] contents += """{ 'type': 'bubble', 'size': 'kilo', 'hero': { 'type': 'image', 'url': """ + """'https://maps.googleapis.com/maps/api/place/photo?photoreference=""" + res['image'] + """&sensor=false&maxheight=500&maxwidth=500&key=""" + google_api_key + "'," + """ 'size': 'full', 'aspectMode': 'cover', .....略 ] } },""" print(contents) return contents.strip(',') + "]}"
|
- 用FlexMessage的方式傳送訊息 (因為contents是字串,因此需要轉成dict)
1 2 3
| contents = flex_result(res) line_bot_api.reply_message(event.reply_token, [ TextSendMessage(text="我隨機挑選了幾間餐廳,希望你會喜歡!")
|
串Google Map API
因為想要查詢附近美食,所以用到了line的傳送「位置訊息」的功能,這個功能會傳送目前位置的座標給sever,此時我們就可以利用這個資訊來去查找
這邊用到了GCP的服務,所以要付錢
但是免費仔們可以使用免費方案,只要不要超出使用流量就不會被收錢,有興趣的可以看看,風險就是不知道他什麼時候改免費方案的內容 (2022.04.15)
- 開啟GCP的Places API的服務
- 記下產生的API金鑰(我這邊在
settings.py
裡設了一個google_api_key的變數以供全域使用)
- 用法範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| def get_nearby_food(lat, lng, range): restaurants = [] params = {} url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=" + str(lat) + "," + str(lng) + "&radius=" + str(range) +"&type=restaurant&opennow&language=zh-TW&key="+google_api_key res = requests.get(url, params=params) results = json.loads(res.content) restaurants.extend(results['results']) time.sleep(2) while "next_page_token" in results: params['pagetoken'] = results['next_page_token'], res = requests.get(url, params=params) results = json.loads(res.content) restaurants.extend(results['results']) time.sleep(2) if(restaurants is empty): print("沒東西") return restaurants
|
至於詳細Google還有提供什麼資訊可以去官方文件查查:
剩下的各種功能大都可以透過摸索實作出來,比如利用Django內建的SQLite做使用者收藏餐廳的功能。
實作的過程也會覺得非常有成就感以及有趣,
如果很寂寞的話做一個假的女友機器人跟自己聊天可能也很不錯吧(?)