iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 22
0
Modern Web

Chrome extension 學習手札系列 第 22

Chrome extension 學習手札 22 - 腳本實作 - 臺鐵時刻表查詢系統 - part 5

  • 分享至 

  • xImage
  •  

今天,應該是會完成整個查詢功能了,只剩後台管理的部分,再串接一下內容腳本就好囉

原本整理出來的資料格式

store/train.json

{
  "train-list": [
    {
      "id": "0900",
      "name": "基隆"
    },
    {
      "id": "0930",
      "name": "七堵"
    },
    {
      "id": "0980",
      "name": "南港"
    },
    {
      "id": "0990",
      "name": "松山"
    },
    {
      "id": "1000",
      "name": "臺北"
    },
    {
      "id": "1010",
      "name": "萬華"
    }...
  ]
}

因為這次的資料是唯讀的,也不是什麼需要管理的資料,所以我直接使用fetch與json檔案就好了

baground/bg.js

class TrainManager {

    constructor() {
        this.trainList = []
        this.action = null // time or station or trainno
        this.actionData = {} // content script data
        this.fetchTraniList()
    }
    
    //從json取得車站清單
    fetchTraniList() {
        fetch('./store/train.json')
            .then(res => {
                return res.json()
            })
            .then(data => {
                this.trainList = data['train-list']
            })
    }
}

//用var而非const是因為要讓浮動頁面可以直接chrome.runtime.getBackground存取
var trainManager = new TrainManager()

然後把昨天呼叫後台的三支函數都完成

background/bg.js

searchByTime(params) {
    //將參數存入變數
    this.action = 'time'
    this.actionData = {
        startStation: params.startStation, //開始時間
        endStation: params.endStation, //結束時間
        rideDate: params.rideDate, //查詢日期
        timeType: params.timeType, //時間類型
        startTime: params.startTime, //開始時間
        endTime: params.endTime, //結束時間
        trainNo: params.trainNo, //列車編號
        isTransfer: params.isTransfer, //接受轉乘
        checkType: params.checkType //對號
    }
    //開啟新頁面
    chrome.tabs.create(
        {
        url:'https://tip.railway.gov.tw/tra-tip-web/tip/tip001/tip112/gobytime'
    })
}

searchByStation(params) {
    //將參數存入變數
    this.action = 'station'
    this.actionData = {
        rideDate: params.rideDate,
        singleStation: params.singleStation
    }
    //開啟新頁面
    chrome.tabs.create({
        url:'https://tip.railway.gov.tw/tra-tip-web/tip/tip001/tip112/gobystation'
    })
}

searchByTrainNo(params) {
    //將參數存入變數
    this.action = 'trainno'
    this.actionData = {
        rideDate: params.rideDate,
        trainNo: params.trainNo
    }
    //開啟新頁面
    chrome.tabs.create({
        url:'https://tip.railway.gov.tw/tra-tip-web/tip/tip001/tip112/gobytrainno'
    })
}

接下來就是要到內容腳本,讓開啟的頁面可以取得送入後台的資料
因為目前只有一隻函式使用,而且資料格式已經在後台都轉好了,所以三個sendMessage都呼叫同樣函式即可

content_script/serachTrain.js

switch (location.pathname) {
    case '/tra-tip-web/tip/tip001/tip112/gobytime':
        chrome.runtime.sendMessage({ func: 'getSearch' }, runTrainByTime)
        break
    case '/tra-tip-web/tip/tip001/tip112/gobystation':
        chrome.runtime.sendMessage({ func: 'getSearch' }, runTrainByStation)
        break
    case '/tra-tip-web/tip/tip001/tip112/gobytrainno':
        chrome.runtime.sendMessage({ func: 'getSearch' }, runTrainByTrainno)
}

然後後台腳本的接收端這樣處理,一樣因為只有一個函式所以沒有解析request,
而且因為chrome.runtime.onMessage.addListener的作用域在class之外,所以必須使用變數才能取得actionData

class TrainManager {
    constructor() {
    ...
    ...
    chrome.runtime.onMessage.addListener(this.msgListener)
    ...
    ...
    }
    
    msgListener(request, sender, sendResponse){
        sendResponse(trainManager.actionData)
    }
}

var trainManager = new TrainManager

接下來再回到內容腳本接收資料並且丟到dom裡面,用一個舉例就好了

function runTrainByTime(res) {
    //起站
    document.getElementById('startStation').value = res.startStation
    //迄站
    document.getElementById('endStation').value = res.endStation
    //轉乘條件 點選 => 接受轉乘
    if (res.isTransfer)
        document.querySelector('.zone.form-horizontal #option2').click()
    else 
        document.querySelector('.zone.form-horizontal #option1').click()

    //日期
    document.getElementById('rideDate').value = res.rideDate.replace(/-/g,'/')
    //開始時間
    document.getElementById('startTime').value = '06:00'
    //結束時間
    document.getElementById('endTime').value = '23:00'
    //查詢出發時間/抵達時間
    if(res.timeType === 'departure')
        document.getElementById('startOrEndTime1').click()
    else
        document.getElementById('startOrEndTime2').click()
    // 車種
    if(res.checkType === 'all'){
        document.getElementById('trainTypeList1').click()
    }else if(res.checkType === 'checkmark'){
        document.getElementById('trainTypeList2').click()
    }else{
        document.getElementById('trainTypeList3').click()
    }
    //送出
    document.querySelector('input[type="submit"]').click()
}

就完成囉!接下來只要打開視窗,然後...

登登,然後就完成查詢囉!

那我們明天再繼續八!


上一篇
Chrome extension 學習手札 21 - 腳本實作 - 臺鐵時刻表查詢系統 - part 4
下一篇
Chrome extension 學習手札 23 - 腳本實作 - 臺鐵時刻表查詢系統 - 整理優化
系列文
Chrome extension 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言