]+class="[^"]*field--name-body[^"]*"[^>]*>([\s\S]*?)<\/div>\s*<\/div>/i);
if (bodyMatch) {
content = bodyMatch[1].trim();
} else {
// Fallback: extract p tags between article
const articleMatch = html.match(/
]*>([\s\S]*?)<\/article>/i);
if (articleMatch) {
const pTags = articleMatch[1].match(/([\s\S]*?)<\/p>/ig);
if (pTags) content = pTags.join('\n');
}
}
// Strip out tags except p, b, i, strong, em, ul, li, ol
content = content.replace(/<(?!p|b|i|strong|em|ul|li|ol|\/p|\/b|\/i|\/strong|\/em|\/ul|\/li|\/ol)[^>]+>/ig, '');
return { title, image, date, content };
}
async function run() {
try {
const list = await databases.listCollections(DB_ID);
const map = {};
list.collections.forEach(c => { map[c.name.toLowerCase()] = c.$id; });
const postsCollectionId = map['posts'] || 'posts';
const mediaCollectionId = map['media'] || 'media';
const pubTypesCollectionId = map['publication types'] || map['publication_types'] || 'publication_types';
const typeRes = await databases.listDocuments(DB_ID, pubTypesCollectionId, [Query.equal('codigo', 'NOTICIA')]);
const typeId = typeRes.documents.length > 0 ? typeRes.documents[0].$id : null;
for (let i = 0; i < urls.length; i++) {
const url = urls[i];
console.log('Processing:', url);
const data = await extractData(url);
console.log('Extracted Title:', data.title);
console.log('Extracted Date:', data.date);
console.log('Extracted Image:', data.image);
let mediaId = null;
if (data.image) {
try {
const imgRes = await axios.get(data.image, { responseType: 'arraybuffer' });
const buffer = Buffer.from(imgRes.data, 'binary');
const filePath = `/tmp/scraped_img_${i}.jpg`;
fs.writeFileSync(filePath, buffer);
let fileParam;
if (InputFile && InputFile.fromPath) fileParam = InputFile.fromPath(filePath, `image${i}.jpg`);
else fileParam = fs.createReadStream(filePath);
const file = await storage.createFile(BUCKET_ID, ID.unique(), fileParam);
const mediaDoc = await databases.createDocument(DB_ID, mediaCollectionId, ID.unique(), {
file_id: file.$id, bucket_id: BUCKET_ID,
titulo: data.title, tipo: 'imagen'
});
mediaId = mediaDoc.$id;
} catch(err) {
console.error('Error uploading image:', err.message);
}
}
const doc = {
titulo: data.title.substring(0, 100),
slug: `multivision-${Date.now()}-${i}`,
tipo_publicacion_id: typeId,
estado: 'Publicado',
fecha_publicacion: data.date,
contenido: data.content,
imagen_destacada_id: mediaId
};
const res = await databases.createDocument(DB_ID, postsCollectionId, ID.unique(), doc);
console.log('Published! ID:', res.$id);
console.log('---------------------------');
}
} catch(e) {
console.error(e);
}
}
run();