fetch-meta.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. const models = require('../../models');
  2. const fetch = require('node-fetch');
  3. const config = require('../../config/app');
  4. /**
  5. *
  6. curl --location 'https://ark.cn-beijing.volces.com/api/v3/chat/completions' \
  7. --header 'Authorization: Bearer fb8942c2-fe94-4092-80fc-233e252f7090' \
  8. --header 'Content-Type: application/json' \
  9. --data '{
  10. "model": "ep-20250206115552-7qg5c",
  11. "messages": [
  12. {"role": "user", "content": [
  13. {
  14. "type":"text",
  15. "text": "根据图片生成多语言的标题和200字以内的文案描述, 支持语言中文(zh)、英语(en)、西班牙语(es)、葡萄牙语(pt)、日语(ja),以json格式输出,形如: title: {zh:, en:}, copy: {zh: en:}"
  16. },
  17. {
  18. "type": "image_url",
  19. "image_url": {
  20. "url": "https://color.jccytech.cn/thumbs/v2/work/320/67a241674f9d65537938e36d.png"
  21. }
  22. }
  23. ]}
  24. ]
  25. }'
  26. */
  27. let apiKey = require('process').env.ARK_API_KEY;
  28. const url = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
  29. let headers = {
  30. 'Authorization': `Bearer ${apiKey}`,
  31. 'Content-Type': 'application/json'
  32. }
  33. /**
  34. * 从豆包获取图片的标题和文案描述
  35. * @param {*} imageUrl
  36. */
  37. async function fetchMetaFromDoubao(imageUrl) {
  38. let data = {
  39. "model": "ep-20250206115552-7qg5c", // Doubao-1.5...ion-pro-32k 当前最新,贵,响应慢,效果好
  40. // "model": "ep-20250204231910-4phb8", // Doubao-vision-lite-32k 便宜点,相应速度快
  41. "messages": [
  42. {
  43. "role": "user", "content": [
  44. {
  45. "type": "text",
  46. "text": "根据图片生成多语言的标题和描述文案(文案200字左右,尽量不要出现诸如画面中、这幅画这样的废话), 支持语言中文(zh)、英语(en)、西班牙语(es)、葡萄牙语(pt)、日语(ja),以json格式输出,形如: title: {zh:, en:}, copy: {zh: en:}"
  47. },
  48. {
  49. "type": "image_url",
  50. "image_url": {
  51. "url": `${imageUrl}`
  52. }
  53. }
  54. ]
  55. }
  56. ]
  57. }
  58. const jsonData = JSON.stringify(data);
  59. const response = await fetch(url, { method: 'POST', headers, body: jsonData });
  60. let responseJson = await response.json();
  61. console.log(responseJson);
  62. return responseJson.choices[0].message.content;
  63. }
  64. async function run() {
  65. let done = 0;
  66. let duration = 0;
  67. let hour, minute, second;
  68. let start = Date.now();
  69. // 筛选出所有已经ready并且还没有title的图
  70. let query = { status: { $gte: 7000 }, $or: [{ title: { $exists: false } }, { title: null }] };
  71. let docs = await models.Art.find(query).sort({ publishTime: 'desc' });
  72. let total = docs.length;
  73. console.log('total:', total);
  74. for (let doc of docs) {
  75. let thumbUrl = `${config.resHost}/thumbs/v2/work/320/${doc._id}.png`;
  76. if (doc.hasSpecial) {
  77. thumbUrl = `${config.resHost}/thumbs/v2/special/320/${doc._id}.png`;
  78. }
  79. console.time(doc._id);
  80. try {
  81. let metaInfo = await fetchMetaFromDoubao(thumbUrl);
  82. console.log(metaInfo);
  83. let metaInfoJson = JSON.parse(metaInfo);
  84. let titleJson = metaInfoJson.title;
  85. let descJson = metaInfoJson.copy;
  86. let title = JSON.stringify(titleJson);
  87. let desc = JSON.stringify(descJson);
  88. doc.title = title;
  89. doc.desc = desc;
  90. await doc.save();
  91. } catch (e) {
  92. console.error(e.message);
  93. }
  94. console.timeEnd(doc._id);
  95. done++;
  96. duration = (Date.now() - start) / 1000;
  97. hour = (Math.floor(duration / 60 / 60)).toString().padStart(2, '0');
  98. minute = (Math.floor(duration / 60) % 60).toString().padStart(2, '0');
  99. second = (Math.floor(duration) % 60).toString().padStart(2, '0');
  100. console.log('progress: ' + Math.floor((100 * done / total)) + '% used time: ' + hour + ':' + minute + ':' + second);
  101. }
  102. }
  103. async function test() {
  104. let metaInfo = await fetchMetaFromDoubao("https://color.jccytech.cn/thumbs/v2/work/640/67a254ec4f9d65537938e5c5.png");
  105. console.log(metaInfo);
  106. let metaInfoJson = JSON.parse(metaInfo);
  107. let titleJson = metaInfoJson.title;
  108. let descJson = metaInfoJson.copy;
  109. let title = JSON.stringify(titleJson);
  110. let desc = JSON.stringify(descJson);
  111. console.log(title);
  112. console.log(desc);
  113. }
  114. module.exports = { run }
  115. if (require.main == module) {
  116. run();
  117. }