先前的問題是想利用regexp規則,讓LINE BOT抓取整句話的特定關鍵字。
之後測試發現,如果LINE@後台設立關鍵字A,再利用程式語言判斷關鍵字A。
當有人發送關鍵字A的消息給BOT,就會收到兩種回應。(LINE@後台設立的回應與程式語言判斷的回應不同。)
如果我利用regexp的規則,想詢問有哪位工程師,願意手把手教我這個完全的外行人……
爬了幾篇跟regexp有關的文章,我看得一頭霧水。(是真的完全沒有概念)
有看到這篇基礎教學,但因為內部敘述使用的是英文,不知道使用中文會否有所影響。
然後我完全看不懂C++跟JAVA是什麼意思……只知道應該類似於語法版本?
卡米狗的語言是哪個版本,有工程師前輩知道嗎?
想請問各位工程師,如果我接續卡米狗作者LINE BOT製作教學文章內的程式語言,來接續這位工程師的regexp規則。
兩者間會有衝突嗎?
因為使用的是不同的平台,我並不需要使用者可以「搜尋關鍵字」。
而且我是完全0概念的門外漢,有點好奇有沒有願意花時間的工程師,可以教學?
而且這個教學可能會花很長一段時間……
我只是想學一段regexp規則而已。
但不知道還會牽扯到什麼語法,所以不知道會不會太麻煩。
雖然我很清楚這個要求很失禮,也很不切實際。
但總歸是有問總比沒問好……(抹臉
先謝謝願意看完這篇文章的工程師。
更新一下。
有看到前輩們回應跟回答的內容了。
目前仍然是一頭霧水當中。
如果我在回應上,讓您有鬼打牆的感覺,請多包涵。
我先研究一下卡米大提供的網站。
謝謝各位前輩。
第一個問題已經由 weiclin前輩 回答你了
回答你第二個問題
兩者都讀取內容的情形
你可以在 Line Developers 內關閉Line@的回話功能
兩者選擇為Disabled即可 這樣他就會只走程式碼讀取的部分
感謝您的教學。
在後台端開啟關閉的部份,卡米大的教學文章裡面有。
不過我比較疑惑是,如果我使用程式碼跟LINE@後台端,兩者關鍵字同時並進的話,會有程式上的衝突嗎?
還是設立抓取字串的程式編碼時,會更便利一些?
如果會加深難度,我就會關閉LINE@後台端的關鍵字,如果會更便利,我就會考慮兩者並用。
我之前測試的結果是會變成
Line@帳號會 要求你輸入指定的關鍵字"一字不差"才能針對該答案去做回答且無法去即時更新
程式碼的部分就可以自己去編寫是否包含有關鍵字等與實時更新等功能
Line@的服務使用者可能比較面向固定服務的店家(不需要複雜操作的
Message Api就是可能需要多樣功能編寫的服務
根據你需要的功能 應該會面向使用Message Api
您的意思是在程式語言上,LINE@後台端的關鍵字其實是非必要的存在。
因為已經使用Ruby編寫程式語言,所以基本很多操作都可以在Ruby這裡完成,LINE@後台端的關鍵字就不重要了。
如果理解沒錯的話……
所以,是否可以認為,直接關閉LINE@後台端的關鍵字,是目前最簡單的方式?
是的 我是這樣認為 因為如果你自己可以編寫規則了
Line@那定死的關鍵字回應 就無法滿足你目前的需求
根本不需要用到 RegExp
如果你已經完成LINE BOT 製作教學文章第22天的話
以下是修改後的版本
只要修改第 5 到第 14 列即可
require 'line/bot'
class KamigoController < ApplicationController
protect_from_forgery with: :null_session
def webhook
#如果有兩個關鍵字其中一個,就進行判斷
if received_text.include? "人物A" || received_text.include? "出去玩"
if received_text.include? "人物A"
response = reply_to_line("找我?")
end
if received_text.include? "出去玩"
response = reply_to_line("你想去哪?")
end
#如果沒有兩個關鍵字,就直接回 無法判斷這句話
else
response = reply_to_line("無法判斷這句話")
end
# 回應 200
head :ok
end
# 取得對方說的話
def received_text
message = params['events'][0]['message']
message['text'] unless message.nil?
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
# 傳送訊息到 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
感謝您的提供。
我先測試這串編碼看看。
因為不僅有這兩個關鍵字,我還有設立其他關鍵字,所以必須要給BOT編寫一個抓取關鍵字紀錄資料的動作。
就好比,我的關鍵字設立有10~20個甚至以上,BOT在抓取關鍵字串的時候,會先去資料庫搜尋關鍵字。
不過整句話設立上,我最多只讓BOT抓取兩個關鍵字串。
再多就會回應無法判讀的訊息。
如果我在
if received_text.include? "人物A"
response = reply_to_line("找我?")
的"人物A"修改成前往資料檔案抓取關鍵字的指令
找我的地方修改成關鍵字回應的指令,這樣是可行的嗎?
還是要額外編寫一個各自判斷的指令?
我正在參考卡米大支援的網站:
變數、常數、流程控制、迴圈
我先研究一下裡面的教學內容。
感謝您。
「沒有學會走,先學跑,從來不是問題,但先問一問自己是不是天才。如果不是,就要一步步來。
Quote : 寒戰2 李文彬
這道理我知道的。
但就是因為完全外行,連自己是在學走還是學跑都搞不清楚,所以只能抓看見問題的地方就發問,哈哈哈。
我現在的狀態大概就是「想吃一道料理(BOT),但連這道料理叫什麼名稱(使用的語言)都不知道的狀態,只能說出這道料理有什麼材料(看見的問題)。」
所以我很清楚,我的言論在專業前輩們面前很鬼打牆。
因為無法完整敘述我想表達的需求,也無法讀懂許多專業用語。
想學正則表示式
,可以先從W3School JavaScript RegExp Reference起步走!
(話說似乎60%以上的Web技術都能從W3School
起步走)
感謝前輩的推薦。
我會找時間去找相關的新手讀物回來研讀。
想請問書籍的名稱是W3School嗎?
還是後面的字串也要搜尋會比較穩妥?
W3School是網站!
點上面連結後加入我的最愛就行了!
啊,我誤會了。(汗
謝謝您提供的網站。
有看到有前輩提醒我,因為卡米狗的作者,使用的是Ruby,我會擔心這樣會不會有程式語言上的衝突,我先來研究一下。
非常感謝!
其實從你跟幾位大大們的對話。可以了解你對程式界的用語及規範並不那麼清楚。
認真來說,regexp(正則表示式),您可以將其視為一種可條件化的搜尋應用字串。
這種表示式是可應用到任何語言跟支援的軟體上。
如果說要用很白話的說法。你可以將其當成一種公式或是通用的函式。
如if、for這些語法一定會在任何語言或支援軟體上都會用的東西。
正則式的規則都大同小異。各大程式語言都會有其應用的函數包含了「搜尋」「取代」「包含」「截取」等等。(視程式語言支援的情況)。部份語言可能會有某些正則條件的應用語法不支援或是自行加上去的方式。這就需要自已去試看看才知道。
會使用正則,大多數是為了應用在一些未知定義的字串處理跟取得。或是需要多重處理同一字串內的值。用分解組合判斷的寫法太麻煩時。才會去應用。
如簡單來說的身份証驗証。如用程式化寫法的話。會需要用到3個if跟一段驗証判斷。最少的驗証也需要用到二個if。用正則的話,只要一段字串就可以解決。(當然,如果還是需要用到嚴格的驗証方式,正則還是辦不到的)
最後再跟你說一件事。正則的學問算簡單不簡單,算很難又不難。就連我自已也是處於一知半解的情況下。
我用的方式是,將常用的方式自行記錄下來。如在網路上看到這段正則可能有用的。我都會將其記錄下來。一但在某個場合上有必要的。我就會譽找其最接近能應用的正則語法來修改測試使用。
可以先看看下面的 link 來了解 regexp 的規則
http://rocksaying.tw/archives/2670695.html
然後再看看你目前用的是哪個語法,再去查該語法的 regexp 的語法怎麼應用
ps
regexp 算是一個規範,所以不管是哪個語言寫出來的「規則」都會是一樣的