Flex Message是Line提供給開發者更靈活的顯示訊息的工具
這也是我最喜歡的一部分
可以把訊息做成自己喜歡的樣子

但是要用Flex Message沒有想像中的簡單
尤其是陷入各種少一個大括號一個小括號的問題
又或者是Python的縮排問題時
真的非常無解、會解非常久~
所以誠心建議大家使用好的外掛來幫助開發
(但我沒有試到一個我喜歡的,如果有人有推薦的VSCode外掛可以分享一下嗎)
建立Flex Message
- 用Flex Message Simulator建立一個範本並產生JSON

- 建立function用來處理一些放入變數的問題,並迴圈產生多個FlexMessage
| 12
 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)
| 12
 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的變數以供全域使用)
- 用法範例
| 12
 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做使用者收藏餐廳的功能。
實作的過程也會覺得非常有成就感以及有趣,
如果很寂寞的話做一個假的女友機器人跟自己聊天可能也很不錯吧(?)