前言:
如果你開始使用Python做一些自動化,那你肯定會想要把自動化的結果直接送到手機上的IM軟體,例如 Line或Telegram。
本文以Telegram為例,以往傳送的很順暢的文字,卻在有一天發現,竟然遇到某些字元都會中斷、都會缺字。這該怎麼辦? 這邊就帶大家來排解一下這樣的問題。
以下整理本次文章會學到的東西
A. 了解Telegram APP 的背景
B. 學習在Python 呼叫 Telegram SendMessage API的方法
C. 知道什麼是URL編碼
D. 解決傳送字串給 Telegram SendMessage API 遇到特殊字元會發生缺字的問題。
背景探討:
關於 Telegram APP 是俄國的社群平台創辦人所無償經營的一個項目。先看一下維基百科說明
Telegram是跨平台的即時通訊軟體,其用戶端是自由及開放原始碼軟體,但伺服器是專有軟體。使用者可以相互交換加密與自毀訊息,傳送相片、影片等所有類型檔案。官方提供手機版、電腦版和網頁版等多種平台用戶端;同時官方開放應用程式介面,因此擁有許多第三方的用戶端可供選擇,其中多款內建中文。
俄羅斯的兄弟Pavel與Nikolai Durov創辦了Telegram。而哥哥Nikolai比Pavel年長4歲,而且還是一位「神童」!他不但3歲就會開始看書,而且還曾經贏得三屆的國際數學奧林匹亞金牌、兩屆的國際大學生程式設計競賽;有著非常驚人的經歷。
Pavel雖然在數學以及寫程式上沒有比哥哥出色,但是,他的個性叛逆,不喜歡服從權威。據說Pavel還在求學的時候,他就常常Hack進入學校網路。有一次,他還擅自修改學校電腦的登入畫面,將他最討厭老師的照片和「該死」兩個字並排。但這些樣的性格,讓Pavel成為一名出色的創業家。在22歲那年,Pavel就創辦了俄羅斯最大的社交網站VKontakte。而VKontakte堪稱是俄國的Facebook。
說穿了Telegram跟創辦人一樣支持開放自由與不好監管,因此這樣一個多元且開放的工具,很快就受到網友的喜歡,甚至社運人士的青睞。
Telegram Send Text Message API使用:
介紹完Telegram的背景以後,其實是要帶出這樣多元、且開放的工具概念,也讓它的Telegram bot很簡易且開放,甚至還有web版。簡單來說,只要一串URI,如下
https://api.telegram.org/bot122*:AAHiwlh8nnkMV5G2nsd7Yqxxxxxxxxxxxxx-4317*****&parse_mode=Markdown&text=’YourStringHere
貼上瀏覽器,就自動把字串送到Telegram APP的bot聊天群組內了。
在Python中,結合request模組,也可改寫成function,程式碼如下:
(文內token與id已使用****與xxxx掩蔽)
import requests
def telegram_bot_sendtext(bot_message):
bot_token = '122*******:AAHiwlh8nnkMV5G2nsd7Yqxxxxxxxxxxxxx'
bot_chatID = '-4317*****'
send_text = 'https://api.telegram.org/bot' + bot_token + '/sendMessage?chat_id=' + bot_chatID + '&parse_mode=Markdown&text=' + bot_message
response = requests.get(send_text)
return response.json()
message2 = telegram_bot_sendtext("YourStringHere")
了解缺字問題 及HTML URL編碼:
如前言所談,當你遇到了問題,發生缺字,第一個想的是看看從那些字開始缺。
本次遇到的問題 是爬文章標題的時候,每次遇到 “&”這個特殊符號,就會缺字。也就是遇到&這特殊符號的時候,這字元以後的字串全部不見。
根據剛剛所說的,在Python裡面是透過requests套件,發出一行uri的網址請求,所以這時候就不難猜測為什麼會缺字了,因為在URL中,字元會有不同的編碼,最常見的不外乎空白字元會變成 %20
HTML URL 編碼
本表參考取自: https://www.w3school.com.cn/tags/html_ref_urlencode.html
Python用Replace方法置換字元實作:
因此我們可以開始著手解決問題,先透過上表找到 & 對應的編碼為 %26
接著我們使用 Str.Replace(A , B) 來處理
ReplacedStr = OriginalStr.replace("&","%26")
關於 Python String Replace的具體語法如下
string.replace(oldvalue, newvalue, count)
就是把舊字元 換成 新字元 然後可算換幾次
若需要更詳細範例可以參考這裡
如此一來,每次要透過Request 來發送URL呼叫 Telegram Send Message API的時候,都先把要送的字串做個處理,把這些特別的字符,轉換成URL編碼,就不會再缺字了。
結論:
雖然只是遇到了一個缺字問題,但問題的背後只要用心往往可以找出相關的知識與學問。正面的來看,問題不虧是最好的老師。
Telegram 實在是非常好用且免費的工具,除了可以脫離監管,還有跨平台的多元優勢。所以更應該好好善加利用。本文透過置換特殊字元的URL編碼來解決缺字的問題。同時也學到了更多,不是嗎?
下次有機會再跟大家分享如何使用Python 來使用Telegram API 做出自己的Bot,讓你直接把想知道的訊息推播到自己的手機Telegram APP,即時掌握最新訊息。