برنامه نویسی

ایجاد تصاویر نمودار باز در جنگو برای بهبود اشتراک گذاری رسانه های اجتماعی

اگرچه الگوریتم‌های رسانه‌های اجتماعی معمولاً از ارسال پیوندها جلوگیری می‌کنند تا کاربران تا زمانی که ممکن است در شبکه بمانند، مردم اغلب پیوندهایی را در زیر یک پست مقدماتی به عنوان نظر یا پاسخ ارسال می‌کنند. پیوندهای معمولی به وب‌سایت‌ها در رسانه‌های اجتماعی بسیار کسل‌کننده به نظر می‌رسند، مگر اینکه تصاویری با نمودار باز که نمایانگر آن پیوند هستند اضافه کنید.

در این مقاله، من به شما نشان خواهم داد که چگونه می توانید با استفاده از رندر وب از HTML و CSS، تصاویر با گراف باز برای یک وب سایت جنگو ایجاد کنید. من برای ایجاد پیش‌نمایش‌های Open Graph برای پیوندهای DjangoTricks، 1st things 1st و PyBazaar بر این تکنیک تکیه می‌کنم.

نمودار باز چیست؟

فیس‌بوک پروتکل Open Graph را ایجاد کرد تا به وب‌سایت‌ها اجازه دهد نمایشی غنی از هر صفحه وب ارائه کنند. اگرچه ویژگی‌هایی برای وب‌سایت‌ها، مقالات، نمایه‌ها، موسیقی و ویدیو دارد، اما مورد استفاده رایج این است که یک تصویر پیش‌نمایش با عنوانی برای فیدهای اجتماعی داشته باشید. پیش نمایش های Open Graph با اکثر شبکه های اجتماعی شناخته شده، از جمله فیس بوک، Threads، LinkedIn، Mastodon و Blue Sky کار می کنند. تگ های Open Graph متا تگ های HTML هستند که در بخش HEAD قرار می دهید، به عنوان مثال:

 property="og:type" content="website" />
 property="og:url" content="{{ WEBSITE_URL }}{{ request.path }}" />
 property="og:title" content="{{ profile.user.get_full_name }}" />
{% if profile.open_graph_image %}
     property="og:image" content="{{ profile.open_graph_image.url }}?t={{ profile.modified|date:'U' }}" />
{% endif %}
 property="og:description" content="{{ profile.summary }}" />
 property="og:site_name" content="PyBazaar" />
 property="og:locale" content="en_US" />
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

X (که قبلاً توییتر نامیده می شد) همچنین از Open Graph پشتیبانی می کند، اما بهتر است متا تگ های مخصوص Twitter-Card را اضافه کنید تا پیش نمایش برجسته تر شود. در اینجا یک مثال است:

 name="twitter:card" content="summary_large_image">
 name="twitter:url" content="{{ WEBSITE_URL }}{{ request.path }}">
 name="twitter:title" content="{{ profile.user.get_full_name }}">
 name="twitter:description" content="{{ profile.summary }}">
{% if profile.open_graph_image %}
     name="twitter:image" content="{{ profile.open_graph_image.url }}?t={{ profile.modified|date:'U' }}">
{% endif %}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده از Graph/Twitter Card را در X باز کنید

برای پشتیبانی از پلتفرم های مختلف از متا تگ های Open Graph و Twitter Card استفاده کنید.

ابعاد تصویر پیش نمایش

ابعاد تصویر Open Graph Preview در شبکه های اجتماعی مختلف متفاوت است. بسیاری از منابع آنلاین استفاده از 1200 x 630 پیکسل را توصیه می کنند، اما من با موفقیت از ابعاد کوچکتر نیز استفاده کرده ام.

اگر تصویر خیلی بزرگ باشد، پردازش آن برای پیش‌نمایش توسط شبکه اجتماعی بیشتر طول می‌کشد، که انتشار پیوند را کند می‌کند.

از طرف دیگر، اگر خیلی کوچک باشد، ممکن است متن آن خیلی تار باشد.

استفاده از ابزارهای تست مرورگر برای اسکرین شات ها

استفاده کرده ام نمایشنامه نویس و سلنیوم برای تولید تصاویر پیش نمایش در یک کار پس زمینه. از آنجایی که Playwright دارای مکانیزم داخلی برای دانلود فایل های باینری مرورگر است و در قابلیت های آزمایش بسیار پیشرفته تر است، همچنین اولین انتخاب من برای اسکرین شات است.

می توانید Playwright را با موارد زیر نصب کنید:

(venv)$ pip install playwright
(venv)$ playwright install
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اطمینان از داشتن تنظیمات لازم

برای نشان دادن اثبات مفهوم، شما نیاز دارید WEBSITE_URL و ابعاد تصویر نمودار را در تنظیمات خود باز کنید:

WEBSITE_URL = "https://www.pybazaar.com"

OPEN_GRAPH_IMAGE_WIDTH = 800
OPEN_GRAPH_IMAGE_HEIGHT = 418
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عبور از WEBSITE_URL به قالب ها

عبور از آن راحت ترین است WEBSITE_URL و تنظیمات دیگر برای همه الگوها با داشتن یک پردازنده زمینه سفارشی:

def website_settings(request):
    from django.conf import settings

    return {
        "WEBSITE_URL": settings.WEBSITE_URL,
    }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آن را در تنظیمات به صورت زیر تنظیم کنید:

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [os.path.join(BASE_DIR, "templates")],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
                "pybazaar.apps.core.context_processors.website_settings",
            ],
        },
    },
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آماده سازی مدل ها

هر مدلی که باید یک تصویر پیش نمایش Open Graph داشته باشد باید یک فیلد تصویر داشته باشد open_graph_image:

