0%

Line Chatbot - 用Flex Message包裝來自Google Map API 的訊息

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

全憑美感!自由發揮!

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

建立Flex Message

  1. Flex Message Simulator建立一個範本並產生JSON

  1. 建立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(',') + "]}"
  1. 用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)

  1. 開啟GCP的Places API的服務
  2. 記下產生的API金鑰(我這邊在settings.py裡設了一個google_api_key的變數以供全域使用)
  3. 用法範例
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)
# print(restaurants)
if(restaurants is empty):
print("沒東西")
return restaurants

至於詳細Google還有提供什麼資訊可以去官方文件查查:

  • Place Search
  • Place Types

剩下的各種功能大都可以透過摸索實作出來,比如利用Django內建的sqlite做使用者收藏餐廳的功能。
實作的過程也會覺得非常有成就感以及有趣,
如果很寂寞的話做一個假的女友機器人跟自己聊天可能也很不錯吧(?)