iT邦幫忙

2021 iThome 鐵人賽

DAY 30
0
Software Development

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

【PHP Telegram Bot】Day30 - 社群按讚機器人(2):將按鈕設成單選並且計數

https://ithelp.ithome.com.tw/upload/images/20211009/20132916Ylrq3V0wWd.png

陣列的特性

還記得陣列怎麼賦值嗎,Day15 - 基礎(4):陣列處理、JSON

我們先來複習一下,我把 a, b, c 三個鍵分別設定成 air, bag, cat

$array = [];
$array['a'] = 'air';
$array['b'] = 'bag';
$array['c'] = 'cat';
print_r($array);
// [a] => air
// [b] => bag
// [c] => cat

然後我再把 a 設定成 apple,air 就自動消失了

$array['a'] = 'apple';
print_r($array);
// [a] => apple
// [b] => bag
// [c] => cat

你應該想到了吧,如果把人當成鍵、選擇的選項當成值的話

$array = [
    // 人 => 選項
];
$array['阿明'] = 'a';
$array['小美'] = 'b';
$array['昊昊'] = 'c';
print_r($array);
// [阿明] => a
// [小美] => b
// [昊昊] => c

昊昊改成選擇 a,完全不需要做新增移除的動作,直接賦值就行了

$array['昊昊'] = 'a';
print_r($array);
// [阿明] => a
// [小美] => b
// [昊昊] => a

如果反過來選項當成鍵、人當成值的話就會變成二維陣列,而且還要做新增移除,明顯麻煩了許多


處理按鈕事件

先來執行程式看看按鈕會回傳什麼,方便用來找值在陣列的哪裡
https://ithelp.ithome.com.tw/upload/images/20211009/201329165fyXUPFQgT.png
來到 processCallbackQuery(),將 $msg_id $chat_id $user_id 找出來,還有加上三個 if 來處理 data
https://ithelp.ithome.com.tw/upload/images/20211009/20132916xT7KF3mMBY.png
接著就是用剛剛學到的陣列特性,$path 則是決定資料要放的地方,因為會有很多個頻道,頻道裡又有很多則訊息,所以就用了 $chat_id$msg_id 當作路徑和檔名
https://ithelp.ithome.com.tw/upload/images/20211009/20132916VYOhSAfqoU.png
突然覺得同樣的東西要寫三遍,這樣不太對,我可是超懶的,怎麼可以寫三遍呢,所以這邊要改一下,把 callback_data 前面加上 channel_post
https://ithelp.ithome.com.tw/upload/images/20211009/20132916A0xRJSBZ5g.png
之後這邊改一下,噹啷~變成只剩一個 if
https://ithelp.ithome.com.tw/upload/images/20211009/20132916Z6SvC8669k.png


儲存資料

如果檔案已經存在的話,就把檔案讀取出來,然後用陣列的特性修改資料,最後再存回去,不然的話就新增一個陣列還有存進一個新檔案

至於為何選擇用 fopen,這是因為如果有兩個人同時按了按鈕,此時有可能會只存到一個人的資料,導致另一個人按了按鈕結果資料被吃掉,詳細情況可以複習一下這篇文章 Day16 - 基礎(5):檔案讀取與寫入、cURL
https://ithelp.ithome.com.tw/upload/images/20211009/20132916olxQxErYjq.png


計算按讚數量

接著要來計算同一個選項總共被選擇了幾次,先將初始值設成 0,然後用 foreach 把陣列裡的值一個個拿出來看,如果符合條件就 +1,沒有的話就加 +0,這邊是利用了 PHP 自動轉型的特性

最後用三元運算子整理一下,如果次數是 0 就改成空字串,不然就是在前面加一個空白
https://ithelp.ithome.com.tw/upload/images/20211009/20132916WTxPJTEOmV.png


更新按鈕

別忘了更新按鈕的文字,把剛剛計算的數字加上去
https://ithelp.ithome.com.tw/upload/images/20211009/201329166ijihVK6wt.png
這樣就完成啦,計得重新執行程式後要重發一則訊息,因為我們把 callback_data 改了嘛
https://ithelp.ithome.com.tw/upload/images/20211009/20132916HOGkUIiL8g.png
最後的最後再考考你,如果要能夠收回的話應該怎麼做呢?


完賽灑花

辛苦又充實的 30 天終於結束啦,我已經等不急每天看動畫看到爽了,借的書也是一整個月都沒時間翻開,終於能回到我優閒慢活的人生,真是感動

最後來套句六角學院的老話,如果做不出來的話「可以參考答案」:
https://github.com/miku3920/ironman2021_by_miku3920_bot

這隻機器人我已經放上伺服器 24 小時運行中,歡迎拿來使用看看,如果還有想加的功能也歡迎發 PR 或 issue


上一篇
【PHP Telegram Bot】Day29 - 社群按讚機器人(1):讓頻道出現按讚按鈕
系列文
用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!30

1 則留言

0
Shiva虛碼
iT邦新手 4 級 ‧ 2021-10-15 22:08:09

恭禧完賽~/images/emoticon/emoticon42.gif

miku3920 iT邦新手 4 級 ‧ 2021-10-16 14:25:43 檢舉

感謝~

我要留言

立即登入留言