iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 25
2

卡米狗的學說話指令,最早期的語法設計是卡米狗學說話;關鍵字;回覆。用兩個半形分號作為分隔符號。為什麼選擇用分號作為分隔符號呢?因為我們的分隔符號不能出現在關鍵字或回覆內,所以要挑一個比較少人用的符號。

我們必須讓學說話功能的優先順序高於關鍵字回覆,這樣才能確保學說話指令不會被關鍵字覆蓋。

修改主程式

主程式:

  def webhook
    # 學說話
    reply_text = learn(received_text)

    # 關鍵字回覆
    reply_text = keyword_reply(received_text) if reply_text.nil?

    # 傳送訊息到 line
    response = reply_to_line(reply_text)
    
    # 回應 200
    head :ok
  end 

第一行:

reply_text = learn(received_text)

learn 是一個待會要寫的新函數,如果使用者說出一句話剛好符合學說話語法,那麼就回應好哦~好哦~並儲存結果。如果使用者說出一句話不符合學說話語法,就傳回 nilnil 是代表空值的意思。

第二行:

reply_text = keyword_reply(received_text) if reply_text.nil?

如果 reply_text 是空值的話才進行關鍵字回覆的判斷。這樣就能確保學說話指令優先於關鍵字回覆。

我們要判斷輸入的文字開頭是不是卡米狗學說話;,要做到這件事情,我們需要學一點字串操作。

字串操作

這是一個字串:

'ABCDEF'
=> "ABCDEF"

字串的切割

這是字串的第一個字:

'ABCDEF'[0]
=> "A"

這是字串的第二個字:

'ABCDEF'[1]
=> "B"

以此類推,
A,B,C,D,E,F
分別對應到:
0,1,2,3,4,5

這是字串的倒數第一個字

'ABCDEF'[-1]
=> "F"

這是字串的倒數第二個字

'ABCDEF'[-2]
=> "E"

以此類推,
F,E,D,C,B,A
分別對應到:
-1,-2,-3,-4,-5,-6

另外,你可以透過 Range 取得一個區間。

'ABCDEF'[0..1]
=> "AB"
'ABCDEF'[0..3]
=> "ABCD"
'ABCDEF'[3..-1]
=> "DEF"

字串的查詢

想知道字串中的 A 出現在哪裡:

'ABCDEF'.index('A')
=> 0

想知道字串中的 B 出現在哪裡:

'ABCDEF'.index('B')
=> 1

想知道字串中的 C 出現在哪裡:

'ABCDEF'.index('C')
=> 2

找不到的情形會傳回 nil

'ABCDEF'.index('G')
=> nil

字串的相等

判斷兩個字串是否相等:

'A' == 'A'
=> true
'卡米狗學說話' == '卡米狗學說話'
=> true
'A' == 'B'
=> false

學會以上三個技巧,就能夠解決大部分的問題。

學說話

現在我們要開始寫學說話函數,從空函數開始。

  # 學說話
  def learn(received_text)

  end

利用以上三個技巧,我們可以先取得前面七個字,看看是不是等於卡米狗學說話;,如果是的話,在後面的字串中找到分號作為分隔點。

先檢查開頭的字是不是卡米狗學說話;

  def learn(received_text)
    #如果開頭不是 卡米狗學說話; 就跳出
    return nil unless received_text[0..6] == '卡米狗學說話;'
  end

unlessif 的相反,unless除非的意思。

除非前面七個字是卡米狗學說話;,不然就傳回 nil

再來就是取得剩下來的字,以及找到第二個分號。

  # 學說話
  def learn(received_text)
    #如果開頭不是 卡米狗學說話; 就跳出
    return nil unless received_text[0..6] == '卡米狗學說話;'
    
    received_text = received_text[7..-1]
    semicolon_index = received_text.index(';')

    # 找不到分號就跳出
    return nil if semicolon_index.nil?
  end

因為前面七個字已經沒有用了,所以我們抓出第八個字到最後一個字。然後在剩下的字裡面找到分號的位置。如果找不到分號,就跳出。

