如何解析deleted-tweets.js文件检索已删推文并生成类Twitter展示页面
处理Twitter归档deleted_tweets.js的实用方案
先提取有效数据
- 打开
deleted_tweets.js,找到开头的window.YTD.deleted_tweets.part0 =,把等号后面的JSON数组(从[到]的全部内容)复制出来,保存成新文件deleted_tweets.json。手机端可以用带代码高亮的文本编辑器(比如QuickEdit),更容易定位数组范围。
快速检索特定推文(手机端直接用)
- 用支持JSON搜索的手机APP(比如JSON Viewer)导入
deleted_tweets.json,直接搜关键词(文本、时间、媒体描述都可以)。 - 或者用手机浏览器打开在线JSON解析工具,粘贴JSON内容后用搜索功能查找目标推文。
生成类Twitter风格的可视化页面
方法1:手机/电脑通用的HTML页面
- 新建一个
tweets_viewer.html文件,粘贴以下代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>已删除推文查看器</title> <style> .tweet { border: 1px solid #e1e8ed; border-radius: 12px; padding: 12px; margin: 10px 0; max-width: 600px; margin-left: auto; margin-right: auto; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .tweet-time { color: #657786; font-size: 14px; margin-bottom: 8px; } .tweet-text { font-size: 15px; line-height: 1.5; margin-bottom: 12px; } .tweet-media { display: flex; flex-wrap: wrap; gap: 8px; } .tweet-media img, .tweet-media video { max-width: 100%; border-radius: 12px; flex: 1 1 calc(50% - 4px); } .container { padding: 20px; } h1 { text-align: center; color: #1da1f2; } </style> </head> <body> <div class="container"> <h1>已删除推文归档</h1> <div id="tweets-container"></div> </div> <script> // 把deleted_tweets.json里的数组内容粘贴到这里的[]中 const tweetsData = [ // 替换成你的JSON数据 ]; // 按创建时间升序排序 tweetsData.sort((a, b) => new Date(a.created_at) - new Date(b.created_at)); const container = document.getElementById('tweets-container'); tweetsData.forEach(tweet => { const tweetEl = document.createElement('div'); tweetEl.className = 'tweet'; // 渲染创建时间 const timeEl = document.createElement('div'); timeEl.className = 'tweet-time'; timeEl.textContent = new Date(tweet.created_at).toLocaleString(); tweetEl.appendChild(timeEl); // 渲染推文文本 const textEl = document.createElement('div'); textEl.className = 'tweet-text'; textEl.textContent = tweet.full_text; tweetEl.appendChild(textEl); // 渲染媒体内容 if (tweet.extended_entities?.media) { const mediaEl = document.createElement('div'); mediaEl.className = 'tweet-media'; tweet.extended_entities.media.forEach(media => { if (media.type === 'photo') { const img = document.createElement('img'); img.src = media.media_url_https; img.alt = '推文图片'; mediaEl.appendChild(img); } else if (media.type === 'video' || media.type === 'animated_gif') { // 选取最高质量的MP4源 const videoVariant = media.video_info.variants.find(v => v.content_type === 'video/mp4' && v.bitrate); if (videoVariant) { const video = document.createElement('video'); video.src = videoVariant.url; video.controls = true; video.alt = '推文视频'; mediaEl.appendChild(video); } } }); tweetEl.appendChild(mediaEl); } container.appendChild(tweetEl); }); </script> </body> </html>
- 把之前提取的
deleted_tweets.json里的数组内容,替换到代码中const tweetsData = [/* 这里替换 */];的方括号里。 - 在手机浏览器中打开这个HTML文件,就能看到按升序排列、带完整文本和媒体的类Twitter页面。
方法2:电脑端用Python脚本批量生成
- 安装Python后,新建
tweet_converter.py脚本:
import json from datetime import datetime # 读取JSON文件 with open('deleted_tweets.json', 'r', encoding='utf-8') as f: tweets = json.load(f) # 按创建时间升序排序 tweets.sort(key=lambda x: datetime.strptime(x['created_at'], '%a %b %d %H:%M:%S %z %Y')) # HTML模板 html_template = """ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>已删除推文查看器</title> <style> .tweet { border: 1px solid #e1e8ed; border-radius: 12px; padding: 12px; margin: 10px 0; max-width: 600px; margin-left: auto; margin-right: auto; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .tweet-time { color: #657786; font-size: 14px; margin-bottom: 8px; } .tweet-text { font-size: 15px; line-height: 1.5; margin-bottom: 12px; } .tweet-media { display: flex; flex-wrap: wrap; gap: 8px; } .tweet-media img, .tweet-media video { max-width: 100%; border-radius: 12px; flex: 1 1 calc(50% - 4px); } .container { padding: 20px; } h1 { text-align: center; color: #1da1f2; } </style> </head> <body> <div class="container"> <h1>已删除推文归档</h1> {tweets_html} </div> </body> </html> """ # 生成单条推文的HTML tweets_html = '' for tweet in tweets: # 格式化时间为易读格式 created_at = datetime.strptime(tweet['created_at'], '%a %b %d %H:%M:%S %z %Y').strftime('%Y-%m-%d %H:%M:%S') media_html = '' # 处理媒体内容 if 'extended_entities' in tweet and 'media' in tweet['extended_entities']: media_html = '<div class="tweet-media">' for media in tweet['extended_entities']['media']: if media['type'] == 'photo': media_html += f'<img src="{media["media_url_https"]}" alt="推文图片">' elif media['type'] in ['video', 'animated_gif']: # 筛选MP4格式并按比特率取最高质量 video_variants = [v for v in media['video_info']['variants'] if v['content_type'] == 'video/mp4'] if video_variants: video_variants.sort(key=lambda x: x.get('bitrate', 0), reverse=True) media_html += f'<video src="{video_variants[0]["url"]}" controls alt="推文视频">' media_html += '</div>' # 拼接单条推文HTML tweet_html = f''' <div class="tweet"> <div class="tweet-time">{created_at}</div> <div class="tweet-text">{tweet["full_text"]}</div> {media_html} </div> ''' tweets_html += tweet_html # 写入最终HTML文件 with open('deleted_tweets_viewer.html', 'w', encoding='utf-8') as f: f.write(html_template.format(tweets_html=tweets_html))
- 把
deleted_tweets.json和脚本放在同一文件夹,运行命令:python tweet_converter.py,会自动生成可视化页面文件deleted_tweets_viewer.html。
注意事项
- 推文里的图片、视频都是调用Twitter的CDN链接,如果Twitter后续关闭这些归档资源的访问权限,媒体内容可能无法加载。
- 手机端编辑大文件时,尽量用性能较好的文本编辑器,避免卡顿。
内容的提问来源于stack exchange,提问作者Moonlight 23
相关产品推荐
相关产品推荐

