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

اگرچه الگوریتمهای رسانههای اجتماعی معمولاً از ارسال پیوندها جلوگیری میکنند تا کاربران تا زمانی که ممکن است در شبکه بمانند، مردم اغلب پیوندهایی را در زیر یک پست مقدماتی به عنوان نظر یا پاسخ ارسال میکنند. پیوندهای معمولی به وبسایتها در رسانههای اجتماعی بسیار کسلکننده به نظر میرسند، مگر اینکه تصاویری با نمودار باز که نمایانگر آن پیوند هستند اضافه کنید.
در این مقاله، من به شما نشان خواهم داد که چگونه می توانید با استفاده از رندر وب از 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 %}
برای پشتیبانی از پلتفرم های مختلف از متا تگ های 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 استفاده کنید. صفحه را می توان با همان کیفیت وب سایت شما طراحی کرد. جاوا اسکریپت ها را می توان برای برجسته کردن نحو کد یا تغییر اندازه متون برای جا دادن در ظرف داده شده اعمال کرد.
عکس روی جلد زیشان شبیر