接下來我們要根據分隔點,擷取出關鍵字以及回覆,並且新增到資料庫裡。

  # 學說話
  def learn(received_text)
    #如果開頭不是 卡米狗學說話; 就跳出
    return nil unless received_text[0..6] == '卡米狗學說話;'
    
    received_text = received_text[7..-1]
    semicolon_index = received_text.index(';')

    # 找不到分號就跳出
    return nil if semicolon_index.nil?

    keyword = received_text[0..semicolon_index-1]
    message = received_text[semicolon_index+1..-1]

    KeywordMapping.create(keyword: keyword, message: message)
    '好哦~好哦~'
  end

這就是完整的學說話指令。接著我們要修改關鍵字回覆。

關鍵字回覆

這是原本的關鍵字回覆:

  # 關鍵字回覆
  def keyword_reply(received_text)
    # 學習紀錄表
    keyword_mapping = {
      'QQ' => '神曲支援:https://www.youtube.com/watch?v=T0LfHEwEXXw&feature=youtu.be&t=1m13s',
      '我難過' => '神曲支援:https://www.youtube.com/watch?v=T0LfHEwEXXw&feature=youtu.be&t=1m13s'
    }
    
    # 查表
    keyword_mapping[received_text]
  end

要改成從資料庫查詢,其實昨天已經寫好了:

  # 關鍵字回覆
  def keyword_reply(received_text)
    mapping = KeywordMapping.where(keyword: received_text).last
    if mapping.nil?
      nil
    else
      mapping.message
    end
  end

將查詢結果存到 mapping 變數中,然後檢查有沒有查到東西,如果有才傳回。

這裡可以加入一點浪漫:

  # 關鍵字回覆
  def keyword_reply(received_text)
    KeywordMapping.where(keyword: received_text).last&.message
  end

如果 &. 的前面是 nil,那他就不會做後面的事,直接傳回 nil

到這裡算是開發完成,可以上傳程式碼了。

對一下程式碼

你的程式碼應該長得差不多像這樣:

require 'line/bot'
class KamigoController < ApplicationController
  protect_from_forgery with: :null_session

  def webhook
    # 學說話
    reply_text = learn(received_text)

    # 關鍵字回覆
    reply_text = keyword_reply(received_text) if reply_text.nil?

    # 傳送訊息到 line
    response = reply_to_line(reply_text)
    
    # 回應 200
    head :ok
  end 

  # 取得對方說的話
  def received_text
    message = params['events'][0]['message']
    message['text'] unless message.nil?
  end

  # 學說話
  def learn(received_text)
    #如果開頭不是 卡米狗學說話; 就跳出
    return nil unless received_text[0..6] == '卡米狗學說話;'
    
    received_text = received_text[7..-1]
    semicolon_index = received_text.index(';')

    # 找不到分號就跳出
    return nil if semicolon_index.nil?

    keyword = received_text[0..semicolon_index-1]
    message = received_text[semicolon_index+1..-1]

    KeywordMapping.create(keyword: keyword, message: message)
    '好哦~好哦~'
  end

  # 關鍵字回覆
  def keyword_reply(received_text)
    KeywordMapping.where(keyword: received_text).last&.message
  end

  # 傳送訊息到 line
  def reply_to_line(reply_text)
    return nil if reply_text.nil?
    
    # 取得 reply token
    reply_token = params['events'][0]['replyToken']
    
    # 設定回覆訊息
    message = {
      type: 'text',
      text: reply_text
    } 

    # 傳送訊息
    line.reply_message(reply_token, message)
  end

  # Line Bot API 物件初始化
  def line
    @line ||= Line::Bot::Client.new { |config|
      config.channel_secret = '9160ce4f0be51cc72c3c8a14119f567a'
      config.channel_token = '2ncMtCFECjdTVmopb/QSD1PhqM6ECR4xEqC9uwIzELIsQb+I4wa/s3pZ4BH8hCWeqfkpVGVig/mIPDsMjVcyVbN/WNeTTw5eHEA7hFhaxPmQSY2Cud51LKPPiXY+nUi+QrXy0d7Hi2YUs65B/tVOpgdB04t89/1O/w1cDnyilFU='
    }
  end


  def eat
    render plain: "吃土啦"
  end 

  def request_headers
    render plain: request.headers.to_h.reject{ |key, value|
      key.include? '.'
    }.map{ |key, value|
      "#{key}: #{value}"
    }.sort.join("\n")
  end

  def response_headers
    response.headers['5566'] = 'QQ'
    render plain: response.headers.to_h.map{ |key, value|
      "#{key}: #{value}"
    }.sort.join("\n")
  end

  def request_body
    render plain: request.body
  end

  def show_response_body
    puts "===這是設定前的response.body:#{response.body}==="
    render plain: "虎哇花哈哈哈"
    puts "===這是設定後的response.body:#{response.body}==="
  end

  def sent_request
    uri = URI('http://localhost:3000/kamigo/eat')
    http = Net::HTTP.new(uri.host, uri.port)
    http_request = Net::HTTP::Get.new(uri)
    http_response = http.request(http_request)

    render plain: JSON.pretty_generate({
      request_class: request.class,
      response_class: response.class,
      http_request_class: http_request.class,
      http_response_class: http_response.class
    })
  end

  def translate_to_korean(message)
    "#{message}油~"
  end
