終於來到本次 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 點都會執行一次此爬蟲程式.
沒有留言 :
張貼留言