You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析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页面

  1. 新建一个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>
  1. 把之前提取的deleted_tweets.json里的数组内容,替换到代码中const tweetsData = [/* 这里替换 */];的方括号里。
  2. 在手机浏览器中打开这个HTML文件,就能看到按升序排列、带完整文本和媒体的类Twitter页面。

方法2:电脑端用Python脚本批量生成

  1. 安装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))
  1. 把deleted_tweets.json和脚本放在同一文件夹,运行命令:python tweet_converter.py,会自动生成可视化页面文件deleted_tweets_viewer.html。

注意事项

  • 推文里的图片、视频都是调用Twitter的CDN链接,如果Twitter后续关闭这些归档资源的访问权限,媒体内容可能无法加载。
  • 手机端编辑大文件时,尽量用性能较好的文本编辑器,避免卡顿。

内容的提问来源于stack exchange,提问作者Moonlight 23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:37:08