whatsapp 群组消息监控/ 群组功能
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.7 KiB

7 months ago
7 months ago
  1. 'use strict'
  2. const axios = require('axios');
  3. const fs = require('fs');
  4. const url = "http://10.8.0.10:8081/group1/upload";
  5. const dir = "/opt/crawl/whatsapp/whatsapp_wppconnect/sources/"
  6. /**
  7. * base64数据流转化为 适合formdata的格式
  8. **/
  9. function base64ToBlob(base64, mime) {
  10. let raw;
  11. if(base64.indexOf(";base64,") > -1){ // 如果存在base64这个前缀的话
  12. const parts = base64.split(';base64,');
  13. const contentType = parts[0].split(':')[1];
  14. // console.log(parts[1]);
  15. raw = atob(parts[1]);
  16. }else{
  17. raw = atob(base64);
  18. }
  19. const rawLength = raw.length;
  20. const uInt8Array = new Uint8Array(rawLength);
  21. for (let i = 0; i < rawLength; ++i) {
  22. uInt8Array[i] = raw.charCodeAt(i);
  23. }
  24. return new Blob([uInt8Array], {type: mime});
  25. }
  26. /**
  27. * 如果失败则下载到本地
  28. **/
  29. function saveToLocal(base64, mime){
  30. var file_name = "".concat(new Date()* 1000, "_".concat(mime.replace("/", ".")))
  31. file_name = dir + file_name;
  32. let videoData;
  33. if(base64.indexOf(";base64,") > -1){ // 如果存在base64这个前缀的话
  34. const parts = base64.split(';base64,');
  35. const contentType = parts[0].split(':')[1];
  36. videoData = Buffer.from(parts[1], 'base64');
  37. }else{
  38. videoData = Buffer.from(base64, 'base64');
  39. }
  40. fs.writeFile(file_name, videoData, 'base64', (err) => {
  41. if (err) {
  42. console.error(err);
  43. console.error("视频保存失败: ", base64);
  44. return;
  45. }
  46. console.log('视频已保存为 ' + file_name);
  47. });
  48. return file_name;
  49. }
  50. async function upload_files(base64, mime, file_name){
  51. // 创建一个Blob对象
  52. const blob = base64ToBlob(base64, mime);
  53. // 创建FormData对象并添加文件
  54. const formData = new FormData();
  55. formData.append('file', blob, file_name); // 'image.png'是文件名
  56. const headers = {
  57. 'Content-Type': 'multipart/form-data'
  58. }
  59. // 这个包可以
  60. try{
  61. let res = await axios.post(url, formData, {
  62. headers:headers,
  63. timeout: 20000 // 设置超时时间
  64. })
  65. console.log("上传成功:", res["data"]);
  66. // return res["data"];
  67. return {media_data: res["data"], local_data: undefined};
  68. }catch(error){
  69. console.error('上传失败:', error);
  70. let result = saveToLocal(base64, mime);
  71. console.error("上传失败: 保存到本地 ", result);
  72. return {media_data: "error", local_data: result}
  73. // return "error";
  74. }
  75. // .then(response => console.log(response.data))
  76. // .catch(error => console.error('Error:', error));
  77. }
  78. module.exports = {
  79. upload_files,
  80. saveToLocal
  81. }