Python 및 Flask를 사용한 자동화된 링크 미리보기 이미지

9420 단어 pythonwebdev
이 게시물에서는 블로그 게시물에 대한 링크 미리보기 이미지를 생성하여 소셜 미디어에서 공유할 때 잘 보이도록 만드는 방법을 보여줍니다.

아래에서 어떻게 표시되는지 확인할 수 있습니다.



URL을 수락하고 웹 사이트의 메타데이터를 기반으로 생성된 이미지를 반환하는 간단한 Flask 엔드포인트를 생성합니다.

그래서 일하러 가자.

카드의 HTML 버전을 위한 Jinja2 템플릿 준비




<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{{ title }}</title>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet">
    <style>
      @page {
        size: 1200px 628px;
        margin: 0;
        padding: 0;
      }

      html {
        font-size: 137.5%;
        -webkit-font-smoothing: antialiased;
      }

      body {
        padding: 3rem;
        font-family: 'Inter', sans-serif;
        color: #111111;
        background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='18' viewBox='0 0 100 18'%3E%3Cpath fill='%231c64f2' fill-opacity='0.05' d='M61.82 18c3.47-1.45 6.86-3.78 11.3-7.34C78 6.76 80.34 5.1 83.87 3.42 88.56 1.16 93.75 0 100 0v6.16C98.76 6.05 97.43 6 96 6c-9.59 0-14.23 2.23-23.13 9.34-1.28 1.03-2.39 1.9-3.4 2.66h-7.65zm-23.64 0H22.52c-1-.76-2.1-1.63-3.4-2.66C11.57 9.3 7.08 6.78 0 6.16V0c6.25 0 11.44 1.16 16.14 3.42 3.53 1.7 5.87 3.35 10.73 7.24 4.45 3.56 7.84 5.9 11.31 7.34zM61.82 0h7.66a39.57 39.57 0 0 1-7.34 4.58C57.44 6.84 52.25 8 46 8S34.56 6.84 29.86 4.58A39.57 39.57 0 0 1 22.52 0h15.66C41.65 1.44 45.21 2 50 2c4.8 0 8.35-.56 11.82-2z'%3E%3C/path%3E%3C/svg%3E");
      }

      h1 {
        font-size: 3.052rem;
        margin-top: 0;
      }

      p {
        font-size: 1.563rem;
        line-height: 1.5;
      }
    </style>
  </head>

  <body>
    <h1>{{ title }}</h1>
    <p>{{ excerpt }}</p>
  </body>
</html>


미리보기 이미지를 생성할 Flask 끝점 만들기




import io
import requests
from lxml import etree

@app.route('/preview.png')
def preview():
    # Fetch the URL
    page_html = requests.get(request.args['url']).text

    # Parse the HTML response
    parser = etree.HTMLParser()
    tree = etree.parse(io.StringIO(page_html), parser)

    # Get the website's title and description from its metadata
    head = tree.xpath('/html/head')[0]
    title = head.xpath('meta[@property="og:title"]/@content')[0]
    description = head.xpath('meta[@property="og:description"]/@content')[0]

    # Render the HTML version of the preview
    preview_html = render_template('card.html', title=title, excerpt=description)

    # Use weasyprint to convert the HTML preview to PNG
    preview_img = weasyprint.HTML(string=preview_html).write_png(resolution=2 * 96)

    return Response(preview_img, mimetype='image/png')


다음은 단계별로 진행되는 단계입니다.
  • URL 가져오기,
  • HTML 응답을 구문 분석합니다.
  • 메타데이터에서 웹사이트의 제목과 설명을 가져옵니다.
  • 미리 보기의 HTML 버전 렌더링,
  • weasyprint 을 사용하여 HTML 미리 보기를 PNG로 변환합니다.
  • 생성된 이미지를 반환합니다.

  • 그리고 그게 다야! 이제 소셜 미디어에서 공유할 때 좋게 보이도록 웹 사이트 메타데이터에서 엔드포인트를 사용할 수 있습니다.

    <meta property="og:image" content="https://YOUR_DOMAIN/preview.png?url=YOUR_URL"/>
    

    좋은 웹페이지 즐겨찾기