#javascript #node.js #dynamic #meta-tags
Вопрос:
Проблема: Я динамически генерирую мета-теги на стороне сервера, чтобы контролировать то, что очищается искателями социальных сетей для страницы блога. Когда я публикую сообщение из блога, Facebook правильно очищает страницу, но не ссылается на нее или Твиттер. Для Twitter и Linkedin обновление мета-тегов работает для обслуживаемой страницы, но скребки, похоже, «застревают» на одном посте-они, похоже, не каждый раз очищают страницу. Похоже, что, возможно, скребки обладают памятью и не выскабливают каждый раз, когда страница публикуется? Но Facebook делает это?
Справочная информация: Я использую Node.js сервер с express, который вызывает API Blogger для отображения сообщений в блоге (мое решение для того, чтобы не создавать CMS для блога для клиента-клиент редактирует блог на Blogger, и он отображается на сайте с помощью вызова API на стороне сервера). Вот страница блога для сайта: https://www.pisgahclimbingschool.com/blog. Я удалил опцию общего доступа к Твиттеру с сайта, так как он не предоставляет доступ к определенной странице. Если вы поделитесь URL-адресом конкретного поста, очищенная информация на данный момент является общей. Конечная цель состоит в том, чтобы сделать его динамичным.
Код для динамической генерации метатегов: Я использовал этот сайт в качестве ресурса, чтобы помочь мне с моим методом: https://dev.to/js_bits_bill/dynamic-open-graph-meta-tags-with-vuejs-and-node-js-bits-2a11
Вот JS на стороне клиента. Функция buildMetaArray вызывается после первоначального вызова API Blogger для извлечения и визуализации сообщений.
function buildMetaArray(data, id) {
for(post in data){
let title = data[post].title;
let content = data[post].content;
let noHtml = content.replace( /(<([^>] )>)/ig, '');
let noBackspace = noHtml.replace('amp;nbsp;', '');
let shorterContent = noBackspace.slice(0, 197);
let description = shorterContent.concat('...');
let url = `https://www.pisgahclimbingschool.com/blog-post#${titleAsId(title)}`;
let postContent = data[post].content;
let imgStart = postContent.match('src="');
let startIndex = imgStart.index 5;
let startingString = postContent.substring(startIndex, postContent.length);
let imgEnd = findJpg(startingString);
let endIndex = imgEnd startIndex;
let img = postContent.substring(startIndex, endIndex);
let postData = {
title: title,
description: description,
url: url,
image: img
}
metaArray.push(postData);
}
}
Когда сообщение публикуется в Facebook, метаданные для этого конкретного сообщения отправляются на сервер. Это код на стороне клиента для того, что происходит при нажатии кнопки «Поделиться».:
function sharePost(postId, index) {
let shareUrl = `https://www.pisgahclimbingschool.com/blog#${postId}`;
let facebookLink = document.getElementById('facebook-share-' index);
let twitterLink = document.getElementById('twitter-share-' index);
let urlLink = document.getElementById('url-share-' index);
let newPage;
facebookLink.addEventListener('click', async function(){
let string = this.id;
let id = (string.slice(string.length-1))-1;
let thisMetaData = metaArray[id];
shareData = {thisMetaData}
const options = {
method: 'POST',
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(shareData)
}
let newPage;
const response = await fetch(send_meta_data, options);
if(response.ok === true){
newPage = await fetch(blog_post);
}
if(newPage.ok === true){
let facebookShare = "https://www.facebook.com/sharer.php?u=" (newPage.url) "#" postId;
FB.ui({
method: 'share',
href: ((newPage.url) "#" postId),
}, function(response){});
}else{console.log('not ok')
}
});
Вот код сервера, в котором заменяется содержимое мета-тега:
let updatedPost;
app.post('/metaData', async (request, response) => {
const metaData = await request.body;
const metaDataContent = metaData.thisMetaData;
const filePath = path.resolve(__dirname, './public', 'blog.html');
fs.readFile(filePath, 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
data = data.replace("Pisgah Climbing School Blog", metaDataContent.title);
data = data.replace("Learn more about techniques, gear, locations, and all things climbing in the Pisgah Mountains and beyond", metaDataContent.description);
data = data.replace("resources/images/alewine-topping-out-on-cutthroat-peak.jpg", metaDataContent.image);
result = data.replace("www.pisgahclimbingschool.com/blog", metaDataContent.url);
updatedPost = resu<
response.send(updatedPost);
return(updatedPost);
});
});
Once the meta tags are updated, it’s sent back to the client side this way:
app.get('/blog-post', async (request, response) => {
response.send(updatedPost);
});
The page that is shared is https://www.pisgahclimbingschool.com/blog-post#(title of post). My suspicion is that Facebook is scraping the https://www.pisgahclimbingschool.com/blog-post every time it is shared but the other platforms are not.
Одна из моих мыслей заключалась в том, чтобы сделать каждую публикацию своей собственной уникальной страницей при первоначальном вызове API, таким образом, URL-адрес был бы примерно таким https://www.pisgahclimbingschool.com/blog/(название должности). Но я не совсем уверен, как это сделать. Любое понимание, мысли или решения приветствуются! Я новый разработчик, и это мой первый сайт.