-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy paththread_saver.py
137 lines (106 loc) · 3.87 KB
/
thread_saver.py
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import dvach
import time
import os
import sys
DELAY = 15
SAVE_MEDIA = True
global FOLDER
FOLDER = "saver"
def get_board(board_name: str) -> dvach.Board:
while True:
try:
board = dvach.Board.from_json(
dvach.Board.json_download(board_name))
board.update_threads()
return board
except:
print("Не удалось подключиться, повтор")
time.sleep(5)
def get_thread(board, thread_num):
thread_num = int(thread_num)
while True:
if thread_num not in list(board.threads.keys()):
raise Exception('Тред не существует')
try:
thread = board.threads[thread_num]
thread.update_posts()
return thread
except:
print("Не удалось получить тред, повтор")
time.sleep(5)
def is_post_in_list(post: dvach.Post, posts_list):
for i in posts_list:
if i.num == post.num:
return True
return False
def save_post_files(post: dvach.Post):
for f in post.files:
path = os.path.normpath(f"{FOLDER}/{f.name}")
if os.path.exists(path):
print(f"Файл {f.name} существует")
continue
f.save(path)
print(f"Скачан файл: {f.name}")
def add_new_posts(safe_thread: dvach.Thread, posts):
for post in posts:
if not is_post_in_list(post, safe_thread.posts):
safe_thread.posts.append(post)
print(f'Новый пост: {post.num}')
if SAVE_MEDIA:
save_post_files(post)
def print_deleted_posts(safe_thread: dvach.Thread, posts):
for post in safe_thread.posts:
if not is_post_in_list(post, posts):
if post.num not in deleted_posts:
print(f"Удаленный пост: {post.num}")
deleted_posts.append(post.num)
def get_input():
"""Скрипт можно запустить, передав параметры из консоли.
Параметры:
1 - название доски
2 - номер треда
3 (не обязательный) - имя папки
Returns:
board_name, thread_num
"""
if len(sys.argv) >= 1:
# Первый аргумент это название файла, он не нужен
sys.argv = sys.argv[1:]
if len(sys.argv) == 0:
print('Введите название доски: ', end='')
board_name = input()
print('Введите номер треда: ', end='')
thread_num = input()
return (board_name, thread_num)
if len(sys.argv) >= 2:
return (sys.argv[0], sys.argv[1])
else:
raise Exception("Переданны не корректные параметры")
deleted_posts = []
if __name__ == '__main__':
board_name, thread_num = get_input()
if len(sys.argv) >= 3:
FOLDER = sys.argv[2]
if not os.path.exists(FOLDER):
os.mkdir(FOLDER)
board = get_board(board_name)
# Скаченный тред с двача
thread = get_thread(board, thread_num)
# Локальный тред на диске
# Так как тред это ссылочный тип
# Скопированы самые важные поля
safe_thread = dvach.Thread(board_name)
safe_thread.lasthit = thread.lasthit
safe_thread.num = thread.num
safe_thread.comment_html = thread.comment_html
while True:
add_new_posts(safe_thread, thread.posts)
print_deleted_posts(safe_thread, thread.posts)
safe_thread.save(FOLDER)
time.sleep(DELAY)
try:
# Снова скачать тред
thread = get_thread(board, thread_num)
except:
print("Ошибка, повтор")
time.sleep(5)