- Notifications
You must be signed in to change notification settings - Fork3
Набор скриптов для двач 2ch.hk
License
diademoff/2ch
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Хочешь скачать все файлы с /b или другого раздела? И без дубликатов? И только файлы больше/меньше X Килобайт? Или только картинки/только видео? Или файлы только с конкретного треда? Или тебе нужен трекер, который будет отбирать треды по ключевым словам?Всё это здесь! И даже больше!
В репозитории представлен готовый набор скриптов длядвача, все скрипты можно кастомизировать под свои задачи. При минимальных знаниях питона можно с легкостью написать скрипт под свои нужды. Вся информация ниже.
Установитеpython
Скачайте zip архив или:
git clone https://github.com/diademoff/2ch
Установите зависимости:
cd 2chpip install -r requirements.txt
Запускайте нужный скрипт:
python {название скрипта}.py
- Скачать все файлы и посты треда
thread_saver.py
- Уведомления о новых тредах на досках
tracker.py
- Самые популярные треды на доске
popular.py
- Скачивать все файлы доски
board_media.py
Все скрипты можно редактировать под ваши задачи.
thread_saver.py
FOLDER = 'saver'
- Изменить имя папки, в которую будут сохраняться файлыSAVE_MEDIA
- Сохранять ли изображения и видеоDELAY
- Интервал обновления в секундах
tracker.py
text_limit = 155
- Изменить длину строкиboard_names = 'b news sex v hw gg dev soc rf ma psy fet'
- Изменить список досок (писать через пробел)KEY_WORDS
- Указать ключевые слова
popular.py
text_limit = 164
- Длина строкиmax_lines = 55
- Максимальное количество строк в выводеboard_name = 'b'
- Доска, которая парситсяKEY_WORDS
- Выводить треды только с ключевыми словами
board_media.py
BOARD = 'b'
- Имя борды, с которой скачивать файлыFOLDER_NAME = 'media'
- Имя папки, в которую скачивать файлыKEY_WORDS = []
- Отбирать треды по ключевым словам, если ключевые слова не указаны, то будут скачиваться файлы всех тредовEXTENSIONS = []
- Файлы с какими расширениями скачиватьMAX_FILE_SIZE
- Задать максимальный размер файла в КилобайтахMIN_FILE_SIZE
- Задать минимальный размер файла в Килобайтах
- Скрипт не запускается.
Проверьте установлены ли зависимости:pip install -r requirements.txt
. Проверьте кодировку файлов. Проверьте, что у вас установлена версия Python > 3.
- Как сравниваются изображения?
Изображения сравниваются по содержимому. Даже если у изображений разное расширениеpng
иjpg
, или разный размер они всё равно будут распознаны как одинаковые.
- Ты используешь api двача?
Да. А конкретно:
https://2ch.hk/makaba/mobile.fcgi?task=get_thread&board={board_name}&thread={num}&post=1http://2ch.hk/{name}/threads.json
- Зачем тебе beautiful soup?
Преимущественно чтобы убирать html теги в постах. Если в постежирный текст, то получается так:<strong>текст</strong>
. Этот тэг нужно убрать, чтобы остался только текст.
- Как указать ключевые слова?
Откройте нужный скрипт и отредактируйте по образцу. Обратите внимание на форматирование, запятые и кавычки.
KEY_WORDS= ["цуиь","mp4"]
- Скрипты кроссплатформенные?
Да. Скрипты были проверены на Linux и Windows.
Весь api хранится в файлеdvach.py
. Подключаем:
importdvach
- Board
name: str
- Имя доскиposts: dict
- Список постов, это словарь. Ключ - это номер треда, значение - переменная типаThread
json_link: str
- Ссылка на json тредовfrom_json()
- Получить объектBoard
из json'аjson_download()
- Скачать json доскиthread_exists()
- Есть ли на доске тред с указанным номеромupdate_threads()
- Обновить список тредов на доскеsort_threads_by_posts()
- Отсортировать список тредов по количеству постов, чем ближе элемент к началу списка, тем больше в нем постовget_new_threads()
- Сравнить текущий список тредов с другим и получить словарь новых тредовget_dead_threads()
- Сравнить текущий список тредов с другим и получить словарь утонувших тредов
- Thread
comment: str
- Текст в ОП постеnum: str
- Номер тредаposts_count: int
- Количество постовscore: float
- Сколько очков у тредаsubject: str
- Сокращенныйcomment
views: int
- Количество просмотровunique_posters: int
- Количество уникальных просмотров (появится после обновления постов)board_name: str
- Какой доске принадлежит тредposts = []
- Список постовget_link: str
- Ссылка на тредget_op_post: Post
- Получить ОП-постjson_posts_link: str
- Ссылка на json тредаsave(path)
- сохранить в html посты треда в указанную папкуIsOk()
- Подходит ли тред по заданным ключевым словамupdate_posts()
- Скачать json и обновить их список, вызывает функциюget_posts()
get_posts()
- Спарсить json и обновитьunique_posters
иposts
json_download()
- Получить json постов в чистом виде
- Post
comment: str
- Текстdate: str
- Дата постаemail: str
op: int
num: str
- Номерfiles: []
- Список файлов
- Post_file
displayname: str
- Отображаемое имяname: str
- Имяdownload_link: str
- Ссылка на скачиваниеwidth: int
- Ширинаheight: int
- Высотаsize: int
- Размер файлаIsImage: bool
- Является ли файл изображениемIsVideo: bool
- Является ли файл видеоsave()
- Сохранить файл по указанному путиIsOk()
- Подходит ли файл по заданным расширениям, максимальному и минимальному размеру
КлассBoard
позволяет взаимодействовать с досками (b, news, po, soc и т.д).
Объявление:
board=dvach.Board('b')
Теперь в переменнойboard
хранится доскаb
, но там нет никакой информации, кроме названия доски.Чтобы получить список тредов на доске:
board.update_threads()
Теперь в полеthreads
находится словарь с тредами. Ключ - это номер треда, значение - это тред (Thread
).
Получить список с номерами тредов:
# Список из номеров тредов, каждый номер имеет строковой тип.thread_nums=list(board.threads.keys())
Отсортируем по популярности и снова получим список номеров тредов:
board.sort_threads_by_posts()thread_nums=list(board.threads.keys())
Первый элемент теперь является номером самого популярного треда:
most_popular_num=thread_nums[0]
Мы получилиномер самого популярного треда, теперь получим сам тред из словаряthreads
:
thread = board.threads[most_popular_num]
В этом словаре значение имеет типThread
. Посмотрим тип переменнойthread
:
print(type(thread))
Получим:<class 'dvach.Thread'>
Получим список постов в треде:
print(f"Количество постов (длина posts):{len(thread.posts)}")print(f"Количество постов (posts_count):{thread.posts_count}")thread.update_posts()print(f"Количество постов (длина posts):{len(thread.posts)}")print(f"Уникальных просмотров:{thread.unique_posters}")
На выходе получим:
Количество постов (длина posts): 0Количество постов (posts_count): 60Количество постов (длина posts): 64Уникальных просмотров: 34
unique_posters
- появляется только после вызоваupdate_posts()
илиget_posts()
.
Получение количества постов с помощьюlen(thread.posts)
является более точным, но требует загрузки всех постов, в то время какthread.posts_count
известно во времяполучения тредов на доске.
Для сохранения треда используйте классHtmlGenerator
и методget_thread_htmlpage
. Этот метод возвращает html код, который можно сохранить в файл.
op_file=thread.posts[0].files[0]# Картинка в ОП-постеimg_path=os.path.normpath(f'./{op_file.name}')# Путь, куда мы ее сохранимop_file.save(img_path)# Сохраняем картинку# Получаем htmlhtml=dvach.HtmlGenerator.get_thread_htmlpage(thread,img_path)# Создаём файлfile=open(f'thread_{thread.num}.html','w')# Записывает туда html страницуfile.write(html)
Или используйте функцию:
# Файл сохранится в папку, в которой выполняется скрипт с именем thread_{num}.htmlthread.save('.')
После получения списка постов с помощьюupdate_posts()
в полеposts
появился список постов начиная с ОП-поста.
Посмотрим второй пост в треде:
post=thread.posts[1]print(f"Номер:{post.num}")print(f"Текст:{post.comment}")print(f"Количество файлов:{len(post.files)}")
На выходе получаем:
Номер: 210762237Текст: БампКоличество файлов: 1
Теперь получим первый файл в посте, если файл есть:
iflen(post.files)>0:file=post.files[0]print(type(file))
На выходе получим:<class 'dvach.Post_file'>
Посмотрим больше информации о файле:
print(f"Имя файла:{file.name}")print(f"Ширина:{file.width}")print(f"Высота:{file.height}")print(f"Отображаемое имя:{file.displayname}")print(f"Ссылка:{file.download_link}")
На выходе:
Имя файла: 16200245064090.jpgШирина: 3118Высота: 1754Отображаемое имя: 1620024504280.jpgСсылка: https://2ch.hk/b/src/245763818/16200245064090.jpg
Можно легко сохранить файл:
file.save(file.name)
Файл будет сохранен в директорию в которой выполняется скрипт с именем16200245064090.jpg
Можно указать кастомный путь:
file.save(f"/home/username/{file.name}")
Весь код, используемый в примерах:
importdvachimportos# Объявить доскуboard=dvach.Board('b')# Скачать тредыboard.update_threads()# Получить список номеров тредовthread_nums=list(board.threads.keys())# Отсортировать по количеству постовboard.sort_threads_by_posts()# Обновить список с номерами тредовthread_nums=list(board.threads.keys())# Номер самого популярного тредаmost_popular_num=thread_nums[0]# Самый популярный тредthread=board.threads[most_popular_num]# Посмотреть тип переменнойprint(type(thread))print(f"Количество постов (длина posts):{len(thread.posts)}")print(f"Количество постов (posts_count):{thread.posts_count}")# Скачать постыthread.update_posts()print(f"Количество постов (длина posts):{len(thread.posts)}")print(f"Уникальных просмотров:{thread.unique_posters}")op_file=thread.posts[0].files[0]# Картинка в ОП-постеimg_path=os.path.normpath(f'./{op_file.name}')# Путь, куда мы ее сохранимop_file.save(img_path)# Сохраняем картинку# Получаем htmlhtml=dvach.HtmlGenerator.get_thread_htmlpage(thread,img_path)# Создаём файлfile=open(f'thread_{thread.num}.html','w')# Записывает туда html страницуfile.write(html)# Получить второй пост (который сразу после ОП-поста)post=thread.posts[1]print(f"Номер:{post.num}")print(f"Текст:{post.comment}")print(f"Количество файлов:{len(post.files)}")iflen(post.files)>0:# Получить первый файлfile=post.files[0]print(type(file))print(f"Имя файла:{file.name}")print(f"Ширина:{file.width}")print(f"Высота:{file.height}")print(f"Отображаемое имя:{file.displayname}")print(f"Ссылка:{file.download_link}")# Сохранить файлfile.save(file.name)# file.save(f"/home/username/{file.name}")
About
Набор скриптов для двач 2ch.hk
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.
Contributors3
Uh oh!
There was an error while loading.Please reload this page.