複製程式碼
修改 API_TOKEN
把這邊的 token 換成你自己的
如果忘記的話可以看看 Day04 - Telegram 機器人的設定 有說在哪可以查看
把底下註解掉
這坨東東暫時用不到,先註解掉(選起來按 Ctrl + /
),或是你想刪掉也可以
在 146 行按 Enter 就會多出空白行,然後剛好 142 行就是 apiRequest
,直接複製到 146 行來改,跟 Day03 時一樣,把你的 uid 還有你想發送的訊息填進去,忘記 uid 的話可以透過 @userinfobot 取得
按下右上角的執行程式按紐
之後你就會發現噴出一坨錯誤XD
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
設定啟用後,才可以使用
看不到副檔名的話,到上方 檢視
的右邊有個 副檔名
,打勾就行了
打開在 Day06 時安裝 php 的資料夾,可以發現裡面是沒有 php.ini
檔案的,但是有兩個跟他很像的 php.ini-development
php.ini-production
,這兩個檔案最主要的差別在於 development
版顯示的錯誤會比較多
我們把 php.ini-development
複製一份,並且重新命名成 php.ini
點兩下開啟之後,找到 extension=curl
(建議用 Ctrl + f
搜尋),把左邊的分號 ;
刪掉,這樣就啟用 curl
了,記得儲存檔案
我們再回來執行一次程式,結果噴出更大一坨的錯誤!
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
搜尋),然後把左邊的分號 ;
刪掉,按一下儲存
我們再再回來執行一次程式,錯誤明顯變小一坨了很多(欸不是,還是不能執行啊
Curl returned error 60: SSL certificate problem: self signed certificate in certificate chain
這邊是因為缺少了一個叫做 cacert.pem
的檔案
那這個檔案要去哪裡找呢?其實丟到 google 第一個搜尋結果就是了
答案就在 curl 官網:https://curl.se/docs/caextract.html
點這裡下載
下載下來之後貼到 php-7.4.23/extras/ssl
這個資料夾裡
然後又又要再設定一次 php.ini
(相信我這是最後一次)
找出 curl.cainfo
(建議用 Ctrl + f
搜尋),再次把左邊的分號 ;
刪掉,然後把剛剛的完整路徑貼上,記得儲存~
再次挑戰執行程式!
這次什麼都沒出現,但是 TG 「叮咚」了一聲
恭喜你成功用 PHP 發送訊息啦~
要改成 POST 很簡單,只要將 apiRequest
改成 apiRequestJson
就行啦
按下執行,又「叮咚」了一聲~
接收訊息要用到 getUpdates 這個 API Method
我們可以看到這個方法(Method)的參數(Parameter)全都是選填(Optional),這表示我們可以完全不填參數
把 sendMessage
方法改成 getUpdates
,還有把 array()
裡的參數全刪除
然後還要再加上 print_r()
這個函式,因為要把 apiRequest
函式的返回值(TG 伺服器的回應(response))印出來,這樣你才看的到。
至於為何不使用 echo
呢?這個就留給你自己試試
按下執行後你可能會發現什麼都沒有,只有出現 Array()
,那是因為你的機器人 24 小時內沒收到過任何訊息
你只要先發訊息再執行程式就行了
現在你就能看到剛剛發給機器人的訊息了
最後的最後,來考考你要怎麼把它改成 POST,在底下留言你的答案吧!
您好,想請教一下,我有設定好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
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
我猜你可能裝了兩個 PHP (XAMPP 和直接下載的),php --ini
這個指令可以看使用了哪個 php.ini
試試看把 php_ 和 .dll 都去掉,像這樣: extension=php_curl.dll
-> extension=curl
我在該資料夾裡搜尋 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)
把 php 和 .dll 都去掉
這個剛剛試過不行,一樣會找不到
應該是本身就沒有某幾個 dll 檔,你可以打開 ext 來看看
看起來是都存在