end

上傳後,我們還有一些工作要做:

postgresql 版本的指定

如果你在 heroku logs -t 上面看到這個錯誤訊息:

2018-01-12T18:30:39.687847+00:00 heroku[web.1]: Starting process with command `bin/rails server -p 18506 -e production`
2018-01-12T18:30:45.609275+00:00 app[web.1]: /app/vendor/bundle/ruby/2.4.0/gems/activerecord-5.1.4/lib/active_record/connection_adapters/connection_specification.rb:188:in `rescue in spec': Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)

請將你的 Gemfile 修改一下,原本是:

group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end

改為

group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'pg', '~> 0.21.0'
end

由於三天前 pg 發布了新版本,而新版本似乎有點問題,所以我們需要指定安裝穩定的版本

安裝 Heroku 上的資料庫

使用 heroku addons:create heroku-postgresql:hobby-dev 指令弄一台免費的資料庫來玩玩。

D:\只要有心,人人都可以作卡米狗\ironman>heroku addons:create heroku-postgresql:hobby-dev
Creating heroku-postgresql:hobby-dev on people-all-love-kamigo... free
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Created postgresql-concave-22896 as DATABASE_URL
Use heroku addons:docs heroku-postgresql to view documentation

D:\只要有心,人人都可以作卡米狗\ironman>

進行在 Heroku 上的資料庫遷移

在我們的小黑框輸入 heroku run rake db:migrate

D:\只要有心,人人都可以作卡米狗\ironman>heroku run rake db:migrate
Running rake db:migrate on people-all-love-kamigo... up, run.8915 (Free)
D, [2018-01-12T18:43:37.665151 #4] DEBUG -- :    (1852.2ms)  CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
D, [2018-01-12T18:43:38.188458 #4] DEBUG -- :    (491.4ms)  CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)
D, [2018-01-12T18:43:38.194442 #4] DEBUG -- :    (2.3ms)  SELECT pg_try_advisory_lock(8162367372296191845)
D, [2018-01-12T18:43:39.009656 #4] DEBUG -- :    (2.2ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
I, [2018-01-12T18:43:39.012007 #4]  INFO -- : Migrating to CreateKeywordMappings (20180110181744)
D, [2018-01-12T18:43:39.015455 #4] DEBUG -- :    (0.8ms)  BEGIN
== 20180110181744 CreateKeywordMappings: migrating ============================
-- create_table(:keyword_mappings)
D, [2018-01-12T18:43:39.833168 #4] DEBUG -- :    (815.6ms)  CREATE TABLE "keyword_mappings" ("id" bigserial primary key, "keyword" character varying, "message" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)
   -> 0.8170s
== 20180110181744 CreateKeywordMappings: migrated (0.8174s) ===================

D, [2018-01-12T18:43:39.853181 #4] DEBUG -- :   SQL (6.3ms)  INSERT INTO "schema_migrations" ("version") VALUES ($1) RETURNING "version"  [["version", "20180110181744"]]
D, [2018-01-12T18:43:39.861444 #4] DEBUG -- :    (5.7ms)  COMMIT
D, [2018-01-12T18:43:39.880216 #4] DEBUG -- :   ActiveRecord::InternalMetadata Load (2.8ms)  SELECT  "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2  [["key", "environment"], ["LIMIT", 1]]
D, [2018-01-12T18:43:39.896978 #4] DEBUG -- :    (1.1ms)  BEGIN
D, [2018-01-12T18:43:39.899766 #4] DEBUG -- :   SQL (1.0ms)  INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "key"  [["key", "environment"], ["value", "production"], ["created_at", "2018-01-12 18:43:39.897705"], ["updated_at", "2018-01-12 18:43:39.897705"]]
D, [2018-01-12T18:43:39.902418 #4] DEBUG -- :    (1.8ms)  COMMIT
D, [2018-01-12T18:43:39.903709 #4] DEBUG -- :    (0.8ms)  SELECT pg_advisory_unlock(8162367372296191845)

D:\只要有心,人人都可以作卡米狗\ironman>

進行實測

順利~不順利的人請在底下留言並附上不順利的截圖,謝謝。

本日重點

  • 學習了字串操作
  • 學習了 Heroku 上的資料庫建置
  • 做出了學說話和觸發說話

明天講推齊功能。


上一篇
第二十四天:認識資料庫(續)
下一篇
第二十六天:卡米狗推齊
系列文
只要有心,人人都可以做卡米狗33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
luke90329
iT邦新手 5 級 ‧ 2018-01-13 12:10:59

卡卡米大大 那個 今天部屬都很順利 學說話也可以正常執行
但是學完之後要用關鍵字回復就一動也不動 不知道是哪邊出錯
可以在對一次程式碼嗎

看更多先前的回應...收起先前的回應...
luke90329 iT邦新手 5 級 ‧ 2018-01-13 12:18:14 檢舉

https://ithelp.ithome.com.tw/upload/images/20180113/20107961P1IInd55iO.png
看起來有成功找到關鍵字 只是不知道為何沒回覆

luke90329 iT邦新手 5 級 ‧ 2018-01-13 12:21:50 檢舉

結果我把關鍵字那邊的工程師的浪漫弄回一開始的就好了XD

喔 我的浪漫寫錯了 對不起 我改一下 XD

本文已修改

0
麥口
iT邦新手 5 級 ‧ 2018-01-18 10:19:58

git上傳後,出現警告訊息,LINE機器人目前變成已讀不回。
警告訊息如下:
https://ithelp.ithome.com.tw/upload/images/20180118/20108375ty5ZADWhgj.png

警告訊息有建議移除Gemfile.lock,移除後上傳會出現錯誤。
訊息如下:
https://ithelp.ithome.com.tw/upload/images/20180118/20108375HSCzw8yjyr.png

我的Gemfile完整程式碼:

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.4'
# Use sqlite3 as the database for Active Record
# gem 'sqlite3'
group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'pg', '~> 0.21.0'
end
# Use Puma as the app server
gem 'puma', '~> 3.7'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

# line
gem 'line-bot-api'

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

在今天之前就有相同的警告訊息,那個不會造成影響。卡米狗已讀不回是特色,不是bug。
因為我們的主程式

 def webhook
    # 學說話
    reply_text = learn(received_text)

    # 關鍵字回覆
    reply_text = keyword_reply(received_text) if reply_text.nil?

    # 傳送訊息到 line
    response = reply_to_line(reply_text)
    
    # 回應 200
    head :ok
  end 

只要使用者輸入沒有觸發學說話,也沒有觸發關鍵字回覆,就不會回應了。

如果你要測試的話,可以改這個函數:

# 傳送訊息到 line
  def reply_to_line(reply_text)
    return nil if reply_text.nil?
    
    # 取得 reply token
    reply_token = params['events'][0]['replyToken']
    
    # 設定回覆訊息
    message = {
      type: 'text',
      text: reply_text
    } 

    # 傳送訊息
    line.reply_message(reply_token, message)
  end

改成

# 傳送訊息到 line
  def reply_to_line(reply_text)
    reply_text = '嗯...讓我想想' if reply_text.nil?
    
    # 取得 reply token
    reply_token = params['events'][0]['replyToken']
    
    # 設定回覆訊息
    message = {
      type: 'text',
      text: reply_text
    } 

    # 傳送訊息
    line.reply_message(reply_token, message)
  end

你的卡米狗就可以多一個講幹話的規格。

麥口 iT邦新手 5 級 ‧ 2018-01-18 10:54:02 檢舉

不好意思,我沒講清楚,是commit後,學講話沒反應
https://ithelp.ithome.com.tw/upload/images/20180118/20108375HX71vzQYhv.png

麥口 iT邦新手 5 級 ‧ 2018-01-18 12:15:02 檢舉

嗯...我照著第26天的內容更新程式碼後,問題都不見了/images/emoticon/emoticon10.gif

0
kenneth8701
iT邦新手 5 級 ‧ 2018-04-23 22:38:23

請問之後要怎麼再繼續增加關鍵字回復?

看更多先前的回應...收起先前的回應...

什麼意思?

將原本的關鍵字改為資料庫查詢後,資料庫還可以再增加嗎?

可以呀 你說的資料庫增加是指學說話嗎?還是關鍵字設定後台?

關鍵字設定後台是第二十八天的用法嗎?

1
hsiwei
iT邦新手 5 級 ‧ 2018-05-09 14:38:15

分享給大家,也許有人也會遇到 port:5000 被 blocking 的問題
輸入完 heroku run rake db:migrate 後會出現這個錯誤
Running rake db:migrate on ⬢ kenda-beverage... !
! ETIMEDOUT: connect ETIMEDOUT 50.19.103.36:5000

解決方法:
heroku run:detached rake db:migrate
就可以哩!!!

port:5000被擋可能是因為我是在公司偷學卡咪狗的哈哈..

0
rk42745417
iT邦新手 5 級 ‧ 2018-07-14 17:10:24

我家的機器人以讀不回
https://ithelp.ithome.com.tw/upload/images/20180714/20110162cHfFSyfEJr.jpg
我其中有看到
他有抓到我的資料庫
但status是500...

  #傳送訊息到line
  def reply_to_line(reply_text)
    return nil if reply_text.nil?
    
    #取得reply token
	reply_token = params['events'][0]['replyToken']
	
	#設定回復訊息
	message = {
	  type: 'text',
	  text: reply_text
	}
	
	#傳送訊息
	line.reply_message(reply_token, message)
  end

 #關鍵字回復
  def keyword_reply(received_text)
    KeywordMapping.where(keyword: received_text).last&.message
	
  end

看一下你的第56行 你可以在log裡面看到他叫你看你的第56行出了點問題 問題是你寫了 reply 但你沒有定義 reply

0
frank_huang
iT邦新手 5 級 ‧ 2018-08-28 13:45:17

感謝大大 持續完成進度中 努力邁向最後一步

想問問一些遇到的難題

請問如何檢查kamigo_controller.rb哪行錯誤
每次都除錯好久..

另外如何觀看heroku postpresql資料
我使用了pgadmin III
跑出了伺服器沒有監聽

  1. 錯誤訊息中通常會寫錯在哪一行,只是你要在茫茫 log 海中找到他

  2. 我通常是用 rails db 指令下 sql 看資料

0
stanly0726
iT邦新手 5 級 ‧ 2018-11-12 19:31:54

請問我要怎麼取得傳訊息給我的人的名字
有辦法用user_id取得嗎
我想要我的機器人學說話的時候可以順便記錄是誰教他說話的

Pangolin iT邦新手 5 級 ‧ 2019-04-10 00:03:23 檢舉



event有一個屬性叫做source.userId,你就可以看到那個人的id了:D

Pangolin iT邦新手 5 級 ‧ 2019-04-10 00:03:54 檢舉

詳細可以看LINE API文件

謝謝

0
stanly0726
iT邦新手 5 級 ‧ 2018-11-12 19:31:57

請問我要怎麼取得傳訊息給我的人的名字
有辦法用user_id取得嗎
我想要我的機器人學說話的時候可以順便記錄是誰教他說話的

0
Pangolin
iT邦新手 5 級 ‧ 2019-04-12 01:17:17



我這個功能卡了好久才寫完,一開始我想說用sqlite3將關鍵字寫進去資料,後來看到米大說,heroku不支援sqlite3,因為伺服器儲存方式的關係,他們推薦用postgresql。我爬文爬了很久好不容易找到開發環境(development mode)轉生產環境(production mode)的套件,但我那塊實在不熟,最後我決定用firebase儲存關鍵字,才解決這道關卡。近日感想:我有稍微看了一下ruby對資料庫操作,某一些功能程式只要寫一兩行就可以達到我們想的效果,反觀我寫的node實在有點多行(汗)。

讚讚讚

0
556888
iT邦新手 5 級 ‧ 2019-06-03 22:02:56

我還是不會解決這個問題
https://ithelp.ithome.com.tw/upload/images/20190603/20118064AAc35VpNNw.jpg
https://ithelp.ithome.com.tw/upload/images/20190603/20118064oU6dj59X85.jpg

錯誤訊息裡寫著
出錯在第9行

556888 iT邦新手 5 級 ‧ 2019-06-08 17:26:07 檢舉

不好意思我現在才回我第九行長這樣
https://ithelp.ithome.com.tw/upload/images/20190608/20118064p41n3GstJZ.jpg

0
TooBe
iT邦新手 5 級 ‧ 2019-12-16 23:06:43

我剛剛做完上面的程式可是用 heroku logs -t 發現有錯可是我不知道要改哪一行
https://ithelp.ithome.com.tw/upload/images/20191216/20123632BMStvigpFq.png
程式碼
https://ithelp.ithome.com.tw/upload/images/20191216/20123632aemXUZ33UY.pnghttps://ithelp.ithome.com.tw/upload/images/20191216/20123632N0Nf4F6wCX.pnghttps://ithelp.ithome.com.tw/upload/images/20191216/20123632azNndiH0qa.pnghttps://ithelp.ithome.com.tw/upload/images/20191216/20123632AcXZ8P9iOg.pnghttps://ithelp.ithome.com.tw/upload/images/20191216/20123632flvXVOSSVb.pnghttps://ithelp.ithome.com.tw/upload/images/20191216/20123632tz3fxKVjTy.png

TooBe iT邦新手 5 級 ‧ 2019-12-16 23:44:22 檢舉

我改了一下變成讀得到但不會回 變成這樣
https://ithelp.ithome.com.tw/upload/images/20191216/20123632Wi8m54dvhg.pnghttps://ithelp.ithome.com.tw/upload/images/20191216/20123632EDKo8V0cim.png

TooBe iT邦新手 5 級 ‧ 2019-12-17 20:49:37 檢舉

我自己找出錯誤在哪了

XD

0
jimjimjimjim444
iT邦新手 5 級 ‧ 2020-05-29 14:42:28

卡米大,感謝你做了這樣一系列的教學真的好好!
我在一開始先從頭跟您一起做到最後

現在想要做一個user輸入文字,linebot回覆圖片
想說建立一個資料庫,使用者的文字進去查詢資料庫
我會過頭來看23.24.24天

在測試的時候成功
輸入卡米狗學說話;A;B 再輸入A會回傳B
可是在24天用rails c create的欄位keyword "Q" message "A"
在line裡面卻成功不了
需要麻煩您幫幫我一下,謝謝!

我從kamigo_controller.rb>learn中加入一行是可以看到KeywordMapping.all
結果發現居然和rails c irb中的KeywordMapping.all 完全不一樣

我以為KeywordMapping.create(keyword: keyword, message: message)
會將使用者輸入的insert into rails c的keyword_mapping
結果不是,是另一個keyword_mapping
把我給整矇了我好菜QQ,查了網路上不知道是關鍵字下錯還是只有我有這個問題
line
https://imgur.com/bavFG3r

def webhook
    # 學說話
    reply_text = learn(received_text)

    # 關鍵字回覆
    reply_text = keyword_reply(received_text) if reply_text.nil?

    # 傳送訊息到 line
    response = reply_to_line(reply_text)
    
    # 回應 200
    head :ok
  end 

  # 取得對方說的話
  def received_text
    message = params['events'][0]['message']
    if message.nil?
      nil
    else
      message['text']
    end
  end

  # 學說話
  def learn(received_text)
    #如果開頭不是 卡米狗學說話; 就跳出
    return nil unless received_text[0..6] == '卡米狗學說話;'
    
    received_text = received_text[7..-1]
    semicolon_index = received_text.index(';')

    # 找不到分號就跳出
    return nil if semicolon_index.nil?

    keyword = received_text[0..semicolon_index-1]
    message = received_text[semicolon_index+1..-1]

    KeywordMapping.create(keyword: keyword, message: message)
    '好哦~好哦~'

    p "======這裡是 message ======"
    p KeywordMapping.all
    p "============"

  end

heroku logs -t
https://imgur.com/nOln4fF
rails c
https://imgur.com/r85NW9s

heroku 的資料庫是在雲端,你自己開發的資料庫是在本機,所以你有兩個資料庫

謝謝您,了解了!

0
jimjimjimjim444
iT邦新手 5 級 ‧ 2020-06-01 09:03:43

哦哦哦了解! 謝謝您!

我要留言

立即登入留言