Files
kefu/im/.deploy/inspect-nearby-media.py
2026-09-03 08:38:17 +08:00

57 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""Read-only production check for nearby-card post media."""
import json
import sys
import urllib.request
from urllib.parse import urlsplit, urlunsplit
sys.path.insert(0, "/www/server/xingyu-im/ops")
from baota_publish_test_users import database, env_values, query
values = env_values()
assert values["IM_ENV"] == "production"
connection, _ = database(values)
try:
totals = query(connection, "SELECT COUNT(*),(SELECT COUNT(*) FROM post_media) FROM posts WHERE status=1 AND deleted_at IS NULL")[0]
posts = query(
connection,
"SELECT post.id,user.public_id,profile.nickname,post.created_at,COUNT(media.id) "
"FROM posts post JOIN users user ON user.id=post.user_id JOIN user_profiles profile ON profile.user_id=user.id "
"LEFT JOIN post_media media ON media.post_id=post.id "
"WHERE post.status=1 AND post.deleted_at IS NULL GROUP BY post.id,user.public_id,profile.nickname,post.created_at "
"ORDER BY post.created_at DESC,post.id DESC LIMIT 20",
)
media_rows = query(
connection,
"SELECT media.post_id,media.media_url FROM post_media media JOIN posts post ON post.id=media.post_id "
"WHERE post.status=1 AND post.deleted_at IS NULL ORDER BY post.created_at DESC,media.sort_order,media.id LIMIT 12",
)
checked = []
for post_id, raw_url in media_rows:
parts = urlsplit(raw_url)
public_url = urlunsplit((parts.scheme, parts.netloc, parts.path, "", ""))
request = urllib.request.Request(raw_url, method="HEAD", headers={"User-Agent": "xingyu-media-audit/1"})
try:
with urllib.request.urlopen(request, timeout=20) as response:
checked.append({
"postId": post_id,
"url": public_url,
"status": response.status,
"type": response.headers.get_content_type(),
"bytes": int(response.headers.get("Content-Length") or 0),
})
except Exception as error:
checked.append({"postId": post_id, "url": public_url, "error": type(error).__name__})
print(json.dumps({
"publishedPosts": totals[0],
"postMediaRows": totals[1],
"recentPosts": [
{"id": row[0], "publicId": row[1], "nickname": row[2], "createdAt": str(row[3]), "mediaCount": row[4]}
for row in posts
],
"media": checked,
}, ensure_ascii=False))
finally:
connection.close()