PushBullet

PushBullet API

目前为 2020-12-12 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/418543/879740/PushBullet.js

  1. // alexschneider/pushbullet-js: Client side javascript pushbullet
  2. // https://github.com/alexschneider/pushbullet-js
  3.  
  4. window.PushBullet = (function () {
  5. var pb = {};
  6. var pbURL = "https://api.pushbullet.com/v2/";
  7. var pbPush = pbURL + "pushes";
  8. var pbContact = pbURL + "contacts";
  9. var pbDevice = pbURL + "devices";
  10. var pbUser = pbURL + "users/me";
  11. var pbUpReq = pbURL + "upload-request";
  12. var httpReqDone = 4;
  13. var httpResGood = 200;
  14. var httpResNoCont = 204;
  15.  
  16. pb.APIKey = null;
  17. pb.isGM = false;
  18.  
  19. pb.push = function (pushType, devId, email, data, callback) {
  20. var parameters = { type: pushType.toLowerCase() };
  21. if (email && devId) {
  22. var err = new Error("Cannot push to both device and contact");
  23. if (callback) {
  24. return callback(err);
  25. } else {
  26. throw err;
  27. }
  28. } else if (email) {
  29. parameters.email = email;
  30. } else if (devId) {
  31. parameters.device_iden = devId;
  32. }
  33. switch (pushType.toLowerCase()) {
  34. case "note":
  35. parameters.title = data.title;
  36. parameters.body = data.body;
  37. break;
  38. case "link":
  39. parameters.title = data.title;
  40. parameters.url = data.url;
  41. if (data.body) {
  42. parameters.body = data.body;
  43. }
  44. break;
  45. case "address":
  46. parameters.name = data.name;
  47. parameters.address = data.address;
  48. break;
  49. case "list":
  50. parameters.title = data.title;
  51. parameters.items = data.items;
  52. break;
  53. default:
  54. var err = new Error("Invalid type");
  55. if (callback) {
  56. return callback(err);
  57. } else {
  58. throw err;
  59. }
  60. break;
  61. }
  62. var res = ajaxReq(pbPush, "POST", parameters, false, callback);
  63. if (!callback) {
  64. return res;
  65. }
  66. };
  67.  
  68. pb.pushFile = function (devId, email, fileHandle, body, callback) {
  69. var type = "file_type=" + encodeURIComponent(fileHandle.type);
  70. var name = "file_name=" + encodeURIComponent(fileHandle.name);
  71. var upReqURL = pbUpReq + "?" + type + "&" + name;
  72. var upReqFunc = !callback
  73. ? null
  74. : function (err, res) {
  75. if (err) {
  76. return callback(err);
  77. } else {
  78. try {
  79. doPushFile(res, devId, email, fileHandle, body, callback);
  80. } catch (err2) {
  81. return callback(err2);
  82. }
  83. }
  84. };
  85. var res = ajaxReq(upReqURL, "GET", null, false, upReqFunc);
  86. if (!callback) {
  87. return doPushFile(res, devId, email, fileHandle, body);
  88. }
  89. };
  90.  
  91. var doPushFile = function (ajax, devId, email, fileHandle, body, callback) {
  92. var fileInfo = new FormData();
  93. fileInfo.append("awsaccesskeyid", ajax.data.awsaccesskeyid);
  94. fileInfo.append("acl", ajax.data.acl);
  95. fileInfo.append("key", ajax.data.key);
  96. fileInfo.append("signature", ajax.data.signature);
  97. fileInfo.append("policy", ajax.data.policy);
  98. fileInfo.append("content-type", fileHandle.type);
  99. fileInfo.append("file", fileHandle);
  100. ajaxReq(ajax.upload_url, "POST", fileInfo, true, null);
  101. var parameters = {
  102. file_name: fileHandle.name,
  103. file_type: fileHandle.type,
  104. file_url: ajax.file_url,
  105. type: "file",
  106. };
  107. if (body) {
  108. parameters.body = body;
  109. }
  110.  
  111. if (email && devId) {
  112. var err = new Error("Cannot push to both device and contact");
  113. if (callback) {
  114. return callback(err);
  115. } else {
  116. throw err;
  117. }
  118. } else if (email) {
  119. parameters.email = email;
  120. } else if (devId) {
  121. parameters.device_iden = devId;
  122. } else {
  123. var err2 = new Error("Must push to either device or contact");
  124. if (callback) {
  125. return callback(err2);
  126. } else {
  127. throw err2;
  128. }
  129. }
  130. var res = ajaxReq(pbPush, "POST", parameters, false, callback);
  131. if (!callback) {
  132. return res;
  133. }
  134. };
  135.  
  136. pb.deletePush = function (pushId, callback) {
  137. var res = ajaxReq(pbPush + "/" + pushId, "DELETE", null, false, callback);
  138. if (!callback) {
  139. return res;
  140. }
  141. };
  142.  
  143. pb.pushHistory = function (modifiedAfter, cursor, callback) {
  144. if (typeof modifiedAfter === "function") {
  145. callback = modifiedAfter;
  146. modifiedAfter = null;
  147. } else if (typeof cursor === "function") {
  148. callback = cursor;
  149. cursor = null;
  150. }
  151. var parameters = null;
  152. if (modifiedAfter) {
  153. parameters = {
  154. modified_after: modifiedAfter,
  155. };
  156. }
  157. if (cursor) {
  158. parameters = parameters || {};
  159. parameters.cursor = cursor;
  160. }
  161. var res = ajaxReq(pbPush, "GET", parameters, false, callback);
  162. if (!callback) {
  163. return res;
  164. }
  165. };
  166.  
  167. pb.devices = function (callback) {
  168. var res = ajaxReq(pbDevice, "GET", null, false, callback);
  169. if (!callback) {
  170. return res;
  171. }
  172. };
  173.  
  174. pb.deleteDevice = function (devId, callback) {
  175. var res = ajaxReq(pbDevice + "/" + devId, "DELETE", null, false, callback);
  176. if (!callback) {
  177. return res;
  178. }
  179. };
  180.  
  181. pb.contacts = function (callback) {
  182. var res = ajaxReq(pbContact, "GET", null, false, callback);
  183. if (!callback) {
  184. return res;
  185. }
  186. };
  187.  
  188. pb.deleteContact = function (contId, callback) {
  189. var res = ajaxReq(pbContact + "/" + contId, null, false, callback);
  190. if (!callback) {
  191. return res;
  192. }
  193. };
  194.  
  195. pb.user = function (callback) {
  196. var res = ajaxReq(pbUser, "GET", null, false, callback);
  197. if (!callback) {
  198. return res;
  199. }
  200. };
  201.  
  202. var ajaxReq = function (url, verb, parameters, fileUpload, callback) {
  203. if (!pb.APIKey) {
  204. var err = new Error("API Key for Pushbullet not set");
  205. if (callback) {
  206. return callback(err);
  207. } else {
  208. throw err;
  209. }
  210. }
  211. if (verb === "GET") {
  212. var queryParams = [];
  213. for (var key in parameters) {
  214. queryParams.push(key + "=" + parameters[key]);
  215. }
  216. var queryString = queryParams.join("&");
  217. url += "?" + queryString;
  218. parameters = null;
  219. }
  220. if (pb.isGM) {
  221. GM_xmlhttpRequest({
  222. method: verb,
  223. data: JSON.stringify(parameters),
  224. url: url,
  225. headers: {
  226. "User-agent": window.navigator.userAgent,
  227. "Content-Type": "application/json",
  228. Authorization: "Basic " + window.btoa(pb.APIKey + ":"),
  229. },
  230. onload: function (response) {
  231. if (callback) {
  232. callback(null, response);
  233. }
  234. },
  235. });
  236. } else {
  237. var ajax = new XMLHttpRequest();
  238. var async = false;
  239. if (callback) {
  240. async = true;
  241. ajax.onreadystatechange = function () {
  242. if (ajax.readyState === httpReqDone) {
  243. var res = null;
  244. try {
  245. res = handleResponse(ajax);
  246. } catch (err) {
  247. return callback(err);
  248. }
  249. return callback(null, res);
  250. }
  251. };
  252. }
  253. ajax.open(verb, url, async);
  254. if (!fileUpload) {
  255. ajax.setRequestHeader(
  256. "Authorization",
  257. "Basic " + window.btoa(pb.APIKey + ":")
  258. );
  259. ajax.setRequestHeader("Content-Type", "application/json");
  260. parameters = JSON.stringify(parameters);
  261. }
  262. if (parameters) {
  263. ajax.send(parameters);
  264. } else {
  265. ajax.send();
  266. }
  267.  
  268. if (!async) {
  269. return handleResponse(ajax);
  270. }
  271. }
  272. };
  273.  
  274. var handleResponse = function (ajax) {
  275. if (ajax.status !== httpResGood && ajax.status !== httpResNoCont) {
  276. throw new Error(ajax.status + ": " + ajax.response);
  277. }
  278. try {
  279. return JSON.parse(ajax.response);
  280. } catch (err) {
  281. return ajax.response;
  282. }
  283. };
  284.  
  285. return pb;
  286. })();