寶寶Echo Line ChatBot api 教學 (php)

寶寶Echo:

yqx0407i

  1. Echo
    01
  2. 空氣品質查詢
    messageImage_1462620227535
  3. 無線熱點查詢
    messageImage_1462620227535

 

昨晚看到有人在玩FB ChatBot感覺好好玩
影片支援:https://www.facebook.com/D.Weizhe/videos/10208034398169797/

他好像是用node.js在玩的,不過我完全沒有碰過那個東西…
所以只好轉換個跑道,去找找看有沒有之前接觸過一點點的php範例
找了一個晚上後,終於在一個日本網站找到了一篇教學文
網址:https://www.panzee.biz/archives/9115

雖然看不懂日文,但是看看圖看看Code還是可以了解一點點點的!
Line ChatBot的部分就不多說了,請看這裡
好了開始本篇的教學吧!

1. 在伺服器上安裝SSL憑證
本來這個部份我是想用cloudflare的Flexible來解決的,
但後來發現這樣的話Server IP無法加入到Line的白名單裡面,
最後在這篇文章看到作者推薦Let's Encrypt這家免費SSL商,
安裝了一下發現,這家使用的安裝方法無法套用在Windows Server上面阿阿阿阿啊!
沒關係,我幫你們找好了這個解決方案,
我簡單的整理了一下:

2. 在 Line Developers Channels裡面輸入Server本身的IP
01

3. 寫一個callback.php,這裡我是參考剛剛上面提到的這篇,以下是我的Code。

4. 修改Callback URL改為你的php檔案
02

5. 完成!
01

其實我最初是想用ASP.NET寫的,
已經可以取得使用者輸入的文字,
但是後面發現如果要回傳訊息的話必須要POST回去,
有點麻煩…
就乾脆選擇簡單的PHP解決了。