import os
from django.db import models
from django.utils import timezone


def upload_images_to(instance, filename):
    now = timezone.now()
    filename_base, filename_ext = os.path.splitext(filename)
    return "profiles/{user_id}/{filename}{ext}".format(
        user_id=instance.user.pk,
        filename=now.strftime("%Y%m%d%H%M%S"),
        ext=filename_ext.lower(),
    )

class Profile(models.Model):
    user = models.OneToOneField(
        "accounts.User", verbose_name="User", on_delete=models.CASCADE
    )
    open_graph_image = models.ImageField(
        "Open-graph image", upload_to=upload_images_to, blank=True
    )

    def generate_open_graph_image(self):
        from .tasks import generate_profile_open_graph_image

        if self.open_graph_image:
            self.open_graph_image.delete()
        generate_profile_open_graph_image(profile_id=self.pk)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد نمای جنگو برای پیش نمایش Open Graph

برای تعریف طرح‌بندی پیش‌نمایش، یک نمای HTML سفارشی ایجاد می‌کنیم:

from django.views.decorators.cache import never_cache
from django.shortcuts import render

@never_cache
def profile_open_graph_preview(request, username):
    profile = get_object_or_404(Profile, user__username=username)
    context = {
        "profile": profile,
    }
    return render(request, "profiles/profile_open_graph_preview.html", context)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمای جنگو که برای تصویر پیش‌نمایش گراف باز استفاده می‌شود، می‌تواند از چارچوب‌های CSS، مانند TailwindCSS، فونت‌های سفارشی و پیشرفت‌های جاوا اسکریپت برای طرح‌بندی استفاده کند. این به شما امکان می دهد تایپوگرافی و استایل ثابتی با وب سایت داشته باشید.

وصل کردن نمای به URL ها

قانون URL برای view بسیار ساده است:

from django.urls import path
from . import views

app_name = "profiles"

urlpatterns = [
    #...
    path(
        "/_open-graph-preview/",
        views.profile_open_graph_preview,
        name="profile_open_graph_preview",
    ),
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد یک کار پس زمینه برای ایجاد اسکرین شات

من از Huey برای کارهای پس زمینه استفاده می کنم. وظیفه پس‌زمینه‌ای که اسکرین‌شات‌ها را تولید می‌کند، به این صورت است (تکفیل Celery مشابه خواهد بود):

from huey.contrib.djhuey import db_task


@db_task()
def generate_profile_open_graph_image(profile_id):
    import os
    from playwright.sync_api import sync_playwright
    from PIL import Image
    from django.conf import settings
    from django.core.files.base import ContentFile
    from django.core.files.storage import default_storage
    from django.urls import reverse
    from io import BytesIO
    from .models import Profile

    os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"  # for Playwright
    profile = Profile.objects.get(pk=profile_id)

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        context = browser.new_context(
            viewport={
                "width": settings.OPEN_GRAPH_IMAGE_WIDTH,  # Changed to target dimensions
                "height": settings.OPEN_GRAPH_IMAGE_HEIGHT,
            },
            ignore_https_errors=True,
        )
        page = context.new_page()
        page.goto(
            settings.WEBSITE_URL
            + reverse(
                "profiles:profile_open_graph_preview",
                kwargs={"username": profile.user.username},
            )
        )
        page.wait_for_load_state("networkidle")
        screenshot_bytes = page.screenshot()
        browser.close()

    # Open and resize if needed
    image = Image.open(BytesIO(screenshot_bytes))
    if image.size != (settings.OPEN_GRAPH_IMAGE_WIDTH, settings.OPEN_GRAPH_IMAGE_HEIGHT):
        image.thumbnail(
            (settings.OPEN_GRAPH_IMAGE_WIDTH, settings.OPEN_GRAPH_IMAGE_HEIGHT),
            resample=Image.LANCZOS
        )

    # Save the image
    final_image_io = BytesIO()
    image.save(final_image_io, format="PNG")
    final_image_io.seek(0)

    rel_file_path = Profile._meta.get_field("open_graph_image").upload_to(
        profile, "profile.png"
    )
    default_storage.save(rel_file_path, ContentFile(final_image_io.getvalue()))
    Profile.objects.filter(pk=profile.pk).update(open_graph_image=rel_file_path)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد تصویر پیش‌نمایش گراف باز

پس از ذخیره یک ورودی و روابط آن در نمای تغییر، نمای مدیریت یا دستورات مدیریت، روش تولید تصویر را فراخوانی کنید:

profile.generate_open_graph_image()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این روش وظیفه پس‌زمینه‌ای را اجرا می‌کند که Chromium را راه‌اندازی می‌کند، صفحه پیش‌نمایش Open Graph را باز می‌کند، یک عکس از صفحه می‌گیرد، در صورت لزوم اندازه آن را تغییر می‌دهد و سپس تصویر را ذخیره می‌کند. همه اینها تا 15 ثانیه طول می کشد.

کلمات پایانی

اگر می‌خواهید صفحاتی که در فیدهای اجتماعی به اشتراک می‌گذارید ظاهر و احساس برند داشته باشند، ایجاد تصاویر Open Graph با Playwright می‌تواند رویکرد مناسبی باشد. می توانید از Playwright برای تهیه اسکرین شات از یک صفحه وب در Chromium استفاده کنید. صفحه را می توان با همان کیفیت وب سایت شما طراحی کرد. جاوا اسکریپت ها را می توان برای برجسته کردن نحو کد یا تغییر اندازه متون برای جا دادن در ظرف داده شده اعمال کرد.


عکس روی جلد زیشان شبیر

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا