fetch-meta_tmp.js 3.5 KB

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