您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
PushBullet API
此脚本不应直接安装,它是供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/418543/879740/PushBullet.js
// alexschneider/pushbullet-js: Client side javascript pushbullet // https://github.com/alexschneider/pushbullet-js window.PushBullet = (function () { var pb = {}; var pbURL = "https://api.pushbullet.com/v2/"; var pbPush = pbURL + "pushes"; var pbContact = pbURL + "contacts"; var pbDevice = pbURL + "devices"; var pbUser = pbURL + "users/me"; var pbUpReq = pbURL + "upload-request"; var httpReqDone = 4; var httpResGood = 200; var httpResNoCont = 204; pb.APIKey = null; pb.isGM = false; pb.push = function (pushType, devId, email, data, callback) { var parameters = { type: pushType.toLowerCase() }; if (email && devId) { var err = new Error("Cannot push to both device and contact"); if (callback) { return callback(err); } else { throw err; } } else if (email) { parameters.email = email; } else if (devId) { parameters.device_iden = devId; } switch (pushType.toLowerCase()) { case "note": parameters.title = data.title; parameters.body = data.body; break; case "link": parameters.title = data.title; parameters.url = data.url; if (data.body) { parameters.body = data.body; } break; case "address": parameters.name = data.name; parameters.address = data.address; break; case "list": parameters.title = data.title; parameters.items = data.items; break; default: var err = new Error("Invalid type"); if (callback) { return callback(err); } else { throw err; } break; } var res = ajaxReq(pbPush, "POST", parameters, false, callback); if (!callback) { return res; } }; pb.pushFile = function (devId, email, fileHandle, body, callback) { var type = "file_type=" + encodeURIComponent(fileHandle.type); var name = "file_name=" + encodeURIComponent(fileHandle.name); var upReqURL = pbUpReq + "?" + type + "&" + name; var upReqFunc = !callback ? null : function (err, res) { if (err) { return callback(err); } else { try { doPushFile(res, devId, email, fileHandle, body, callback); } catch (err2) { return callback(err2); } } }; var res = ajaxReq(upReqURL, "GET", null, false, upReqFunc); if (!callback) { return doPushFile(res, devId, email, fileHandle, body); } }; var doPushFile = function (ajax, devId, email, fileHandle, body, callback) { var fileInfo = new FormData(); fileInfo.append("awsaccesskeyid", ajax.data.awsaccesskeyid); fileInfo.append("acl", ajax.data.acl); fileInfo.append("key", ajax.data.key); fileInfo.append("signature", ajax.data.signature); fileInfo.append("policy", ajax.data.policy); fileInfo.append("content-type", fileHandle.type); fileInfo.append("file", fileHandle); ajaxReq(ajax.upload_url, "POST", fileInfo, true, null); var parameters = { file_name: fileHandle.name, file_type: fileHandle.type, file_url: ajax.file_url, type: "file", }; if (body) { parameters.body = body; } if (email && devId) { var err = new Error("Cannot push to both device and contact"); if (callback) { return callback(err); } else { throw err; } } else if (email) { parameters.email = email; } else if (devId) { parameters.device_iden = devId; } else { var err2 = new Error("Must push to either device or contact"); if (callback) { return callback(err2); } else { throw err2; } } var res = ajaxReq(pbPush, "POST", parameters, false, callback); if (!callback) { return res; } }; pb.deletePush = function (pushId, callback) { var res = ajaxReq(pbPush + "/" + pushId, "DELETE", null, false, callback); if (!callback) { return res; } }; pb.pushHistory = function (modifiedAfter, cursor, callback) { if (typeof modifiedAfter === "function") { callback = modifiedAfter; modifiedAfter = null; } else if (typeof cursor === "function") { callback = cursor; cursor = null; } var parameters = null; if (modifiedAfter) { parameters = { modified_after: modifiedAfter, }; } if (cursor) { parameters = parameters || {}; parameters.cursor = cursor; } var res = ajaxReq(pbPush, "GET", parameters, false, callback); if (!callback) { return res; } }; pb.devices = function (callback) { var res = ajaxReq(pbDevice, "GET", null, false, callback); if (!callback) { return res; } }; pb.deleteDevice = function (devId, callback) { var res = ajaxReq(pbDevice + "/" + devId, "DELETE", null, false, callback); if (!callback) { return res; } }; pb.contacts = function (callback) { var res = ajaxReq(pbContact, "GET", null, false, callback); if (!callback) { return res; } }; pb.deleteContact = function (contId, callback) { var res = ajaxReq(pbContact + "/" + contId, null, false, callback); if (!callback) { return res; } }; pb.user = function (callback) { var res = ajaxReq(pbUser, "GET", null, false, callback); if (!callback) { return res; } }; var ajaxReq = function (url, verb, parameters, fileUpload, callback) { if (!pb.APIKey) { var err = new Error("API Key for Pushbullet not set"); if (callback) { return callback(err); } else { throw err; } } if (verb === "GET") { var queryParams = []; for (var key in parameters) { queryParams.push(key + "=" + parameters[key]); } var queryString = queryParams.join("&"); url += "?" + queryString; parameters = null; } if (pb.isGM) { GM_xmlhttpRequest({ method: verb, data: JSON.stringify(parameters), url: url, headers: { "User-agent": window.navigator.userAgent, "Content-Type": "application/json", Authorization: "Basic " + window.btoa(pb.APIKey + ":"), }, onload: function (response) { if (callback) { callback(null, response); } }, }); } else { var ajax = new XMLHttpRequest(); var async = false; if (callback) { async = true; ajax.onreadystatechange = function () { if (ajax.readyState === httpReqDone) { var res = null; try { res = handleResponse(ajax); } catch (err) { return callback(err); } return callback(null, res); } }; } ajax.open(verb, url, async); if (!fileUpload) { ajax.setRequestHeader( "Authorization", "Basic " + window.btoa(pb.APIKey + ":") ); ajax.setRequestHeader("Content-Type", "application/json"); parameters = JSON.stringify(parameters); } if (parameters) { ajax.send(parameters); } else { ajax.send(); } if (!async) { return handleResponse(ajax); } } }; var handleResponse = function (ajax) { if (ajax.status !== httpResGood && ajax.status !== httpResNoCont) { throw new Error(ajax.status + ": " + ajax.response); } try { return JSON.parse(ajax.response); } catch (err) { return ajax.response; } }; return pb; })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址