improve: enhance post OpenGraph metadata with engagement data and auth handling (#9046)
This commit is contained in:
@@ -488,20 +488,26 @@ func (srv *Server) WebPost(c echo.Context) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
req := c.Request()
|
||||||
if !unauthedViewingOkay {
|
if !unauthedViewingOkay {
|
||||||
|
// Provide minimal OpenGraph data for auth-required posts
|
||||||
|
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path)
|
||||||
|
data["requiresAuth"] = true
|
||||||
|
data["profileHandle"] = pv.Handle
|
||||||
|
if pv.DisplayName != nil {
|
||||||
|
data["profileDisplayName"] = *pv.DisplayName
|
||||||
|
}
|
||||||
return c.Render(http.StatusOK, "post.html", data)
|
return c.Render(http.StatusOK, "post.html", data)
|
||||||
}
|
}
|
||||||
did := pv.Did
|
|
||||||
data["did"] = did
|
|
||||||
|
|
||||||
// then fetch the post thread (with extra context)
|
// then fetch the post thread (with extra context)
|
||||||
uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", did, rkey)
|
uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", pv.Did, rkey)
|
||||||
tpv, err := appbsky.FeedGetPostThread(ctx, srv.xrpcc, 1, 0, uri)
|
tpv, err := appbsky.FeedGetPostThread(ctx, srv.xrpcc, 1, 0, uri)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("failed to fetch post: %s\t%v", uri, err)
|
log.Warnf("failed to fetch post: %s\t%v", uri, err)
|
||||||
return c.Render(http.StatusOK, "post.html", data)
|
return c.Render(http.StatusOK, "post.html", data)
|
||||||
}
|
}
|
||||||
req := c.Request()
|
|
||||||
postView := tpv.Thread.FeedDefs_ThreadViewPost.Post
|
postView := tpv.Thread.FeedDefs_ThreadViewPost.Post
|
||||||
data["postView"] = postView
|
data["postView"] = postView
|
||||||
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path)
|
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path)
|
||||||
|
|||||||
@@ -94,7 +94,7 @@
|
|||||||
<meta name="theme-color">
|
<meta name="theme-color">
|
||||||
<meta name="application-name" content="Bluesky">
|
<meta name="application-name" content="Bluesky">
|
||||||
<meta name="generator" content="bskyweb">
|
<meta name="generator" content="bskyweb">
|
||||||
<meta property="og:site_name" content="Bluesky Social" />
|
<meta property="og:site_name" content="Bluesky Social">
|
||||||
<meta name="twitter:site" content="@bluesky" />
|
<meta name="twitter:site" content="@bluesky" />
|
||||||
<link type="application/activity+json" href="" />
|
<link type="application/activity+json" href="" />
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
{% block head_title %}
|
{% block head_title %}
|
||||||
{%- if postView -%}
|
{%- if postView -%}
|
||||||
@{{ postView.Author.Handle }} on Bluesky
|
@{{ postView.Author.Handle }} on Bluesky
|
||||||
|
{%- elif requiresAuth and profileHandle -%}
|
||||||
|
@{{ profileHandle }} on Bluesky
|
||||||
{%- else -%}
|
{%- else -%}
|
||||||
Bluesky
|
Bluesky
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
@@ -11,7 +13,7 @@
|
|||||||
{% block html_head_extra -%}
|
{% block html_head_extra -%}
|
||||||
{%- if postView -%}
|
{%- if postView -%}
|
||||||
<meta property="og:type" content="article">
|
<meta property="og:type" content="article">
|
||||||
<meta property="profile:username" content="{{ profileView.Handle }}">
|
<meta property="profile:username" content="{{ postView.Author.Handle }}">
|
||||||
{%- if requestURI %}
|
{%- if requestURI %}
|
||||||
<meta property="og:url" content="{{ requestURI }}">
|
<meta property="og:url" content="{{ requestURI }}">
|
||||||
<link rel="canonical" href="{{ requestURI|canonicalize_url }}" />
|
<link rel="canonical" href="{{ requestURI|canonicalize_url }}" />
|
||||||
@@ -32,17 +34,44 @@
|
|||||||
<meta property="twitter:image" content="{{ imgThumbUrl }}">
|
<meta property="twitter:image" content="{{ imgThumbUrl }}">
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<meta name="twitter:card" content="summary_large_image">
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
{%- elif postView.Author.Avatar %}
|
{% else %}
|
||||||
<meta name="twitter:card" content="summary">
|
|
||||||
<meta property="og:image" content="{{ postView.Author.Avatar }}">
|
<meta property="og:image" content="{{ postView.Author.Avatar }}">
|
||||||
<meta property="twitter:image" content="{{ postView.Author.Avatar }}">
|
<meta property="twitter:image" content="{{ postView.Author.Avatar }}">
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<meta name="twitter:label1" content="Posted At">
|
<meta name="twitter:label1" content="Posted At">
|
||||||
<meta name="twitter:value1" content="{{ postView.IndexedAt }}">
|
<meta name="twitter:value1" content="{{ postView.IndexedAt }}">
|
||||||
<meta name="article:published_time" content="{{ postView.IndexedAt }}">
|
{%- if postView.LikeCount %}
|
||||||
<meta name="article:published_time" content="{{ postView.IndexedAt }}">
|
<meta name="twitter:label2" content="Likes">
|
||||||
|
<meta name="twitter:value2" content="{{ postView.LikeCount }}">
|
||||||
|
{% endif -%}
|
||||||
|
{%- if postView.ReplyCount %}
|
||||||
|
<meta name="twitter:label3" content="Replies">
|
||||||
|
<meta name="twitter:value3" content="{{ postView.ReplyCount }}">
|
||||||
|
{% endif -%}
|
||||||
|
{%- if postView.RepostCount %}
|
||||||
|
<meta name="twitter:label4" content="Reposts">
|
||||||
|
<meta name="twitter:value4" content="{{ postView.RepostCount }}">
|
||||||
|
{% endif -%}
|
||||||
|
<meta property="article:published_time" content="{{ postView.IndexedAt }}">
|
||||||
<link rel="alternate" type="application/json+oembed" href="https://embed.bsky.app/oembed?format=json&url={{ postView.Uri | urlencode }}" />
|
<link rel="alternate" type="application/json+oembed" href="https://embed.bsky.app/oembed?format=json&url={{ postView.Uri | urlencode }}" />
|
||||||
<link rel="alternate" href="{{ postView.Uri }}" />
|
<link rel="alternate" href="{{ postView.Uri }}" />
|
||||||
|
{%- elif requiresAuth and profileHandle -%}
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="profile:username" content="{{ profileHandle }}">
|
||||||
|
{%- if requestURI %}
|
||||||
|
<meta property="og:url" content="{{ requestURI }}">
|
||||||
|
<link rel="canonical" href="{{ requestURI|canonicalize_url }}" />
|
||||||
|
{% endif -%}
|
||||||
|
{%- if profileDisplayName %}
|
||||||
|
<meta property="og:title" content="{{ profileDisplayName }} (@{{ profileHandle }})">
|
||||||
|
{% else %}
|
||||||
|
<meta property="og:title" content="@{{ profileHandle }}">
|
||||||
|
{% endif -%}
|
||||||
|
<meta name="description" content="This post requires authentication to view.">
|
||||||
|
<meta property="og:description" content="This post requires authentication to view.">
|
||||||
|
<meta property="twitter:description" content="This post requires authentication to view.">
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
|
|
||||||
@@ -56,5 +85,11 @@
|
|||||||
<p id="bsky_post_text">{{ postText }}</p>
|
<p id="bsky_post_text">{{ postText }}</p>
|
||||||
<p id="bsky_post_indexedat">{{ postView.IndexedAt }}</p>
|
<p id="bsky_post_indexedat">{{ postView.IndexedAt }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
{%- elif requiresAuth and profileHandle -%}
|
||||||
|
<div id="bsky_post_summary">
|
||||||
|
<h3>Post</h3>
|
||||||
|
<p id="bsky_handle">{{ profileHandle }}</p>
|
||||||
|
<p id="bsky_post_text">This post requires authentication to view.</p>
|
||||||
|
</div>
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user