Введение

В мире, который становится все более взаимосвязанным и основанным на технологиях, ведение блога (чем я занимаюсь сейчас) становится все более и более важным. Возможно, это потому, что автор описывает то, чего мы всегда желали, но никогда не испытывали. А может быть, все совсем наоборот, и автор говорит о чем-то рутинном для вас, но с другой точки зрения.

В любом случае, я хочу сказать, что с ростом блогов люди были вынуждены искать способы переноса своих сообщений в блогах с внешних сайтов на свой сайт. В частности, в данном случае я говорю о Medium.

В частности, из-за технологий и программного обеспечения, о которых я пишу, мне нужен был способ размещать мои сообщения на Medium на моем личном веб-сайте. И, поскольку я размещаю бесплатно с помощью GitHub Pages, мне не хотелось размещать сервер, писать весь серверный файл и конфигурацию, а затем платить за все это только за эту простую задачу.

И поэтому я решил взять на себя задачу создать очень простой клиентский граббер контента Medium, который я покажу вам в оставшейся части этого поста!

Мои требования:

  • Сторона клиента
  • Только Vanilla JS (без jquery, реакции и т. д.)
  • Должен быть как минимум заголовок поста, дата, тело и миниатюра.

Начнем! 🚀

Для начала мы хотим настроить нашу структуру папок, включая наш файл index.html и наш основной файл js, который мы назовем script.js. Моя структура папок будет выглядеть так для простоты, но вы можете свободно изменять ее по своему усмотрению.

Project Root
    |- /src
        |- index.html
        |- /assets/
            |- script.js

Интересная часть: программирование🎉

Внутри нашего файла index.html мы просто хотим иметь пустое пространство для размещения миниатюры (содержащейся в теле поста), заголовка, даты поста и содержимого поста. Мы также захотим добавить атрибут id к каждому из них для простоты использования. (серьезно, кто еще использует document.getElementsByClassName()?)

<body>
     <h3 class="blog-title" id="title">Uh Oh, It seems like we've had a problem loading the blog...</h3>
     <h5 class="blog-subheading" id="release"></h5>
     <p id="blog_content"></p>
</body>
<script src="assets/script.js"></script>

Теперь, когда у нас есть «просто-тупой» HTML-код, мы можем перейти к части JavaScript (в assets/script.js)

Во-первых, мы хотим объявить наши глобальные переменные, просто чтобы получить к ним доступ внутри каждой функции без особых трудностей (и судорог тоже).

// Global variable declarations
var title = document.getElementById('title');
var release_date = document.getElementById('release');
var blog_body = document.getElementById('blog_content');

Поскольку с этим покончено, мы можем начать процесс вызова API к Medium. Вот интересная часть: API Medium выводит данные в формате XML/RSS. К счастью, кто-то уже справился с этим с помощью инструмента rss2json здесь.

Используя этот сервис rss2json, наш вызов API будет выглядеть примерно так:

fetch('https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/@flancast90')
     .then((res) => res.json())
     .then((data) => {
          // we'll get here soon enough!
     });

где вы можете заменить часть @flancast90 своим именем пользователя Medium. Затем мы сохраним каждую из «важных» частей JSON в новых переменных, а также проделаем немного магии JavaScript, чтобы заменить некоторые ненужные изображения, символы и т. д.

Во-первых, мы хотим сохранить ответ rss2json в новой переменной JSON, например:

//store the JSON output in a variable for ease-of-access
var medium_code = data; 

И оттуда мы можем сохранить определенные элементы, которые нам нужны, такие как заголовок, миниатюра и контент, в разных переменных.

var title_from_medium = (medium_code.items[0].title);
var release_date_from_medium = (medium_code.items[0].pubDate);
var content_from_medium = (medium_code.items[0].content).replace(/^"|"$/g, '');                  

Как видно, нам пришлось вызывать некоторые функции замены выше. Нам пришлось сделать это, чтобы избавиться от кавычек, которые оборачивают содержимое вывода rss2json, а также сохранить правильное форматирование, изменив символ новой строки JSON \n на символ новой строки HTML <br>.

Еще несколько функций замены, и все готово!

title.innerHTML = JSON.stringify(title_from_medium).replace(/^"|"$/g, '');
release_date.innerHTML = JSON.stringify(release_date_from_medium).replace(/^"|"$/g, '');
blog_body.innerHTML = JSON.stringify(content_from_medium).replaceAll('\\n','<br>');

Они снова просто избавляются от лишних кавычек. Теперь давайте посмотрим, как это получилось!

О-о, кажется, форматирование немного запутано, а миниатюра, которая находится внутри контента, имеет некоторые проблемы с рендерингом. Добавление нескольких переменных исправления в код должно решить эту проблему, поскольку мы можем просто сломать URL-адрес перед добавленным %22 и удалить некоторый дополнительный контент, добавленный Medium (я полагаю, для отслеживания аналитики)!

var changed = (fix_image.src).split("%22")[1];                      changed = changed.substring(0, changed.length - 1);                      fix_image.src = (changed);                      fix_image.style.position = "relative";                      fix_image.style.width = "100%";
var children_img_in_post = parseInt(blog_body.getElementsByTagName('img').length);
// medium embeds a counter for post views, which we don't need.
// We will discard of it, since we know it is the last
// image in the post
blog_body.getElementsByTagName('img')[children_img_in_post-1].remove();

И это все! Надеюсь, это решение окажется полезным для вас (оно точно было для меня, я использую его в своем блоге на finnsoftware.net). Если вы все еще немного запутались, ничего страшного; Я сохранил весь этот код в репозитории GitHub, чтобы вы могли увидеть здесь :)