Генерация модных превью ссылок с помощью Rails 7
11 мая 2022 г.Эй, эй, эй! Вот краткая статья о том, как сделать предварительный просмотр ссылок красоты, как это делает Dev.to.
Вы получите что-то вроде этого:
Да, это было буквально с "like dev.to" 😛 Я создал что-то подобное для своего нового проекта workby.io, и вот как я это сделал...
Почти каждое руководство, которое я нашел, использовало htmlcsstoimage.com, на самом деле его использует dev.to. Это довольно популярно и эффективно, НО я не хочу платить 14 баксов за каждую 1k изображения 😂🐁
Итак, я собираюсь использовать Grover: ruby gem для преобразования HTML в PDF, PNG или JPEG с помощью Google Puppeteer и Chromium.
Если вы хотите создать это, скажем, на Node.js, вы также можете подписаться на меня. Puppeteer популярен и прост в использовании.
Короче говоря: мы создадим HTML-представление и сделаем его снимок экрана.
Вы можете создать пустой проект Rails или просто добавить дополнительные функции в ваше текущее приложение.
Настраивать
Установите гем Гровера с помощью
связать добавить гровер
И зависимость Гровера, Кукольника, с:
пряжа добавить кукольника
Затем создайте пустой контроллер, в котором вы можете отвечать различными шаблонами предварительного просмотра ссылок:
контроллер rails g og-imager dev_to
В действии dev_to
позвоним Гроуверу и позволим ему творить чудеса.
приложение/контроллеры/og_imager_controller.rb
``рубин
класс OgImagerController < ApplicationController
ПОЛУЧИТЬ /og_imager/dev_to
@param {строка} заголовок
@param {string} аватар
@param {строка} имя пользователя
@param {string} метка времени
@param {массив} логотипы
@возвращает изображение/png
защита dev_to
Получить параметры и установить переменную
TODO: Вместо этого извлеките свой объект :p
@название = параметры[:название]
@аватар = параметры[:аватар]
@имя_пользователя = параметры[:имя_пользователя]
@timestamp = параметры[:timestamp]
@логотипы = параметры[:логотипы]
Grover.new принимает URL-адрес или встроенный HTML-код и дополнительные параметры для Puppeteer.
Гровер = Гровер.новый(
render_to_string
Получить скриншот
png = гровер.to_png
Рендеринг изображения
send_data(png, тип: 'image/png', расположение: 'встроенный')
конец
конец
Вот наше представление, просто HTML/CSS
app/views/og_imager/dev_to.html.erb
```html
<%= @название%>
<img src="<%= @avatar %>" class="avatar">
<%= @username %> - <%= @timestamp %>
<% @logos.each сделать |логотип| %>
<img src="<%= логотип %>" class="логотип">
<% конец%>
<стиль>
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap');
семейство шрифтов: «Roboto», без засечек;
цвет: #cd685f;
.контейнер{
ширина: 1128 пикселей;
высота: 600 пикселей;
дисплей: гибкий;
.карта{
дисплей: гибкий;
выравнивание содержимого: пробел между;
flex-направление: столбец;
поле: 2,8 бэр 4 бэр 4 бэр 2,8 бэр;
граница: 3 пикселя сплошная #c56b61;
радиус границы: 25px 25px 0px 0px;
box-shadow: 7px 10px 0px 1px #c56b61;
набивка: 3,8 бэр 1,8 бэр 1,8 бэр 1,8 бэр;
.заглавие{
поле: 0px;
вес шрифта: 500;
размер шрифта: 5rem;
высота строки: 80 пикселей;
.Детали{
дисплей: гибкий;
выравнивание содержимого: пробел между;
.пользователь{
дисплей: гибкий;
выравнивание элементов: по центру;
.аватар{
граница: 3 пикселя сплошная #c56b61;
ширина: 50 пикселей;
высота: 50 пикселей;
радиус границы: 50%;
поле справа: 10px;
.имя пользователя{
маржа: 0;
размер шрифта: 2.5rem;
.лого{
дисплей: гибкий;
выравнивание содержимого: пробел между;
.лого{
ширина: 60 пикселей;
высота: 60 пикселей;
поле слева: 20px;
преобразование: поворот (5 градусов);
И, наконец, создайте инициализатор, чтобы установить область просмотра нашего браузера (окончательный размер изображения).
инициализаторы/grover.rb
``рубин
Grover.configure сделать |config|
config.options = {
область просмотра: {
ширина: 1128,
высота: 600
конец
Если вы создали пустой проект и хотите использовать его в качестве микросервиса, вот руководство о том, как развернуть эту штуку на Heroku.
- Создайте приложение в своей учетной записи Heroku (я предполагаю, что у вас уже установлен cli):
heroku create your_app_name
- Предупредите Heroku о нашей библиотеке JS (Puppeteer):
heroku buildpacks:add heroku/nodejs --index=1
- А также помогите ему настроить зависимости Puppeteer 😛:
heroku buildpacks:add jontewks/puppeteer --index=2
- Скажите Гроверу запустить Puppeteer в «без-песочнице»:
heroku config:set GROVER_NO_SANDBOX=true
Чтобы использовать это изображение в предварительном просмотре ссылки, вам понадобится [Протокол Open Graph] (https://ogp.me/). Просто простые метатеги, которые будут искать браузеры.
Метатеги всегда находятся в
, поэтомуприложение/представления/макеты/application.html.erb
```html
<%= выход(:головка)%>
А затем попросите ERB заполнить предыдущий блок
```html
<%= content_for :head do %>
<meta property="og:title" content="<%= @article.title %>">
<meta property="og:image" content="<%= article_link_preview(@article) %>">
<% конец%>
при просмотре подробностей. Например: /статьи/:id
Что такое twitter:card
, так это то, что они лучше подходят для предварительного просмотра ссылок, вы можете узнать больше об этом здесь
Предыдущий метод article_link_preview — это простой помощник, который генерирует URL, который мы ищем.
приложение/помощники/articles_helper.rb
``рубин
def article_link_preview статья
uri = URI.parse('https://имя_вашего_приложения.herokuapp.com/ogimage')
uri.query = URI.encode_www_form(
название: статья.название,
'изображения []': article.tags.collect(&:изображение),
отметка времени: article.created_at.to_formatted_s(:short),
uri.to_s
конец
Вы получите что-то вроде этого:
https://your_app_name.herokuapp.com/og_image/dev_to?title=Real%20Time%20Notification%20System%20with%20Hotwire,%20in%20Rails%207&avatar=https://dev-to-uploads.s3.amazonaws. com/uploads/user/profile_image/369241/a0111bcb-a046-4398-98cd-f4cf0e2f8d0d.png&username=Matias%20Carpintini×tamp=13%20April&logos[]=https://img.icons8.com/office/80/000000/ruby- gemstone.png&logos[]=https://practicaldev-herokuapp-com.freetls.fastly.net/assets/devlogo-pwa-512.png
Вот [репозиторий] (https://github.com/matias-carpintini/og-imager) всего этого.
Эта статья была впервые опубликована [здесь].
Оригинал