iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
Software Development

用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!系列 第 9

【PHP Telegram Bot】Day09 - 用 PHP 主動接收和發送訊息吧!

前置作業

  1. 複製程式碼

    還記得前天最後建立的資料夾嗎,把它用 VS code 打開,再建立一個 php 檔案,把昨天文章的官方程式貼進去
    https://ithelp.ithome.com.tw/upload/images/20210918/20132916BJsiUaURyF.png

  2. 修改 API_TOKEN

    把這邊的 token 換成你自己的

    如果忘記的話可以看看 Day04 - Telegram 機器人的設定 有說在哪可以查看
    https://ithelp.ithome.com.tw/upload/images/20210918/201329166fMVRhsLsF.png

  3. 把底下註解掉

    這坨東東暫時用不到,先註解掉(選起來按 Ctrl + /),或是你想刪掉也可以
    https://ithelp.ithome.com.tw/upload/images/20210918/20132916wdcAjjmgy7.png


用 GET 發送訊息

在 146 行按 Enter 就會多出空白行,然後剛好 142 行就是 apiRequest,直接複製到 146 行來改,跟 Day03 時一樣,把你的 uid 還有你想發送的訊息填進去,忘記 uid 的話可以透過 @userinfobot 取得
https://ithelp.ithome.com.tw/upload/images/20210918/20132916uAo9aueNKV.png
按下右上角的執行程式按紐
https://ithelp.ithome.com.tw/upload/images/20210918/20132916JgwXaf682L.png
之後你就會發現噴出一坨錯誤XD
https://ithelp.ithome.com.tw/upload/images/20210918/201329169fE1Aen2mT.png

Fatal error: Uncaught Error: Call to undefined function curl_init() in D:\_code\php\ironman2021_by_miku3920\long_polling.php:86
Stack trace:
#0 D:\_code\php\ironman2021_by_miku3920\long_polling.php(146): apiRequest('sendMessage', Array)
#1 {main}
  thrown in D:\_code\php\ironman2021_by_miku3920\long_polling.php on line 86

他說他找不到 curl 這個名稱的函式,這是因為 curl 是在 php 的擴充裡才有的功能,預設是沒有這個功能的,我們要先到 php.ini 設定啟用後,才可以使用


設定 php.ini

看不到副檔名的話,到上方 檢視 的右邊有個 副檔名,打勾就行了
https://ithelp.ithome.com.tw/upload/images/20210918/20132916Wr1rqOel4Q.png
打開在 Day06 時安裝 php 的資料夾,可以發現裡面是沒有 php.ini 檔案的,但是有兩個跟他很像的 php.ini-development php.ini-production,這兩個檔案最主要的差別在於 development 版顯示的錯誤會比較多
https://ithelp.ithome.com.tw/upload/images/20210918/20132916y6okw5BjCF.png
我們把 php.ini-development 複製一份,並且重新命名成 php.ini
https://ithelp.ithome.com.tw/upload/images/20210918/20132916RLNwl2FjEQ.png
點兩下開啟之後,找到 extension=curl(建議用 Ctrl + f 搜尋),把左邊的分號 ; 刪掉,這樣就啟用 curl 了,記得儲存檔案
https://ithelp.ithome.com.tw/upload/images/20210918/20132916RFNHgvVURF.png
我們再回來執行一次程式,結果噴出更大一坨的錯誤!
https://ithelp.ithome.com.tw/upload/images/20210918/201329166c71Z1g0wf.png

