2025年4月18日 星期五

Python 學習筆記 : 用 Telegram 傳送高科大借書與預約訊息

終於來到本次 Telgram Bot API 測試最後一站 : 修復母校高科大圖書館的借書與預約爬蟲, 這與市圖網站一樣使用了 Selenium 來模擬真人操作網頁, 原爬蟲程式參考 : 


關於 Telgram Bot API 用法參考下面的索引 : 


本篇旨在將爬取借書與預約情況之結果從原先推播到 LINE 改成推播到 Telegram, 改版後的程式碼如下 :

# nkust_lib_7.py
from selenium import webdriver   
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time
import requests
from datetime import datetime
import asyncio
from telegram import Bot

async def telegram_send_text(text):
    bot=Bot(token=token)
    try:
        await bot.send_message(
            chat_id=chat_id,
            text=text
            )
        return True
    except Exception as e:
        print(f'Error sending text: {e}')
        return False

def get_nkust_lib():
    try:
        options=Options()
        options.add_argument("--headless")
        driverpath='/usr/lib/chromium-browser/chromedriver'
        service=Service(driverpath)
        browser=webdriver.Chrome(options=options, service=service)
        browser.implicitly_wait(60)
        browser.maximize_window()
        url='https://nkust.primo.exlibrisgroup.com/discovery/login?'  +\
            'vid=886NKUST_INST:86NKUST&lang=zh-tw'   
        browser.get(url)
        # 按其他讀者
        md_list=browser.find_elements(By.TAG_NAME, 'md-list-item')
        md_list[1].click()
        print('按其他讀者 ... OK')
        # 登入系統
        login_user_name=browser.find_element(By.ID, 'LoginUserName')   
        login_user_name.send_keys('借書證帳號')  
        login_password=browser.find_element(By.ID, 'LoginPassword')   
        login_password.send_keys('借書證密碼')
        login_btn=browser.find_element(By.CLASS_NAME, 'button-large')
        login_btn.click()
        print('登入系統 ... OK')
        # 按名字顯現選單
        user_btn=browser.find_element(By.CLASS_NAME, 'user-button')
        actions=ActionChains(browser)
        actions.move_to_element(user_btn)
        actions.click(user_btn)
        actions.perform()
        print('按名字顯現選單 ... OK')
        # 按我的借閱鈕
        xpath='/html/body/div[3]/md-menu-content/md-menu-item[3]/button'    
        my_borrow=browser.find_element(By.XPATH, xpath)   
        actions.move_to_element(my_borrow)
        actions.click(my_borrow)
        actions.perform()
        print('按我的借閱 ... OK')
        # 按全部續借
        xpath='/html/body/primo-explore/div/prm-account/md-content' +\
              '/div[2]/prm-account-overview/md-content/md-tabs/' +\
              'md-tabs-content-wrapper/md-tab-content[2]/div/' +\
              'div/prm-loans/div[1]/div[2]/div[2]/button'
        all_borrow=browser.find_element(By.XPATH, xpath)
        actions.move_to_element(all_borrow)
        actions.click(all_borrow)
        actions.perform()
        print('按全部續借 ... OK')
        # 檢查續借結果
        xpath='/html/body/primo-explore/div/prm-account/md-content' +\
              '/div[2]/prm-account-overview/md-content/md-tabs' +\
              '/md-tabs-content-wrapper/md-tab-content[2]/div/div' +\
              '/prm-loans/div[2]/prm-alert-bar/div/div/span'
        alert_span=browser.find_element(By.XPATH, xpath)
        if '所有借閱資料已成功續借' in alert_span.text:
            msg='❖ 所有借閱資料已成功續借'
        else:
            msg='❖ 只有部分借閱資料已成功續借'
            # 檢查是否有 "載入更多結果" 按鈕
            for i in range(3): # 最多 3 頁
                load_more=browser.find_elements('class name','button-confirm')
                if len(load_more)==0: # 最後一頁
                    break
                else:
                    load_more[0].click() # 按 "載入更多結果" 至下一頁
            # 找尋借閱書籍
            a_links=browser.find_elements(By.TAG_NAME, 'a')
            last_book=a_links[-1].text
            msg += '\n' + '❶ ' + last_book
    except Exception as e:
        print(e)
    finally:
        browser.close()
        return msg

if __name__ == '__main__':
    start=time.time()
    msg=get_nkust_lib()
    token='Telegram 權杖'
    chat_id='聊天室識別碼'  
    if msg:
        now=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        msg='\n' + now + '\n' + msg
        if asyncio.run(telegram_send_text(msg)):
            print('訊息傳送成功!')
        else:
            print('訊息傳送失敗!')
    print(msg)
    end=time.time()
    print(f'執行時間:{end-start}')

注意, 程式中黃底色部分須填入自己的資訊.  

此爬蟲原本佈署在 Mapleboard 上, 但今天不知為何遠端連不上, 所以改為佈署在高雄家的 Pi 3 上, 用 RealVNC Connect 傳送檔案到 Pi 3 後修改檔案屬性為可執行 (x) : 

pi@raspberrypi:~ $ sudo chmod +x /home/pi/nkust_lib_7.py    
pi@raspberrypi:~ $ python3 nkust_lib_7.py   
按其他讀者 ... OK
登入系統 ... OK
按名字顯現選單 ... OK
按我的借閱 ... OK
按全部續借 ... OK
訊息傳送成功!

2025-04-18 17:06:20
❖ 只有部分借閱資料已成功續借
❶ 剛剛好的Canva設計教本 / 施威銘研究室, 張宣婕(Annie)作
執行時間:131.09837126731873

可見程式可順利執行, 檢查 Telegram App 有收到該則訊息 : 




最後修改 crontab 增加執行此程式 : 

pi@raspberrypi:~ $ crontab -e     
crontab: installing new crontab
pi@raspberrypi:~ $ crontab -l     
0 16 * * 1-5 /usr/bin/python3 /home/pi/twstock_dashboard_update.py
*/31 9-13 * * 1-5 /usr/bin/python3 /home/pi/yahoo_twstock_monitor_table_2.py
0 8,18 * * * /usr/bin/python3 /home/pi/btc_eth_prices_line_notify.py
1 12,17 * * * /usr/bin/python3 /home/pi/technews_3.py
0 9 * * * /usr/bin/python3 /home/pi/books.com.tw_66_telegram.py
0 13,18 * * * /usr/bin/python3 /home/pi/ksml_books_9_deploy.py
0 6,16 * * * /usr/bin/python3 /home/pi/nkust_lib_7.py

每天早上 6 點與下午 4 點都會執行一次此爬蟲程式. 

沒有留言 :