57 lines
2.4 KiB
Python
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()
|