Sample Code From GitHub

  • 郭柏逸

    前輩您好,我現在https伺服器已經架好,程式也已經放上去Run了,直接發Request到url上測試也都沒問題(https://..xxx.xxx/callback)。

    但把這個url放在Line開發者的後台callback url裡,實際從手機的line發送訊息卻毫無反應,請問我還有哪個步驟忽略了嗎?

    • shuangrain

      你好 Line Server白名單有加上去嗎?

      • 郭柏逸

        前輩您好,這邊指的Server IP 是和domain name一樣的位址嗎?
        如果是的話我已經加入了。

        有其他人說更改Line開發者後台的callback URL要過一陣子後才會生效,
        請問您在做的時候有這個問題嗎? 謝謝!

        • 沸死特

          是的,他是依照domain解析的ip去比照白名單
          所以不能把網站掛在CDN服務後面
          白名單與callback都是五分鐘左右就會生效
          channel_id和channel_secret和mid都有輸入正確嗎?

          • 郭柏逸

            前輩您好~那IP應該是沒錯才對
            因為我直接在網址列輸入IP,Server也是可以接到Request
            今天回家又確認了一次channel_id、channel_secret、mid
            都是正確的
            也還是沒反應,真是太奇怪了 Q_Q

          • 沸死特

            方便提供callback url測試嗎?

          • 郭柏逸

            沒問題~
            https://kko.familyds.com:8080/callback

            我是用nodejs架在自己的synology NAS上面
            不知道會不會是NAS的關係!?
            但NAS上面也有裝了Lets Encrypt憑證
            直接用https://kko.familyds.com:8080的話也是可以看到憑證是安全的

            這是line頻道的QR Code
            https://qr-official.line.me/sid/L/abm1030u.png

            還請前輩幫忙抓問題了~ 感謝!!

          • 沸死特

            妳好,不知道是不是你的callback有問題還是我測試的方法錯誤
            我用postman上去測試你的網址,timeout無回應,
            直接用瀏覽器上去也是404錯誤

          • 郭柏逸

            前輩您好,不好意思昨天那個時候我應該是關掉伺服器了@@”
            剛剛自己測試一下是可以的喔
            原來還有postman這麼好用的工具,謝謝分享!

          • 沸死特

            我還是404錯誤…

          • 郭柏逸

            會不會是Header沒有設定好呢?
            https://kko.familyds.com:8080
            https://kko.familyds.com:8080/users
            這些也是404嗎~!?

          • 沸死特

            有設定唷,加不加host都一樣問題

          • 郭柏逸

            我剛剛看LOG有接到資料了!! text : ‘3310’
            沒有回傳是因為好像要把postman的IP設成白名單才可以回傳
            之前我是用Burp Suite來測也是可以的而且不用設白名單(但這個軟體比較複雜)

            總之這樣子外網應該是可以連到/callback的沒錯!!

          • 沸死特

            有沒有可能是因為這個原因,造成你無法回傳訊息至line?

          • 郭柏逸

            但不能回傳訊息到Line,我的LOG應該也是會先接到使用者輸入的資料才對?
            但是我用手機直接輸入文字時,LOG是沒有任何東西的(沒任何反應)
            昨天在FB的 Chat Bot Developer社團也問了一下
            有一位大大說他也是設定完callback都沒反應
            放著過兩個禮拜之後突然就可以了
            不曉得是不是Line那邊的問題要等他開通之類的!~?

          • 沸死特

            那我就不曉得了,
            我自己是申請後擺著一陣子才想起來回去玩。

            你可以嘗試看看放個php的callback,
            並把https端口改為預設的443,
            把自己的環境單純化,在測試看看吧。

          • 郭柏逸

            恩恩,我用PHP試試來測試看看好了
            謝謝前輩的幫助!

          • 沸死特

            我自己用我自架的主機也測試了一下,發現有接收到訊息但無法回傳,但用我租用的主機就沒這個問題,租用主機設定白名單似乎馬上生效,自架主機設定白名單都沒有反應@@

          • 邱士展

            前輩您好,我也用主機架了一個,有收到對方的LOG紀錄,也是沒有反應,請問您是否以解決自架網站無反應問題,特別請教一下,謝謝

            /callback.php – 443 – 203.104.146.70 ChannelEventDispatcher/1.0 – 200 0 0 859

          • 好像是LINE那邊的問題,我使用學術網路與家裡自架都無法回傳訊息

          • 邱士展

            您好,那請問您的外部租用空間可以運作是使用國外代管還是國內代管?謝謝

          • vultr 日本主機,http://www.vultr.com/?ref=6893837 這是我的邀請碼,看你要不要用XD

          • 邱士展

            謝謝,我會試試看,如果OK的話我會用的

          • 郭柏逸

            大大~

            後來我去實作FACEBOOK的BOT

            終於找到問題了

            Facebook後台有測試驗證webhook的callback

            而且測試後會提供錯誤訊息

            最後在這裡發現的我的nodeJS的https憑證設定錯誤

            (但用瀏覽器URL或Post man都可以通過,真奇怪)

            相對Line的callback 成功/失敗 都沒地方可以看

            FB的開發後台友善多了

            總之最後還是成功了

            謝謝大大分享!

          • 奇怪的是我朋友用我的主機測試,他依然無法回傳,明明同樣的IP我卻可以正常回傳,他卻無法,這點也滿令人匪夷所思的。

            看來Line在這方面還要多多加強,改天有空來玩玩看FB的好了。

          • 郭柏逸

            可以去看看FB的有回傳甚麼錯誤訊息~
            應該會有所幫助!

          • 邱士展

            前輩您好,我在學術網路,用網路工具測試,送過去,對方的確有接收,所以我就用不同的方式測試送訊息,
            我的測試結果是SERVER送出中文訊息就沒反應,送出 英文 訊息就正常顯示
            跟SERVER是中文的作業系統有關?

          • 邱士展

            前輩您好,我在學術網路,用網路工具測試,送過去,對方的確有接收,所以我就用不同的方式測試送訊息,
            我的測試結果是SERVER送出中文訊息就沒反應,送出 英文 訊息就正常顯示
            跟SERVER是中文的作業系統有關?

          • 我的SERVER都是中文系統,Linux Windows都試過,我測試訊息都丟數字,我覺得應該不是中英文問題

            個人猜測是白名單對於特定IP無效,因為我在vps上面嘗試過很多不同的IP(日本)都是可以正常回傳,白名單一輸入即生效沒有等待時間,所以可能是回傳的訊息LINE那邊接收後比對白名單IP驗證沒過所以不允許將訊息回復給使用者

          • 邱士展

            我測試兩個140開頭的IP,英文都可以正常傳送,若傳送內容是中文就沒有反應,目前正在測試把中文編碼來送送看,看看哪一種格式會有反應

          • 我測試的vps ip為45 108皆可,220 210皆無法
            請問您那邊測試的有反應是指機器人可以正常回覆嗎?
            還是用工具測出對方有接收到?

          • 邱士展

            英文機器人可以正常回覆,目前中文經過編碼他就呈現原貌,還是沒辦法中文回覆

          • 那還真是奇怪,這部分我就不太清楚了

          • 邱士展

            您好,我今天把相關api都寫成function後就測試了一下中文,發覺我的php只要json_encode有中文,php error log就會顯示符號錯誤,您的php編json的function不會嗎?您的php版本是多少?有查資料urlencode可以解決,但我試過還是一樣會發生錯誤

      • 郭柏逸

        前輩我又來了~
        目前還是沒辦法進入我的callback
        我在想是不是因為Line只接受443的port??
        因為我的私人主機443預設已經被佔用了
        所以改為8080
        有空來把callback url 改成443看看

  • 邱士展

    前輩您好,我在學術網路,用網路工具測試,送過去,對方的確有接收,所以我就用不同的方式測試送訊息,
    我的測試結果是SERVER送出中文訊息就沒反應,送出 英文 訊息就正常顯示
    SERVER是中文的作業系統有關?

  • Szu-Han Li

    前輩您好
    不知您有沒有試過LINE BOT 的Getting message content?
    https://developers.line.me/bot-api/api-reference#getting_message_content

  • wolkesau

    寶寶好友已經爆了!
    有第2支嗎?
    是不是只能回覆,無法主動發送?

    • 哦…沒有唷,寶寶只有一隻…
      不過應該還是可以聊天吧?只是不能新增好友而已

      如果有記錄過使用者的ID的話,是可以主動發送訊息的唷!

  • Artick

    您好,我想請問~~~
    我的AWS空間用了Let’s Encrypt! 作為SSL商
    白名單也加上了設定的Elastic IP
    Callback URL也給儲存了~
    但是傳訊息的時候卻沒有打到我的空間
    回去設定頁做Verify時顯示: SSL certificate is invalid……
    請問現在LINE API還是支援 Let’s Encrypt的CA嗎?

    另外想請問,傳送到trialbot的訊息中,toChannel的值是固定的嗎? 那個值的含意是什麼呢? 謝謝您!

    • Artick

      不好意思我解了QQ 發現是自己忘記加CA~

      • Ada Hsu

        Hi,

        請問您是如何加 CA 的呢?

        • Artick

          Hello Ada,
          我是看這篇去作申請和綁定的
          lightblue.asia/blog/165-blog/linux/175-ssl-certificate-by-let-s-encrypt
          但因為我使用的是Apache,裡面的教學是用Nginx
          所以第五點不用照著他的方式
          一樣到你宣告網域的地方(應該是/etc/apache2/sites-available裡面你網域的conf)

          ServerAdmin 填入你的Email
          ServerName 填入你的網域,後面要加上 :443
          ServerAlias 你的網域
          DocumentRoot 內部路徑
          ErrorLog error.log位置
          CustomLog access.log位置
          SSLEngine on
          SSLCertificateFile fullchain.pem路徑
          SSLCertificateKeyFile privkey.pem路徑
          SSLCACertificateFile fullchain.pem路徑

          之後 reload apache就可以用了,給你參考~

          • Ada Hsu

            Hi,

            我剛剛解完這個鳥問題… 感謝您的回覆,也給其他人一些參考資訊:

            我的環境上有點不一樣:
            1. 我使用 sslforfree 去申請的,它會吐 2 個 .crt 及 1 個 private.key 檔
            2. 我使用的是 tomcat / java solution.
            3. 先使用 openssl 產生一個 pkcs12 格式的 keystore

            openssl pkcs12 -export -password pass:
            -in certificate.crt
            -inkey private.key
            -out -name
            -CAfile ca_bundle.crt
            -caname root

            4. 把 let’s encrypt 的 root / chain 憑證放進去

            keytool -import -trustcacerts -alias
            -file -storepass
            -keystore

            5. 修改 tomcat 的 server.xml 檔,修改 keystore 相關設定

            keystoreFile=”” keystorePass=”” keystoreType=”PKCS12″

          • 感謝分享 ^^

  • 請問前輩 為什麼 我的機器人都沒有反應只會已讀我….. 網址 https://risen.tw:443/callback.php 不懂為什麼都沒反應….. 是因為放在 跟wordpress 網站根目錄一樣的關係嘛?

    • 您好,請問Line上面的白名單新增主機的IP了嗎?
      新增後請等待5~10分鐘後生效

      跟你放在哪裡應該是沒有什麼關聯的
      我現在就丟到azure app service去了,
      只要白名單IP設定正確一樣可以正常運作

      • 一直都沒有回應…..

      • 後來我去 Ping Server Hostname 得到的IP加入白名單就正常了 謝謝版主

      • Cheng-ming Chen

        您好 , 我也丟到AZURE APP SERVICE , 也設定好三個值 +IP白名單 , 但LINE輸入後就是沒有反應 , 要如何檢查是否CALLBACK的PHP正確阿 , 謝謝版主

        • 有時候其實是line自己伺服器的問題,新帳號白名單好像都有問題,身邊也有數個案例是如此狀況,都要等待X天後才能正常運作(X=未知),只能等待或是聯絡line官方了

          如果只是單純想要檢查callback是否有問題,可以寫個簡單的資料庫Insert語法在裡面,就可以確認Line是否有連線到你所設定的位置

          • Cheng-ming Chen

            我後來發現一個奇怪的現象 , 我把PHP放到Azure上 , 搭配3段不同的寫法 , 其中一種寫法如下 , 原本不會動 , 但只要加上curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); , 這一行 , 就會順利運作 , 這是網路上搜尋到的 , 應該是免費的AZURE APP Service不支援SSL的狀況才需要 , 目前可以運作了 , 讓大家參考一下

            $channel_id=”xx”;
            $channel_secret=”xxx”;
            $channel_mid=”xxx”;
            $endpoint_url=”https://trialbot-api.line.me/v1/events”;
            $arr=json_decode(file_get_contents(“php://input”),1);
            $from=$arr[‘result’][0][‘content’][‘from’];
            $text=$arr[‘result’][0][‘content’][‘text’];

            $a=array(“@@”,”^^”,”Oo”);
            $k = array_rand($a);
            $text=$a[$k];;
            $post_data=”{“to”:[“$from”],”toChannel”:1383378250,”eventType”:”138311608800106203″,”content”:{“contentType”:1,”toType”:1,”text”:”$text”}}”;
            $ch=curl_init();
            $headers=array(“Content-Type: application/json; charser=UTF-8″,”X-Line-ChannelID: $channel_id”,”X-Line-ChannelSecret: $channel_secret”,”X-Line-Trusted-User-With-ACL: $channel_mid”);
            curl_setopt($ch, CURLOPT_URL, $endpoint_url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            // important for azure
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_exec($ch);

  • 毛怪

    前輩你好
    可以請問一下您有用過line mesenger api 嗎?
    他只有 channel ID,channel secret以及Channel Access Token
    原生地api我不會用
    可以請版主教一下嗎?

  • 馬英九
  • Nick Shu

    站長您好
    不好意思想要請教您,如果是這樣發送訊息
    else if($text==”關鍵詞”)
    {
    $replytext=”回覆的訊息”;
    }
    要如何把接收的訊息改為判斷多個關鍵詞呢? 因為這樣只能設定一個詞,很想要可以設定例如:你好 安安 嗨,然後回覆一個訊息,這樣就不用寫三個判斷式了

    謝謝您