const dateFormat = require('dateformat'); const Tools_MYSQLDBClass = require('../line-cost-js/Tools_MYSQLDBClass'); const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; /** LINENotify */ class LINENotifyClass { constructor() { this.Tools_MYSQLDB = new Tools_MYSQLDBClass(); } async LINENotify_Receive(data) { let postdata = { 'grant_type': 'authorization_code', 'code': data.code, 'redirect_uri': process.env.LINENotify_redirect_uri, 'client_id': process.env.LINENotify_client_id, 'client_secret': process.env.LINENotify_client_secret }; let Response = await this.Get_token(postdata); let Responsedata = JSON.parse(Response); if (Responsedata.status === 200) { let access_token = Responsedata.access_token; let datetime = dateFormat(new Date(), "yyyy-mm-dd HH:MM:ss"); let state = data.state.split("$"); let userId = state[0]; let displayName = state[1]; let Query = `INSERT INTO \`UserData\` (UserData.datetime, UserData.userId, UserData.displayName, UserData.LINENotify) VALUES ('${datetime}', '${userId}', '${displayName}', '${access_token}') ON DUPLICATE KEY UPDATE UserData.LINENotify = '${access_token}';`; await this.Tools_MYSQLDB.Query(Query); let message = "\\n阿巴阿巴"; this.Send(access_token, message) return new Promise((resolve, reject) => { // 傳入 resolve 與 reject,表示資料成功與失敗 // resolve("連接已經完成"); let html = `

連接已經完成

`; resolve(html); }); } else { return new Promise((resolve, reject) => { // 傳入 resolve 與 reject,表示資料成功與失敗 resolve("連接失敗"); }); } } /** * 取得表 * @param Url Url * @param arrange 是否需要整理 */ GetData(Url) { return new Promise((resolve, reject) => { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 400) { var response = xhr.responseText; resolve(response); } } }; xhr.open("GET", Url, true); xhr.send(); }); } /** * 取得表 * @param Url Url * @param data data */ PostData(Url, data) { return new Promise((resolve, reject) => { var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 400) { var response = xhr.responseText; resolve(response); } } }; xhr.open("Post", Url); // xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader("requestverificationtoken", "aA2VWAXiewD1fyMrVhoSmdZAOhNa5YYPdnBxyLU-MlbWdnLHNKtMOkF1xtcZN3KCLW3RrFYLRCPm0DtgZW8sBIQXzxA1:wSKMTfFjGh65R1J0CDU_e91xfxHoqFwPomyXUVEz6Lm3itbHmDMjj11vCCoU4FD-QZjd690_4GD79luvLDTrb6aEFeU1"); let encodedData = this.encodeFormData(data); xhr.send(encodedData); }); } /** * Get_token * @param data data */ Get_token(data) { return new Promise((resolve, reject) => { let url = 'https://notify-bot.line.me/oauth/token'; var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 400) { var response = xhr.responseText; resolve(response); } } }; xhr.open("Post", url); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); let encodedData = this.encodeFormData(data); xhr.send(encodedData); }); } /** * Send * @param data data */ Send(access_token, data) { return new Promise((resolve, reject) => { let url = 'https://notify-api.line.me/api/notify'; var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 400) { var response = xhr.responseText; resolve(response); } } }; // let encodedData = this.encodeFormData(data); let newline = encodeURI("\\n"); let encodedData = "%0D%0A" + encodeURI(data).replace(newline, "%0D%0A"); xhr.open("POST", `${url}?message=${encodedData}`); access_token = access_token ? access_token : "S32BS5DulNLWFjlp1if24yn2SXMaEGyzmSRl75kfCXv"; xhr.setRequestHeader("Authorization", `Bearer ${access_token}`); xhr.send(); }); } encodeFormData(data) { if (!data) return ""; // Always return a string var pairs = []; // To hold name=value pairs for (var name in data) { // For each name if (!data.hasOwnProperty(name)) continue; // Skip inherited if (typeof data[name] === "function") continue; // Skip methods var value = data[name].toString(); // Value as string name = encodeURIComponent(name.replace(" ", "+")); // Encode name value = encodeURIComponent(value.replace(" ", "+")); // Encode value pairs.push(name + "=" + value); // Remember name=value pair } return pairs.join('&'); // Return joined pairs separated with & } } module.exports = LINENotifyClass