PHP Warning:  PHP Startup: Unable to load dynamic library 'curl' (tried: C:\php\ext\curl (?曆??唳?摰?璅∠???, C:\php\ext\php_curl.dll (?曆??唳?摰?璅∠???) in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: C:\php\ext\curl (?曆??唳?摰?璅∠???, C:\php\ext\php_curl.dll (?曆??唳?摰?璅∠???) in Unknown on line 0
PHP Fatal error:  Uncaught Error: Call to undefined function curl_init() in D:\_code\php\ironman2021_by_miku3920\long_polling.php:86
Stack trace:
#0 D:\_code\php\ironman2021_by_miku3920\long_polling.php(146): apiRequest('sendMessage', Array)
#1 {main}
  thrown in D:\_code\php\ironman2021_by_miku3920\long_polling.php on line 86

Fatal error: Uncaught Error: Call to undefined function curl_init() in D:\_code\php\ironman2021_by_miku3920\long_polling.php:86
Stack trace:
#0 D:\_code\php\ironman2021_by_miku3920\long_polling.php(146): apiRequest('sendMessage', Array)
#1 {main}
  thrown in D:\_code\php\ironman2021_by_miku3920\long_polling.php on line 86

這是因為剛剛少做了一件事,我們沒告訴它擴充功能的資料夾是哪個

php.ini 找出 extension_dir = "ext"(建議用 Ctrl + f 搜尋),然後把左邊的分號 ; 刪掉,按一下儲存
https://ithelp.ithome.com.tw/upload/images/20210918/20132916UVOzXp6YEv.png
我們再再回來執行一次程式,錯誤明顯變小一坨了很多(欸不是,還是不能執行啊
https://ithelp.ithome.com.tw/upload/images/20210918/201329163rW8l2KJ9R.png

Curl returned error 60: SSL certificate problem: self signed certificate in certificate chain

這邊是因為缺少了一個叫做 cacert.pem 的檔案


下載 cacert.pem 並設定

那這個檔案要去哪裡找呢?其實丟到 google 第一個搜尋結果就是了

答案就在 curl 官網:https://curl.se/docs/caextract.html

點這裡下載
https://ithelp.ithome.com.tw/upload/images/20210918/20132916sIcbEgltZn.png
下載下來之後貼到 php-7.4.23/extras/ssl 這個資料夾裡
https://ithelp.ithome.com.tw/upload/images/20210918/201329160Cuu3qwbfp.png
然後又又要再設定一次 php.ini(相信我這是最後一次)

找出 curl.cainfo(建議用 Ctrl + f 搜尋),再次把左邊的分號 ; 刪掉,然後把剛剛的完整路徑貼上,記得儲存~
https://ithelp.ithome.com.tw/upload/images/20210918/20132916GY51Lddz0n.png


用 GET 發送訊息 Revenge

再次挑戰執行程式!
https://ithelp.ithome.com.tw/upload/images/20210918/20132916qONpVuW1jt.png
這次什麼都沒出現,但是 TG 「叮咚」了一聲
https://ithelp.ithome.com.tw/upload/images/20210918/20132916qz1LwDVggM.png
恭喜你成功用 PHP 發送訊息啦~


用 POST 發送訊息

要改成 POST 很簡單,只要將 apiRequest 改成 apiRequestJson 就行啦
https://ithelp.ithome.com.tw/upload/images/20210918/20132916MMhB3zDAjT.png
按下執行,又「叮咚」了一聲~
https://ithelp.ithome.com.tw/upload/images/20210918/20132916lx7MLEBSdD.png


用 GET 接收訊息

接收訊息要用到 getUpdates 這個 API Method
https://ithelp.ithome.com.tw/upload/images/20210918/2013291636FJP65nzG.png
我們可以看到這個方法(Method)的參數(Parameter)全都是選填(Optional),這表示我們可以完全不填參數

sendMessage 方法改成 getUpdates,還有把 array() 裡的參數全刪除
https://ithelp.ithome.com.tw/upload/images/20210918/20132916kVDqOCzKKC.png
然後還要再加上 print_r() 這個函式,因為要把 apiRequest 函式的返回值(TG 伺服器的回應(response))印出來,這樣你才看的到。

至於為何不使用 echo 呢?這個就留給你自己試試
https://ithelp.ithome.com.tw/upload/images/20210918/20132916h0P9mIQAMe.png
按下執行後你可能會發現什麼都沒有,只有出現 Array(),那是因為你的機器人 24 小時內沒收到過任何訊息
https://ithelp.ithome.com.tw/upload/images/20210918/20132916SgGZTjgDeI.png
你只要先發訊息再執行程式就行了
https://ithelp.ithome.com.tw/upload/images/20210918/20132916mV2tTd1ZQf.png
現在你就能看到剛剛發給機器人的訊息了
https://ithelp.ithome.com.tw/upload/images/20210918/201329167fLKQ9wWIE.png


用 POST 接收訊息

最後的最後,來考考你要怎麼把它改成 POST,在底下留言你的答案吧!


上一篇
【PHP Telegram Bot】Day08 - 官方範例程式
下一篇
【PHP Telegram Bot】Day10 - Long Polling、持續接收與發送訊息
系列文
用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
翗祤
iT邦新手 5 級 ‧ 2021-09-27 16:10:48

您好,想請教一下,我有設定好php.ini,卻仍然噴出這些訊息,有可能是哪裡出錯了呢?

PHP Warning: PHP Startup: Unable to load dynamic library 'openssl.dll' (tried: C:\xampp\php\ext\openssl.dll (?曆??唳?摰?璅∠???, C:\xampp\php\ext\php_openssl.dll.dll (?曆??唳?摰?璅∠???) in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'openssl.dll' (tried: C:\xampp\php\ext\openssl.dll (?曆??唳?摰?璅∠???, C:\xampp\php\ext\php_openssl.dll.dll (?曆??唳?摰?璅∠???) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'php_pdo_firebird.dll' (tried: C:\xampp\php\ext\php_pdo_firebird.dll (?曆??唳?摰?璅∠???, C:\xampp\php\ext\php_php_pdo_firebird.dll.dll (?曆??唳?摰?璅∠???) in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'php_pdo_firebird.dll' (tried: C:\xampp\php\ext\php_pdo_firebird.dll (?曆??唳?摰?璅∠???, C:\xampp\php\ext\php_php_pdo_firebird.dll.dll (?曆??唳?摰?璅∠???) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'php_pdo_oci.dll' (tried: C:\xampp\php\ext\php_pdo_oci.dll (?曆??唳?摰?璅∠???, C:\xampp\php\ext\php_php_pdo_oci.dll.dll (?曆??唳?摰?璅∠???) in Unknown on line
0

Warning: PHP Startup: Unable to load dynamic library 'php_pdo_oci.dll' (tried: C:\xampp\php\ext\php_pdo_oci.dll (?曆??唳?摰?璅∠???, C:\xampp\php\ext\php_php_pdo_oci.dll.dll (?曆??唳?摰?璅∠???) in Unknown on line 0
Could not open input file: hello_world.php

看更多先前的回應...收起先前的回應...
翗祤 iT邦新手 5 級 ‧ 2021-09-27 16:18:29 檢舉

ext的部分
; On windows:
extension_dir="C:\xampp\php\ext"

擴充的部分
extension=php_bz2.dll
extension=php_curl.dll
;extension=ffi.dll
;extension=ftp.dll
extension=php_fileinfo.dll
extension=php_gd2.dll
extension=php_gettext.dll
;extension=gmp.dll
;extension=intl.dll
;extension=imap.dll
;extension=ldap.dll
extension=php_mbstring.dll
extension=php_exif.dll ; Must be after mbstring as it depends on it
extension=php_mysqli.dll
;extension=oci8_12c.dll ; Use with Oracle Database 12c Instant Client
;extension=odbc.dll
extension=openssl.dll
extension=php_pdo_firebird.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
;extension=pgsql.dll
;extension=shmop.dll

miku3920 iT邦新手 2 級 ‧ 2021-09-27 16:36:26 檢舉

我猜你可能裝了兩個 PHP (XAMPP 和直接下載的),php --ini 這個指令可以看使用了哪個 php.ini

miku3920 iT邦新手 2 級 ‧ 2021-09-27 16:42:05 檢舉

試試看把 php_ 和 .dll 都去掉,像這樣: extension=php_curl.dll -> extension=curl

翗祤 iT邦新手 5 級 ‧ 2021-09-28 08:25:37 檢舉

https://ithelp.ithome.com.tw/upload/images/20210928/20141023cww5NDw7QC.jpg
我在該資料夾裡搜尋 php.ini 後出現這些檔案,我都只有修改第一個檔案裡的設定

使用 php --ini 指令的結果

Configuration File (php.ini) Path:
Loaded Configuration File: C:\xampp\php\php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)

翗祤 iT邦新手 5 級 ‧ 2021-09-28 08:27:25 檢舉

把 php 和 .dll 都去掉

這個剛剛試過不行,一樣會找不到/images/emoticon/emoticon02.gif

miku3920 iT邦新手 2 級 ‧ 2021-09-28 15:01:06 檢舉

應該是本身就沒有某幾個 dll 檔,你可以打開 ext 來看看

翗祤 iT邦新手 5 級 ‧ 2021-09-29 08:59:42 檢舉

https://ithelp.ithome.com.tw/upload/images/20210929/20141023sywjC55LRg.jpg
看起來是都存在

我要留言

立即登入留言