前缀、文档修改记录
20241205 初始化编辑此文章,完稿
章节1、需求描述
日常刷X/Twitter的话,经常看到一些有趣的视频,想要随手保存下来,这个需求,其实应该还是蛮普遍的。
本篇博客,不同于以往的下载方式,本篇介绍了组合使用 服务器 / youtube-dl / rsync的方式,可以非常便捷地下载X/Twitter视频了。
章节2、简略架构拓扑图
2.1、 环境说明:
1、 日常使用的苹果手机 * 1 ,里面配置章节4的捷径
2、 API服务器,操作系统Debian,安装了youtube-dl / ffmpeg / python3 / rysnc, python3的库调用了 Flask, request, jsonify,定义了一个临时存储视频的目录 /var/www/html/shortsv/
3、家里的服务器,挂载了NAS的存储路径,使用定时的rsync同步,小时粒度,同步视频文件到家里的NAS存储。
2.2、 流量说明:
1、 苹果手机,日常用的X/Twitter客户端,如果刷到某个视频,则通过分享按钮,分享到捷径里的接口
2、捷径里,本质就是一个JSON传参数,把刚刚的X/Twitter的视频地址,传给服务器的API接口
3、服务器的API接口,接受到传参,调用已部署的youtube-dl/ffmpeg程序,下载并合并对应的视频
4、家里的Linux服务器,通过rsync每小时定时下载并同步服务器对应目录下的视频,下载到挂载的NAS目录里,下载动作完成后,清空远程服务器上的视频目录下的所有视频文件。
2.3、 优势分析
- 成本低: 相比于充值X/Twitter会员,该方式可以下载高清的视频,还是很棒的,海外服务器挑个便宜的买就行。
- 省手机流量: 相比于原先必须在手机上喊机器人跳出下载链接,手机上另存到相册,这个方式直接是文本传参,家里的NAS同步服务器下载的视频,没有Double手机流量的消耗,毕竟不是随时随地有WIFI。
- 操作简单: 苹果手机上,在视频下方,直接调用捷径,等待在远端服务器上下载完成的提示即可。
章节3、 海外的远端服务器上的接口代码
如下,简略版本的,更容易维护,不过最好每次让请求都通过VPN走,不要明文传递参数到海外的服务器。
需要自定义的参数
var_cookies: 比选参数,这个是你本地浏览器登录了Twitter后,用浏览器插件Get cookies.txt LOCALLY导出的cookies.txt var_listen_port: 可选修改,这个是API接口的在远程服务器上的监听端口
# 远程服务器上,需要执行的命令 apt update apt install ffmpeg rsync python3 mkdir -p /var/www/html/shortsv/ wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.12.03/yt-dlp -O /usr/bin/yt-dlp chmod +x /usr/bin/yt-dlp
#!/usr/bin/python3 # -*- coding: utf-8 -*- # 2024-7-30 # 注意点: 创建路径 mkdir -p /var/www/html/shortsv/ # 作者:Dasmz from flask import Flask, request, jsonify import subprocess import json import datetime app = Flask(__name__) var_listen_port = 9999 var_cookies = '/root/sh/cookies.txt' # --cookies-from-browser chrome --cookies cookies.txt def getNow(): return datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") @app.route('/', methods=['GET']) def return_index(): return '<p>THE API INTERFACE WORKS OK. TIME: %s</p>' % getNow(), 200 @app.route('/getV', methods=['POST']) def download_video(): data = request.json print(json.dumps(data)) twitter_url = data.get('twitter_url') if 'x.com' not in twitter_url: return jsonify({'error': 'Missing URL DATA'}), 400 try: o_filename = '/var/www/html/shortsv/%s' % getNow() output = subprocess.check_output(['/usr/bin/yt-dlp', '-k', '--cookies',var_cookies,'-o', o_filename +'.%(ext)s', twitter_url]) return jsonify({'message': 'Video downloaded successfully'}), 200 except subprocess.CalledProcessError as e: return jsonify({'error': str(e)}), 500 if __name__ == '__main__': app.run(host='0.0.0.0',port=var_listen_port)
章节4、苹果手机的捷径
https://www.icloud.com/shortcuts/4ce720db10a446008e9fad7c18d5feb1
需要自定义的参数是,传参至的远程的海外API服务器地址
章节5、 国内的家里的服务器的配置
配置定时同步的程序,每日自动重启任务,路径 /root/sh/restart_rsyncdata_service.sh
#!/bin/bash # NAME: /root/sh/restart_rsyncdata_service.sh # PATH cd /root/sh/ # STOP echo "<+> STOP THE SERVICE" /usr/bin/ps -ef | grep rsyncdata_shorts | grep -v grep | awk '{print $2}' | xargs kill -9 echo "<+> STOP THE SERVICE. DONE" # START echo "<+> START THE SERVICE" /usr/bin/nohup /root/sh/rsyncdata_shorts.sh 2>&1 > /root/sh/Log_rsyncdata_shorts.log & echo "<+> START THE SERVICE. DONE" # END root@JellyfinServer:~#
文件 /root/sh/rsyncdata_shorts.sh, 如下内容
#!/bin/bash # NAME: /root/sh/rsyncdata_shorts.sh # /media/TV/HDD0104TB/ShortsV/ 本地存储路径 for i in `seq 0 24` do date > /root/sh/rsyncdata_shorts.timestamp.dat /usr/bin/ssh -i /root/sh/key_id_rsa_2048.key -p 22 root@你服务器的IP地址 'rm -r /var/www/html/shortsv/*fhls*' /usr/bin/rsync -avz -e "ssh -i /root/sh/key_id_rsa_2048.key -p 22" --progress root@你服务器的IP地址:/var/www/html/shortsv/*mp4 /media/TV/HDD0104TB/ShortsV/ /usr/bin/ssh -i /root/sh/key_id_rsa_2048.key -p 22 root@你服务器的IP地址 'rm -r /var/www/html/shortsv/*' /usr/bin/sleep 3600 date >> /root/sh/rsyncdata_shorts.timestamp.dat done # END
定时任务
# rsync 数据 shorts短视频数据 59 1 * * * /root/sh/restart_rsyncdata_service.sh 2>&1 > /root/sh/Log_restart_rsyncdata_service.log
附录1、视频操作演示
000156. 都快2025年了,来看看我如何下载X/Twitter视频 2024-12-05 本期博客地址 https://dasmz.com/?p=4334 本期视频地址 https://youtu.be/pIDbwmerGj0
附录2、@Dasmz
博客内,所有教程为手打原创教程,如果技术教程对您有所帮助,欢迎打赏作者。技术层面,闻道有先后,如有疏漏、错误,欢迎指正。技术博客的内容,一般具有一定的环境依赖,具有一定的年代依赖,酌情参考其中的内容,请勿完全照搬照抄。
对于博客内已提及的专业知识,如果需要技术指导,欢迎联系我,仅需支付工时费
Twitter: Dasmz
Youtube: @DasmzStudio
Telegram: @Dasmz