pookz@stme commited on
Commit
5ee0f26
·
1 Parent(s): eb6573b

add bilibili uploader

Browse files
README.MD CHANGED
@@ -6,7 +6,7 @@ social-auto-upload 该项目旨在自动化发布视频到各个社交媒体平
6
  - 中国主流社交媒体平台:
7
  - 抖音
8
  - 视频号
9
- - bilibili(todo)
10
  - 小红书
11
  - 快手(todo)
12
 
@@ -148,6 +148,17 @@ https://github.com/requireCool/stealth.min.js
148
 
149
  ---
150
 
 
 
 
 
 
 
 
 
 
 
 
151
  ### 其余部分(todo)
152
  整理后上传
153
 
 
6
  - 中国主流社交媒体平台:
7
  - 抖音
8
  - 视频号
9
+ - bilibili
10
  - 小红书
11
  - 快手(todo)
12
 
 
148
 
149
  ---
150
 
151
+ ### 5. bilibili
152
+ 该实现,借助biliup的[biliup](https://github.com/biliup/biliup),再次感谢。
153
+ 1. 准备视频目录结构
154
+ 2. cookie获取:`biliup.exe -u account.json login` 选项你喜欢的登录方式
155
+ ![登录方式](media/get_bili_cookie.png)
156
+ 3. 上传视频:upload_video_to_bilibili.py
157
+
158
+
159
+
160
+
161
+
162
  ### 其余部分(todo)
163
  整理后上传
164
 
bilibili_uploader/__init__.py ADDED
File without changes
bilibili_uploader/main.py ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import pathlib
3
+ import random
4
+ from biliup.plugins.bili_webup import BiliBili, Data
5
+
6
+
7
+ def extract_keys_from_json(data):
8
+ """Extract specified keys from the provided JSON data."""
9
+ keys_to_extract = ["SESSDATA", "bili_jct", "DedeUserID__ckMd5", "DedeUserID", "access_token"]
10
+ extracted_data = {}
11
+
12
+ # Extracting cookie data
13
+ for cookie in data['cookie_info']['cookies']:
14
+ if cookie['name'] in keys_to_extract:
15
+ extracted_data[cookie['name']] = cookie['value']
16
+
17
+ # Extracting access_token
18
+ if "access_token" in data['token_info']:
19
+ extracted_data['access_token'] = data['token_info']['access_token']
20
+
21
+ return extracted_data
22
+
23
+
24
+ def read_cookie_json_file(filepath: pathlib.Path):
25
+ with open(filepath, 'r', encoding='utf-8') as file:
26
+ content = json.load(file)
27
+ return content
28
+
29
+
30
+ def random_emoji():
31
+ emoji_list = ["🍏", "🍎", "🍊", "🍋", "🍌", "🍉", "🍇", "🍓", "🍈", "🍒", "🍑", "🍍", "🥭", "🥥", "🥝",
32
+ "🍅", "🍆", "🥑", "🥦", "🥒", "🥬", "🌶", "🌽", "🥕", "🥔", "🍠", "🥐", "🍞", "🥖", "🥨", "🥯", "🧀", "🥚", "🍳", "🥞",
33
+ "🥓", "🥩", "🍗", "🍖", "🌭", "🍔", "🍟", "🍕", "🥪", "🥙", "🌮", "🌯", "🥗", "🥘", "🥫", "🍝", "🍜", "🍲", "🍛", "🍣",
34
+ "🍱", "🥟", "🍤", "🍙", "🍚", "🍘", "🍥", "🥮", "🥠", "🍢", "🍡", "🍧", "🍨", "🍦", "🥧", "🍰", "🎂", "🍮", "🍭", "🍬",
35
+ "🍫", "🍿", "🧂", "🍩", "🍪", "🌰", "🥜", "🍯", "🥛", "🍼", "☕️", "🍵", "🥤", "🍶", "🍻", "🥂", "🍷", "🥃", "🍸", "🍹",
36
+ "🍾", "🥄", "🍴", "🍽", "🥣", "🥡", "🥢"]
37
+ return random.choice(emoji_list)
38
+
39
+
40
+ class BilibiliUploader(object):
41
+ def __init__(self, cookie_data, file: pathlib.Path, title, desc, tid, tags, dtime):
42
+ self.upload_thread_num = 3
43
+ self.copyright = 1
44
+ self.lines = 'AUTO'
45
+ self.cookie_data = cookie_data
46
+ self.file = file
47
+ self.title = title
48
+ self.desc = desc
49
+ self.tid = tid
50
+ self.tags = tags
51
+ self.dtime = dtime
52
+ self._init_data()
53
+
54
+ def _init_data(self):
55
+ self.data = Data()
56
+ self.data.copyright = self.copyright
57
+ self.data.title = self.title
58
+ self.data.desc = self.desc
59
+ self.data.tid = self.tid
60
+ self.data.set_tag(self.tags)
61
+ self.data.dtime = self.dtime
62
+
63
+ def upload(self):
64
+ with BiliBili(self.data) as bili:
65
+ bili.login_by_cookies(self.cookie_data)
66
+ bili.access_token = self.cookie_data.get('access_token')
67
+ video_part = bili.upload_file(str(self.file), lines=self.lines,
68
+ tasks=self.upload_thread_num) # 上传视频,默认线路AUTO自动选择,线程数量3。
69
+ video_part['title'] = self.title
70
+ self.data.append(video_part)
71
+ ret = bili.submit() # 提交视频
72
+ if ret.get('code') == 0:
73
+ print(f'[+] {self.file.name}上传 成功')
74
+ return True
75
+ else:
76
+ print(f'[-] {self.file.name}上传 失败, error messge: {ret.get("message")}')
77
+ return False
examples/get_bilibili_cookie.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # cd bilibili_uploader
2
+ # biliup.exe -u account.json login
examples/upload_video_to_bilibili.py ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ from pathlib import Path
3
+
4
+ from bilibili_uploader.main import read_cookie_json_file, extract_keys_from_json, random_emoji, BilibiliUploader
5
+ from conf import BASE_DIR
6
+ from utils.constant import VideoZoneTypes
7
+ from utils.files_times import generate_schedule_time_next_day, get_title_and_hashtags
8
+
9
+ if __name__ == '__main__':
10
+ filepath = Path(BASE_DIR) / "videos"
11
+ # how to get cookie, see the file of get_bilibili_cookie.py.
12
+ account_file = Path(BASE_DIR / "bilibili_uploader" / "account.json")
13
+ if not account_file.exists():
14
+ print(f"{account_file.name} 配置文件不存在")
15
+ exit()
16
+ cookie_data = read_cookie_json_file(account_file)
17
+ cookie_data = extract_keys_from_json(cookie_data)
18
+
19
+ tid = VideoZoneTypes.SPORTS_FOOTBALL.value # 设置分区id
20
+ # 获取视频目录
21
+ folder_path = Path(filepath)
22
+ # 获取文件夹中的所有文件
23
+ files = list(folder_path.glob("*.mp4"))
24
+ file_num = len(files)
25
+ timestamps = generate_schedule_time_next_day(file_num, 1, daily_times=[16], timestamps=True)
26
+
27
+ for index, file in enumerate(files):
28
+ title, tags = get_title_and_hashtags(str(file))
29
+ # just avoid error, bilibili don't allow same title of video.
30
+ title += random_emoji()
31
+ tags_str = ','.join([tag for tag in tags])
32
+ # 打印视频文件名、标题和 hashtag
33
+ print(f"视频文件名:{file}")
34
+ print(f"标题:{title}")
35
+ print(f"Hashtag:{tags}")
36
+ # I set desc same as title, do what u like.
37
+ desc = title
38
+ bili_uploader = BilibiliUploader(cookie_data, file, title, desc, tid, tags, timestamps[index])
39
+ bili_uploader.upload()
40
+
41
+ # life is beautiful don't so rush. be kind be patience
42
+ time.sleep(30)
requirements.txt CHANGED
@@ -2,4 +2,5 @@ requests
2
  playwright
3
  eventlet
4
  schedule
5
- cf_clearance
 
 
2
  playwright
3
  eventlet
4
  schedule
5
+ cf_clearance
6
+ biliup
utils/constant.py CHANGED
@@ -26,3 +26,284 @@ class TencentZoneTypes(enum.Enum):
26
  ANIMALS = '动物'
27
  PARENTING = '育儿'
28
  TECHNOLOGY = '科技'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  ANIMALS = '动物'
27
  PARENTING = '育儿'
28
  TECHNOLOGY = '科技'
29
+
30
+ class VideoZoneTypes(enum.Enum):
31
+ """
32
+ 所有分区枚举
33
+
34
+ - MAINPAGE: 主页
35
+ - ANIME: 番剧
36
+ - ANIME_SERIAL: 连载中番剧
37
+ - ANIME_FINISH: 已完结番剧
38
+ - ANIME_INFORMATION: 资讯
39
+ - ANIME_OFFICAL: 官方延伸
40
+ - MOVIE: 电影
41
+ - GUOCHUANG: 国创
42
+ - GUOCHUANG_CHINESE: 国产动画
43
+ - GUOCHUANG_ORIGINAL: 国产原创相关
44
+ - GUOCHUANG_PUPPETRY: 布袋戏
45
+ - GUOCHUANG_MOTIONCOMIC: 动态漫·广播剧
46
+ - GUOCHUANG_INFORMATION: 资讯
47
+ - TELEPLAY: 电视剧
48
+ - DOCUMENTARY: 纪录片
49
+ - DOUGA: 动画
50
+ - DOUGA_MAD: MAD·AMV
51
+ - DOUGA_MMD: MMD·3D
52
+ - DOUGA_VOICE: 短片·手书·配音
53
+ - DOUGA_GARAGE_KIT: 手办·模玩
54
+ - DOUGA_TOKUSATSU: 特摄
55
+ - DOUGA_ACGNTALKS: 动漫杂谈
56
+ - DOUGA_OTHER: 综合
57
+ - GAME: 游戏
58
+ - GAME_STAND_ALONE: 单机游戏
59
+ - GAME_ESPORTS: 电子竞技
60
+ - GAME_MOBILE: 手机游戏
61
+ - GAME_ONLINE: 网络游戏
62
+ - GAME_BOARD: 桌游棋牌
63
+ - GAME_GMV: GMV
64
+ - GAME_MUSIC: 音游
65
+ - GAME_MUGEN: Mugen
66
+ - KICHIKU: 鬼畜
67
+ - KICHIKU_GUIDE: 鬼畜调教
68
+ - KICHIKU_MAD: 音MAD
69
+ - KICHIKU_MANUAL_VOCALOID: 人力VOCALOID
70
+ - KICHIKU_THEATRE: 鬼畜剧场
71
+ - KICHIKU_COURSE: 教程演示
72
+ - MUSIC: 音乐
73
+ - MUSIC_ORIGINAL: 原创音乐
74
+ - MUSIC_COVER: 翻唱
75
+ - MUSIC_PERFORM: 演奏
76
+ - MUSIC_VOCALOID: VOCALOID·UTAU
77
+ - MUSIC_LIVE: 音乐现场
78
+ - MUSIC_MV: MV
79
+ - MUSIC_COMMENTARY: 乐评盘点
80
+ - MUSIC_TUTORIAL: 音乐教学
81
+ - MUSIC_OTHER: 音乐综合
82
+ - DANCE: 舞蹈
83
+ - DANCE_OTAKU: 宅舞
84
+ - DANCE_HIPHOP: 街舞
85
+ - DANCE_STAR: 明星舞蹈
86
+ - DANCE_CHINA: 中国舞
87
+ - DANCE_THREE_D: 舞蹈综合
88
+ - DANCE_DEMO: 舞蹈教程
89
+ - CINEPHILE: 影视
90
+ - CINEPHILE_CINECISM: 影视杂谈
91
+ - CINEPHILE_MONTAGE: 影视剪辑
92
+ - CINEPHILE_SHORTFILM: 小剧场
93
+ - CINEPHILE_TRAILER_INFO: 预告·资讯
94
+ - ENT: 娱乐
95
+ - ENT_VARIETY: 综艺
96
+ - ENT_TALKER: 娱乐杂谈
97
+ - ENT_FANS: 粉丝创作
98
+ - ENT_CELEBRITY: 明星综合
99
+ - KNOWLEDGE: 知识
100
+ - KNOWLEDGE_SCIENCE: 科学科普
101
+ - KNOWLEDGE_SOCIAL_SCIENCE: 社科·法律·心理
102
+ - KNOWLEDGE_HUMANITY_HISTORY: 人文历史
103
+ - KNOWLEDGE_BUSINESS: 财经商业
104
+ - KNOWLEDGE_CAMPUS: 校园学习
105
+ - KNOWLEDGE_CAREER: 职业职场
106
+ - KNOWLEDGE_DESIGN: 设计·创意
107
+ - KNOWLEDGE_SKILL: 野生技能协会
108
+ - TECH: 科技
109
+ - TECH_DIGITAL: 数码
110
+ - TECH_APPLICATION: 软件应用
111
+ - TECH_COMPUTER_TECH: 计算机技术
112
+ - TECH_INDUSTRY: 科工机械
113
+ - INFORMATION: 资讯
114
+ - INFORMATION_HOTSPOT: 热点
115
+ - INFORMATION_GLOBAL: 环球
116
+ - INFORMATION_SOCIAL: 社会
117
+ - INFORMATION_MULTIPLE: 综合
118
+ - FOOD: 美食
119
+ - FOOD_MAKE: 美食制作
120
+ - FOOD_DETECTIVE: 美食侦探
121
+ - FOOD_MEASUREMENT: 美食测评
122
+ - FOOD_RURAL: 田园美食
123
+ - FOOD_RECORD: 美食记录
124
+ - LIFE: 生活
125
+ - LIFE_FUNNY: 搞笑
126
+ - LIFE_TRAVEL: 出行
127
+ - LIFE_RURALLIFE: 三农
128
+ - LIFE_HOME: 家居房产
129
+ - LIFE_HANDMAKE: 手工
130
+ - LIFE_PAINTING: 绘画
131
+ - LIFE_DAILY: 日常
132
+ - CAR: 汽车
133
+ - CAR_RACING: 赛车
134
+ - CAR_MODIFIEDVEHICLE: 改装玩车
135
+ - CAR_NEWENERGYVEHICLE: 新能源车
136
+ - CAR_TOURINGCAR: 房车
137
+ - CAR_MOTORCYCLE: 摩托车
138
+ - CAR_STRATEGY: 购车攻略
139
+ - CAR_LIFE: 汽车生活
140
+ - FASHION: 时尚
141
+ - FASHION_MAKEUP: 美妆护肤
142
+ - FASHION_COS: 仿妆cos
143
+ - FASHION_CLOTHING: 穿搭
144
+ - FASHION_TREND: 时尚潮流
145
+ - SPORTS: 运动
146
+ - SPORTS_BASKETBALL: 篮球
147
+ - SPORTS_FOOTBALL: 足球
148
+ - SPORTS_AEROBICS: 健身
149
+ - SPORTS_ATHLETIC: 竞技体育
150
+ - SPORTS_CULTURE: 运动文化
151
+ - SPORTS_COMPREHENSIVE: 运动综合
152
+ - ANIMAL: 动物圈
153
+ - ANIMAL_CAT: 喵星人
154
+ - ANIMAL_DOG: 汪星人
155
+ - ANIMAL_PANDA: 大熊猫
156
+ - ANIMAL_WILD_ANIMAL: 野生动物
157
+ - ANIMAL_REPTILES: 爬宠
158
+ - ANIMAL_COMPOSITE: 动物综合
159
+ - VLOG: VLOG
160
+ """
161
+
162
+ MAINPAGE = 0
163
+
164
+ ANIME = 13
165
+ ANIME_SERIAL = 33
166
+ ANIME_FINISH = 32
167
+ ANIME_INFORMATION = 51
168
+ ANIME_OFFICAL = 152
169
+
170
+ MOVIE = 23
171
+
172
+ GUOCHUANG = 167
173
+ GUOCHUANG_CHINESE = 153
174
+ GUOCHUANG_ORIGINAL = 168
175
+ GUOCHUANG_PUPPETRY = 169
176
+ GUOCHUANG_MOTIONCOMIC = 195
177
+ GUOCHUANG_INFORMATION = 170
178
+
179
+ TELEPLAY = 11
180
+
181
+ DOCUMENTARY = 177
182
+
183
+ DOUGA = 1
184
+ DOUGA_MAD = 24
185
+ DOUGA_MMD = 25
186
+ DOUGA_VOICE = 47
187
+ DOUGA_GARAGE_KIT = 210
188
+ DOUGA_TOKUSATSU = 86
189
+ DOUGA_ACGNTALKS = 253
190
+ DOUGA_OTHER = 27
191
+
192
+ GAME = 4
193
+ GAME_STAND_ALONE = 17
194
+ GAME_ESPORTS = 171
195
+ GAME_MOBILE = 172
196
+ GAME_ONLINE = 65
197
+ GAME_BOARD = 173
198
+ GAME_GMV = 121
199
+ GAME_MUSIC = 136
200
+ GAME_MUGEN = 19
201
+
202
+ KICHIKU = 119
203
+ KICHIKU_GUIDE = 22
204
+ KICHIKU_MAD = 26
205
+ KICHIKU_MANUAL_VOCALOID = 126
206
+ KICHIKU_THEATRE = 216
207
+ KICHIKU_COURSE = 127
208
+
209
+ MUSIC = 3
210
+ MUSIC_ORIGINAL = 28
211
+ MUSIC_COVER = 31
212
+ MUSIC_PERFORM = 59
213
+ MUSIC_VOCALOID = 30
214
+ MUSIC_LIVE = 29
215
+ MUSIC_MV = 193
216
+ MUSIC_COMMENTARY = 243
217
+ MUSIC_TUTORIAL = 244
218
+ MUSIC_OTHER = 130
219
+
220
+ DANCE = 129
221
+ DANCE_OTAKU = 20
222
+ DANCE_HIPHOP = 198
223
+ DANCE_STAR = 199
224
+ DANCE_CHINA = 200
225
+ DANCE_THREE_D = 154
226
+ DANCE_DEMO = 156
227
+
228
+ CINEPHILE = 181
229
+ CINEPHILE_CINECISM = 182
230
+ CINEPHILE_MONTAGE = 183
231
+ CINEPHILE_SHORTFILM = 85
232
+ CINEPHILE_TRAILER_INFO = 184
233
+
234
+ ENT = 5
235
+ ENT_VARIETY = 71
236
+ ENT_TALKER = 241
237
+ ENT_FANS = 242
238
+ ENT_CELEBRITY = 137
239
+
240
+ KNOWLEDGE = 36
241
+ KNOWLEDGE_SCIENCE = 201
242
+ KNOWLEDGE_SOCIAL_SCIENCE = 124
243
+ KNOWLEDGE_HUMANITY_HISTORY = 228
244
+ KNOWLEDGE_BUSINESS = 207
245
+ KNOWLEDGE_CAMPUS = 208
246
+ KNOWLEDGE_CAREER = 209
247
+ KNOWLEDGE_DESIGN = 229
248
+ KNOWLEDGE_SKILL = 122
249
+
250
+ TECH = 188
251
+ TECH_DIGITAL = 95
252
+ TECH_APPLICATION = 230
253
+ TECH_COMPUTER_TECH = 231
254
+ TECH_INDUSTRY = 232
255
+
256
+ INFORMATION = 202
257
+ INFORMATION_HOTSPOT = 203
258
+ INFORMATION_GLOBAL = 204
259
+ INFORMATION_SOCIAL = 205
260
+ INFORMATION_MULTIPLE = 206
261
+
262
+ FOOD = 211
263
+ FOOD_MAKE = 76
264
+ FOOD_DETECTIVE = 212
265
+ FOOD_MEASUREMENT = 213
266
+ FOOD_RURAL = 214
267
+ FOOD_RECORD = 215
268
+
269
+ LIFE = 160
270
+ LIFE_FUNNY = 138
271
+ LIFE_TRAVEL = 250
272
+ LIFE_RURALLIFE = 251
273
+ LIFE_HOME = 239
274
+ LIFE_HANDMAKE = 161
275
+ LIFE_PAINTING = 162
276
+ LIFE_DAILY = 21
277
+
278
+ CAR = 223
279
+ CAR_RACING = 245
280
+ CAR_MODIFIEDVEHICLE = 246
281
+ CAR_NEWENERGYVEHICLE = 247
282
+ CAR_TOURINGCAR = 248
283
+ CAR_MOTORCYCLE = 240
284
+ CAR_STRATEGY = 227
285
+ CAR_LIFE = 176
286
+
287
+ FASHION = 155
288
+ FASHION_MAKEUP = 157
289
+ FASHION_COS = 252
290
+ FASHION_CLOTHING = 158
291
+ FASHION_TREND = 159
292
+
293
+ SPORTS = 234
294
+ SPORTS_BASKETBALL = 235
295
+ SPORTS_FOOTBALL = 249
296
+ SPORTS_AEROBICS = 164
297
+ SPORTS_ATHLETIC = 236
298
+ SPORTS_CULTURE = 237
299
+ SPORTS_COMPREHENSIVE = 238
300
+
301
+ ANIMAL = 217
302
+ ANIMAL_CAT = 218
303
+ ANIMAL_DOG = 219
304
+ ANIMAL_PANDA = 220
305
+ ANIMAL_WILD_ANIMAL = 221
306
+ ANIMAL_REPTILES = 222
307
+ ANIMAL_COMPOSITE = 75
308
+
309
+ VLOG = 19