爬虫17.C语言下载单个抖音视频
C语言下载抖音单个视频
1. C语言下载抖音中允许下载的视频
抓包链接与
referer链接
1
https://v3-web.douyinvod.com/1e38c9dd42162f7782ea9d854d4097b3/67c5c8fb/video/tos/cn/tos-cn-ve-15c001-alinc2/owgBYhVVyA92HmxCAzBYEdIjfQbIDENeiA84bF/?a=6383&ch=11&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=1137&bt=1137&cs=0&ds=6&ft=khyHAB1UiiuGK.rjCdOC~49Zyo3nOz7_SX-CpMyDRAGuYIQ2B226zG8NTJia_Xd.o~&mime_type=video_mp4&qs=0&rc=NzplaWg8NWVoaWdlZjdkOkBpajlvaTU6ZnJkbjMzNGkzM0BeYTQxNTE2NTIxNV9jMjBhYSMvZS9wcjRnb2FgLS1kLTBzcw%3D%3D&btag=c0000e00008000&cquery=100x_100z_100o_101n_100B&dy_q=1741004477&feature_id=f0150a16a324336cda5d6dd0b69ed299&l=20250303202117F6DA984968B4A215E039&testst=1741004492544
referer
1
https://www.douyin.com/
抓包到的链接在浏览器中可以直接播放,但是在html中的video标签不能播放,与B站刚好相反。
代码中对B站与抖音发送http/https请求都需要构造请求头
User-Agent与referer才允许访问。编写代码
访问抓包到的链接,下载视频后打印状态码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62#include <stdio.h>
#include <curl/curl.h>
// 回调函数,用于写入接收到的数据到文件
size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
int main(void) {
CURL* curl;
CURLcode res;
long response_code = 0;
struct curl_slist* headers = NULL;
FILE* fp;
// 初始化libcurl
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
// 打开文件用于写入
fp = fopen("video.mp4", "wb");
if (!fp) {
fprintf(stderr, "Could not open file for writing\n");
return 1;
}
// 设置要访问的网址
curl_easy_setopt(curl, CURLOPT_URL, "https://v3-web.douyinvod.com/1e38c9dd42162f7782ea9d854d4097b3/67c5c8fb/video/tos/cn/tos-cn-ve-15c001-alinc2/owgBYhVVyA92HmxCAzBYEdIjfQbIDENeiA84bF/?a=6383&ch=11&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=1137&bt=1137&cs=0&ds=6&ft=khyHAB1UiiuGK.rjCdOC~49Zyo3nOz7_SX-CpMyDRAGuYIQ2B226zG8NTJia_Xd.o~&mime_type=video_mp4&qs=0&rc=NzplaWg8NWVoaWdlZjdkOkBpajlvaTU6ZnJkbjMzNGkzM0BeYTQxNTE2NTIxNV9jMjBhYSMvZS9wcjRnb2FgLS1kLTBzcw%3D%3D&btag=c0000e00008000&cquery=100x_100z_100o_101n_100B&dy_q=1741004477&feature_id=f0150a16a324336cda5d6dd0b69ed299&l=20250303202117F6DA984968B4A215E039&testst=1741004492544");
// 添加请求头
headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36");
headers = curl_slist_append(headers, "Accept: */*");
headers = curl_slist_append(headers, "referer: https://www.douyin.com/");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 设置回调函数,用于写入数据到文件
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
// 执行请求
res = curl_easy_perform(curl);
// 检查请求是否成功
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
else {
// 获取HTTP响应状态码
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
printf("HTTP Response Status Code: %ld\n", response_code);
}
// 清理
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
fclose(fp);
}
curl_global_cleanup();
return 0;
}编译后运行
下载成功。
2. 下载抖音中禁止下载的视频
抓包链接
1
https://v3-web.douyinvod.com/bc03c7ce33b306a7f233e44fef7cd7bd/67c6efb9/video/tos/cn/tos-cn-ve-15/oY5DArfDCR6C9gnAZfm8FpotSBnAmEMAFAAtAg/media-video-hvc1/?a=6383&ch=0&cr=8&dr=0&er=1&lr=default&cd=0%7C0%7C0%7C3&cv=1&br=309&bt=309&cs=4&ds=4&mime_type=video_mp4&qs=0&rc=OjY5O2c7NTRmOTs7NTpnaUBpM25xO3c5cmVneDMzNGkzM0A0Xi1jLWIzNmMxLWJgYjIxYSNjLWIzMmRjM2dgLS1kLS9zcw%3D%3D&btag=c0000e00030000&cquery=101r_100o&dy_q=1741003896&l=202503032011365D82A279F6D8D313A7F3
替换之前代码中的https链接编译运行
下载成功
3.下载视频与音频并合并到同一个文件中
抓包链接
视频链接
1
https://v3-web.douyinvod.com/bc03c7ce33b306a7f233e44fef7cd7bd/67c6efb9/video/tos/cn/tos-cn-ve-15/oY5DArfDCR6C9gnAZfm8FpotSBnAmEMAFAAtAg/media-video-hvc1/?a=6383&ch=0&cr=8&dr=0&er=1&lr=default&cd=0%7C0%7C0%7C3&cv=1&br=309&bt=309&cs=4&ds=4&mime_type=video_mp4&qs=0&rc=OjY5O2c7NTRmOTs7NTpnaUBpM25xO3c5cmVneDMzNGkzM0A0Xi1jLWIzNmMxLWJgYjIxYSNjLWIzMmRjM2dgLS1kLS9zcw%3D%3D&btag=c0000e00030000&cquery=101r_100o&dy_q=1741003896&l=202503032011365D82A279F6D8D313A7F3
音频链接
1
https://v3-web.douyinvod.com/1e990e593bec7852a67ffc2181320208/67c6efb9/video/tos/cn/tos-cn-ve-15/oY5DArfDCR6C9gnAZfm8FpotSBnAmEMAFAAtAg/media-audio-und-mp4a/?a=6383&ch=0&cr=8&dr=0&er=1&lr=default&cd=0%7C0%7C0%7C3&cv=1&br=189&bt=189&cs=4&mime_type=video_mp4&qs=0&rc=aTlmaDg5NmQzOTc5aDpmaEBpM25xO3c5cmVneDMzNGkzM0A0LS5iNGNhLzY1YC4uNC5jYSNjLWIzMmRjM2dgLS1kLS9zcw%3D%3D&btag=c0000e00030000&cquery=101r_100o&dy_q=1741003896&l=202503032011365D82A279F6D8D313A7F3
编写代码,使用FFMPEG合并视频
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// 回调函数,用于写入接收到的数据到文件
size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
// 下载函数
int download_file(const char* url, const char* filename) {
CURL* curl;
CURLcode res;
long response_code = 0;
struct curl_slist* headers = NULL;
FILE* fp;
fp = fopen(filename, "wb");
if (!fp) {
fprintf(stderr, "Could not open file %s for writing\n", filename);
return 1;
}
curl = curl_easy_init();
if (!curl) {
fclose(fp);
return 1;
}
curl_easy_setopt(curl, CURLOPT_URL, url);
// 添加请求头
headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36");
headers = curl_slist_append(headers, "Accept: */*");
headers = curl_slist_append(headers, "referer: https://www.douyin.com/");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "Download failed for %s: %s\n", filename, curl_easy_strerror(res));
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
fclose(fp);
return 1;
}
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
printf("HTTP Response Status Code for %s: %ld\n", filename, response_code);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
fclose(fp);
return 0;
}
// 合并视频和音频文件
int merge_files() {
char command[512];
snprintf(command, sizeof(command),
"ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4");
int result = system(command);
if (result != 0) {
fprintf(stderr, "Error merging files\n");
return 1;
}
return 0;
}
int main(void) {
// 初始化libcurl
curl_global_init(CURL_GLOBAL_DEFAULT);
// 视频URL和音频URL(需要替换为实际的URL)
const char* video_url = "https://v3-web.douyinvod.com/bc03c7ce33b306a7f233e44fef7cd7bd/67c6efb9/video/tos/cn/tos-cn-ve-15/oY5DArfDCR6C9gnAZfm8FpotSBnAmEMAFAAtAg/media-video-hvc1/?a=6383&ch=0&cr=8&dr=0&er=1&lr=default&cd=0%7C0%7C0%7C3&cv=1&br=309&bt=309&cs=4&ds=4&mime_type=video_mp4&qs=0&rc=OjY5O2c7NTRmOTs7NTpnaUBpM25xO3c5cmVneDMzNGkzM0A0Xi1jLWIzNmMxLWJgYjIxYSNjLWIzMmRjM2dgLS1kLS9zcw%3D%3D&btag=c0000e00030000&cquery=101r_100o&dy_q=1741003896&l=202503032011365D82A279F6D8D313A7F3";
const char* audio_url = "https://v3-web.douyinvod.com/1e990e593bec7852a67ffc2181320208/67c6efb9/video/tos/cn/tos-cn-ve-15/oY5DArfDCR6C9gnAZfm8FpotSBnAmEMAFAAtAg/media-audio-und-mp4a/?a=6383&ch=0&cr=8&dr=0&er=1&lr=default&cd=0%7C0%7C0%7C3&cv=1&br=189&bt=189&cs=4&mime_type=video_mp4&qs=0&rc=aTlmaDg5NmQzOTc5aDpmaEBpM25xO3c5cmVneDMzNGkzM0A0LS5iNGNhLzY1YC4uNC5jYSNjLWIzMmRjM2dgLS1kLS9zcw%3D%3D&btag=c0000e00030000&cquery=101r_100o&dy_q=1741003896&l=202503032011365D82A279F6D8D313A7F3";
// 下载视频文件
if (download_file(video_url, "video.mp4") != 0) {
curl_global_cleanup();
return 1;
}
// 下载音频文件
if (download_file(audio_url, "audio.mp3") != 0) {
curl_global_cleanup();
return 1;
}
// 合并文件
if (merge_files() != 0) {
curl_global_cleanup();
return 1;
}
curl_global_cleanup();
printf("Download and merge completed successfully!\n");
return 0;
}
4. 编写代码,使用FFMPEG库 合并视频
1 |
|
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
