hexo-smms.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * This file is part of HexoEditor.
  3. *
  4. * Copyright (c) 2018 zhuzhuyule
  5. *
  6. */
  7. var smms = (function () {
  8. const log = log4js.getLogger('hexo-smms.js');
  9. const path = require('path');
  10. const fs = require('fs');
  11. const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36';
  12. class Smms {
  13. constructor() {
  14. this.__ = require('lodash');
  15. this.FormData = require('form-data');
  16. this.request = require('request');
  17. }
  18. clear() {
  19. this.request({
  20. url: 'https://sm.ms/clear/',
  21. method: 'GET',
  22. headers: {'user-agent': userAgent}
  23. })
  24. }
  25. del(fileHash) {
  26. this.request({
  27. url: 'https://sm.ms/delete/' + fileHash,
  28. method: 'GET',
  29. headers: {'user-agent': userAgent}
  30. }, (error, res, body) => {
  31. var content = body;
  32. if (content) {
  33. content = content.match(/<div class="container"><div[^>]*>([^<]*)</)
  34. if (content != null){
  35. log.info(`[${fileHash}]:`+content[1])
  36. content = fileHash + ' : ' + content[1];
  37. }
  38. }
  39. })
  40. }
  41. getList(callback) {
  42. this.request({
  43. url: "https://sm.ms/api/list",
  44. method: 'GET',
  45. headers: {'user-agent': userAgent}
  46. }, (error, res, body) => {
  47. if (typeof callback === "function") {
  48. if (res.statusCode == 200)
  49. callback({
  50. statusCode: res.statusCode,
  51. data: (typeof(body) == 'string') ? JSON.parse(body) : body
  52. });
  53. else {
  54. console.log(body)
  55. }
  56. }
  57. })
  58. }
  59. /**
  60. * 生成File对象
  61. * @param filename
  62. * @param serverName
  63. * @returns {FormData}
  64. */
  65. getFormData(filename, serverName) {
  66. let buffer = fs.readFileSync(filename);
  67. let type = path.extname(filename)
  68. type = (type && type.slice(1)) || 'jpg';
  69. let form = new this.FormData();
  70. form.append('smfile', buffer, {
  71. filename: serverName || path.basename(filename),
  72. contentType: 'image/' + type
  73. });
  74. return form;
  75. }
  76. /**
  77. * 上传文件
  78. * @param localFile //本地文件
  79. * @param serverFileName //服务器文件名称
  80. * @param callback callback(response) //回调函数
  81. * response = {
  82. * id: 'localFileAbsolutePath', //传入文件本地绝对路径
  83. * statusCode: 200|int, //服务器代码,200:正常,其他:报错
  84. * data: {
  85. * localname: 'abc.png', //本地文件名
  86. * storename: '5a6bea876702d.png', //服务器文件名,SM.MS随机生成
  87. * path: '/abc/abc/5a6bea876702d.png', //服务器路径
  88. * url: 'https://...../abc/abc/5a6bea876702d.png', //图片地址
  89. * hash: 'sd8fsd8766d90sdf9' //删除hash
  90. * },
  91. * msg: 'error message' //一般只有报错才使用到
  92. * }
  93. */
  94. uploadFile(localFile, serverFileName, callback) {
  95. var formData = this.getFormData(localFile, serverFileName);
  96. var request = this.request({
  97. url: "https://sm.ms/api/upload",
  98. method: 'POST',
  99. headers: this.__.extend({}, formData.getHeaders(), {'user-agent': userAgent})
  100. }, (error, res, body) => {
  101. if (typeof callback === "function") {
  102. let response = JSON.parse(body);
  103. let result = {type: 1, id: localFile};
  104. if (res.statusCode == 200) {
  105. result.statusCode = (response.code == 'success' ? 200 : -1);
  106. if (result.statusCode == 200) {
  107. result.type = 2;
  108. result.data = {
  109. localname: response.data.filename,
  110. storename: response.data.storename,
  111. path: response.data.path,
  112. url: response.data.url,
  113. hash: response.data.hash
  114. }
  115. result.msg = '';
  116. } else {
  117. result.msg = response.msg;
  118. }
  119. } else {
  120. result.statusCode = res.statusCode;
  121. result.msg = res.statusMessage;
  122. }
  123. callback(result)
  124. } else {
  125. log.info(res)
  126. }
  127. });
  128. formData.pipe(request);
  129. }
  130. }
  131. return Smms;
  132. })()
  133. module.exports = smms;