Автоматический создаватель паков картинок имени рандомных поней

+134
в блоге IT Pony!
Короче. Вот у нас есть автоматический вестник Табуна, который милая am31 каждый день неустанно делает для нас, что показывает, что автоматизация — это ум, честь и совесть эпохи и за ней будущее. =) А также есть много паков имени различных поней (Дёрпи, Селестии, Луны, Найтмер Мун, Твайлайт, Старлайт, киринов и т.п.) А ещё я в паке Твайлайт задумался над тем, что нет пака имени Лиры, но понял, что у меня чисто физически не будет времени его пилить, поэтому его и не будет…


...Or is it?

Так что я went super saiyan и накодил питоновский скрипт, который автоматически создаёт паки поней из выбранных пользователем картинок и постит их в черновики, после чего остаётся только зайти туда самому, прочекать, всё ли ок и нажать «Опубликовать».

Скрипт здесь
гитхабовской репе)

Если у кого-то есть предложения по расширению функциональности или правки неудачных мест (питонщик из меня тот ещё), то велкам в ищщуи и пулл-реквесты.

Как его использовать:

1. Проверить, что на машине есть Python 3. Я проверял на 3.7 и 3.8, скорее всего заведётся на любом третьем и может даже на каком-нибудь из вторых, но я не проверял. Для линуксоидов это на 99% так и есть, виндузятникам придётся его поставить самостоятельно, если он не стоит. Стоит отметить, что последняя версия, которую можно поставить на семёрку — 3.8, 3.9 ставится только на 8.1 или десятку.

2. Поставить нужные модули, в особенности tabun_api от Андреймала (остальные, скорее всего, уже стоят):
pip3 install datetime requests pathlib http3 urllib3
pip3 install git+https://github.com/andreymal/tabun_api.git#egg=tabun_api[full]
Если pip3 нет, то скорее всего, можно использовать команду pip вместо неё: такое бывает, если третий питон — единственный стоящий на машине.
Хочу сказать спасибо andreymal -у за этот модуль и в особенности годную документацию к нему, я разобрался в нём буквально за десять минут и без залезания в исходники, давно у меня такого не было с новыми библиотеками.

3. Сконфигурировать скрипт (его конфигурация находится в его начале). Те параметры, которые нельзя оставить, как есть, и нужно поменять по сравнению с дефолтной конфигурацией, выделены жирным:

username — логин на табуне.
password — пароль от табуна.
proxy — прокси, если нужен, иначе просто пустая строка.
mirror — адрес буры.
apitype — вариант API сайта: «derpibooru» (для Derpibooru и Trixiebooru) или «twibooru» (для Twibooru).
title — название поста, в нём три подчёркивания будут заменены на номер пака (начинается с 1 и дальше увеличивается).
tags — теги, которые будут у поста.
blog_id — численный идентификатор блога, куда постить или строка из URL ссылки на блог (например, ЯРОК — это «fanart», ЗХ — «sketch_drawing», БПНХ — «draw_help», СБК — «rough_blog», награнь — «borderline»). 0 — это персональный блог.
pony — дёрпибурной тег поньки, имени которой мы будем создавать пак.
bonuspony — дёрпибурной тег бонусной поньки (можно сделать несколько «бонусных» спойлеров в конце). Поиск для бонусной поньки ведётся с исключением основной; то есть, если pony == 'lyra heartstrings' и bonuspony == 'bon-bon', то в бонусы будут попадать те картинки, на которых есть Бон-Бон, но нету Лиры. Если бонус не нужен, то здесь следует оставить пустую строку.
also — дополнительные теги.
sort — параметр для сортировки (wilson_score, в отличие от score, позволяет встревать годноте, которую тупо видело очень мало народа).
tmpl_body — шаблон поста. Здесь на место __OP_PIC__ подставится ОП-пикча, на __PIC_BLOCK__ — блок картинок в спойлерах, на ___ — номер пака.
tmpl_text_spoiler_header — шаблон текстового заголовка спойлера.
tmpl_text_spoiler_header_bonus — шаблон текстового заголовка спойлера бонуса.
tmpl_pic_spoiler_header — шаблон заголовка спойлера с картинкой.
tmpl_pic_spoiler_header_bonus — шаблон заголовка спойлера бонуса с картинкой.
tmpl_op_pic — шаблон ОП-пички.
tmpl_alttext — шаблон альттекста каждой картинки.
tmpl_spoiler_contents — шаблон содержимого спойлера.
tmpl_spoiler_contents_bonus — шаблон содержимого спойлера бонуса.
defaults — значения подстановок для шаблона, если соответствующих данных о картинке нет.
spoilerpics — здесь можно указать либо массив ссылок на пикчи, уже загруженные на табун, чтобы получить в заголовках спойлеров такую красоту, как в паках Селестии и Луны; либо просто оставить None или пустой массив, и тогда скрипт сгенерит текстовые заголовки спойлеров. Если будет выбрано больше картинок, чем элементов в этом массиве, то оставшиеся спойлеры будут иметь текстовые заголовки.
bonuspic — картинка для спойлера бонуса. Опять-таки, либо ссылка на пикчу, уже загруженные на табун, либо None или пустая строка, чтобы создать текстовый спойлер.
timezone — часовой пояс, для Москвы это +03:00.
config — путь к файлу, где будет храниться номер последнего отправленного пака. Это нужно, чтобы автоматически его увеличивать в заголовке поста. Путь относителен от домашней директории пользователя (~ в линуксе, C:\Users\имя_пользователя в винде). Файл можно редактировать, если нужно сбросить номер пака или, наоборот, переставить его на нужный. Если в файле, например, записана цифра 5, то скрипт отправит пак с номером 6 и изменит цифру в файле на 6. Если файл удалён или отсутствует, то он будет создан, а нумерация паков начнётся с 1.
pick — путь к pick-файлу, временному файлу для выбора картинок (см. ниже про логику работы скрипта). Путь также относителен от домашней директории пользователя. Также можно указать здесь "*:rentry" для загрузки на rentry.co.
period — количество дней, за которые надо тянуть пикчи с буры (например, 7 — это все пикчи за последнюю неделю).

В шаблонах (то есть, в переменных, начинающихся на tmpl_), кроме tmpl_body (у него свои переменные, указанные выше), можно использовать следующие подстановки:

— На место ___ подставится номер спойлера (везде, кроме `tmpl_op_pic`).
— На место __PIC__ подставится URL картинки из `spoilerpics` (только в `tmpl_pic_spoiler_header` и `tmpl_pic_spoiler_header_bonus`).
— На место __PIC__ подставится URL картинки-превью (только в `tmpl_op_pic`, `tmpl_spoiler_contents` и `tmpl_spoiler_contents_bonus`).
— На место __FULL__ подставится полная ссылка на хайрез картинки (только в `tmpl_op_pic`, `tmpl_spoiler_contents` и `tmpl_spoiler_contents_bonus`).
— На место __DESC__ подставится описание картинки на буре, если оно задано (иначе значение из `defaults`).
— На место __NAME__ подставится название картинки на буре, если оно задано (иначе значение из `defaults`).
— На место __AUTHOR__ подставится содержимое тега `artist:` после двоеточия, если он есть; иначе ник загрузившего картинку на буру, если он задан; иначе значение из `defaults`.
__UPLOADER__ подставится ник загрузившего картинку на буру, если он задан (иначе значение из `defaults`).
— На место __SOURCE__ подставится исходный URL картинки на буре, если он задан (иначе значение из `defaults`).
— На место __ID__ подставится ID картинки на буре.
— На место __DB_URL__ подставится URL страницы с картинкой на буре.

4. Запустить скрипт.

Он сделает следующее:
— выкачает блок метаинформации о первых 50 пикчах (или обо всех имеющихся, если таких пикч меньше 50) с выбранной буры (поддерживаются все буры, совместимые с дёрпибурой и твайбурой) с тегами pony и also и сортировкой по параметру sort (по умолчанию wilson_score);
— сделает то же самое, если задана бонусная понька, но с тегами bonuspony, -pony и also;
— создаст pick-файл для выбора лучших пикч со ссылками на эти картинки (после этого этот файл нужно будет открыть в браузере — его URL скрипт выведет в консоль);
— спросит, какие пикчи публиковать; здесь надо ввести (через пробел, запятую или точку с запятой) номера нужных пикч, начиная с ОП-пикчи. Они будут опубликованы в посте именно в том порядке, в котором введены; например, если ввести «3 5 1 2», то ОП-пикчей станет третья, а потом будут созданы три спойлера с пикчами 5, 1 и 2;
— если задана бонусная понька, то дальше спросит таким же образом номера бонусных пикч (они будут отдельно показаны в pick-файле вторым блоком; будет создано столько бонусных спойлеров, сколько пикч тут будет указано);
— загрузит для ОП-пикчи представления medium и full, а для всех остальных — large и full на табун (все неправильно введённые номера будут проигнорированы);
— создаст пост, в котором первая небонусная пикча будет ОП-пикчей (КДПВ), а остальные будут запиханы под спойлеры (номерные, а затем бонусные), при этом по клику на каждую пикчу будет открываться (по умолчанию) её полный вариант в новой вкладке, а альттекстом (тоже по умолчанию) будет служить её дескрипшен с буры;
— запостит этот пост на табун в указанный блог в виде черновика.
После этого останется только залезть в свои черновики, проверить, опубликовать пост и пнуть его в ленту. =)

Если параметр pick начинается с символов "*:", то это означает, что pick-файл будет залит на внешний ресурс, указанный после этих символов. Сейчас из таких ресурсов поддерживается «rentry»: если указать это слово после двоеточия, то pick-файл будет создан в формате Markdown и залит на Rentry.

Если же pick не начинается с этих символов, то pick-файл будет создан в формате HTML и положен по пути, указанному в этой переменной (относительно домашнего каталога пользователя).

Идея с pick-файлом появилась потому, что автоматический запуск скрипта через crontab не оправдал себя — куда удобнее не чистить черновик поста от негодных пикч, а сразу в диалоговом режиме со скриптом указывать ему пикчи для публикации.

Коды возврата:
0 — всё отлично, можно лезть в черновики проверять появившийся пост;
1 — не получилось импортировать модуль tabun_api;
2 — не получилось достучаться до буры;
3 — не получилось разобрать JSON, который вернула бура;
31 — неправильно указан протокол после "*:" в параметре pick (сейчас поддерживается только «rentry»);
32 — не удалось залить pick-файл на удалённый ресурс;
4 — не удалось залогиниться на табун;
5 — не удалось залить пикчи на табун;
9 — не удалось определить блог по его текстовому имени;
10 — не получилось запостить пост на табун.

Такие дела =)

Последний апдейт:
— теперь поддерживается не только дёрпибура, но и твайбура;
— теперь скрипт может класть pick-файл не только локально в домашний каталог, но и выкладывать на rentry.co.

38 комментариев

— Свити перезагружается, а пост делает ln -s в ленту!
Таки теряется главная фишка ручного формирования — необходимости пробираться через кучи потенциальной годноты и видеть ее своими глазами)
кучи потенциальной годноты

Какая интересная формулировка). Если автопилот будет тупо тащить всё на свете, что имеет нужный тэг, то полезность его близка к нулю.
Ну он тащит первые `piclimit + 1` картинок, имеющих наивысший рейтинг (score) на буре (конечно, это не гарантия качества картинки, но по крайней мере какую-то корреляцию с годностью я ожидаю).
Ну, тут уж увы =)
Впрочем, вместе с кучей потенциальной годноты ты увидишь и кучу потенциального трэша, который потом будет долго хотеться развидеть =)
А вообще я ожидал такого комментария, ибо действительно, пак ручной работы в любом случае более ламповый будет, нежели автоматически собранный. Но если составитель пака устал, ему на смену никто не приходит (сколько я видел постов типа «последний пак имени такой-то пони»), и надвигается выбор эскобара уровня «пака не будет вообще» или «пак будет собираться полуавтоматически», то второй вариант хотя бы даёт возможность радовать тех, кто по-прежнему любит смотреть еженедельные паки с любимой пони, при этом куда меньше нагружая составителя пака =)
Таки это лечится более извращенными запросами по буре, который сразу будет отсекать голимую ересь (не всегда только соединенные через ",")
А какими, кстати, например? Ну, то есть, что именно надо отсекать?
Ну смотря, что лезть будет. Большая часть тегов таки работает «на отсечение», а не «должны быть» (несмотря на то, что на буре одна из самых развитых систем тегов, проблема «недоставили тегов» существует). Вот только два:
— возрастной рейтинг (safe)
— по рейтингу (но не score, а wilson_score, который позволяет встревать годноте, которую тупо видело очень мало народа) — wilson_score.gte:0.8 позволяет попадать адекватным вещам, где-то на 0.7 уже надо включать ручной отбор
А вот отсекать можно:
— мемы (-exploitable meme, -meme)
— фотки (-irl. Тег photo может давать ложные срабатывания, все никак не дойдут руки разбить два значения этого тега)
— комиксы (-comic)
— скрины сериала (-screencap)
— всякие 4чаны, скрины самой буры итд (-meta)
— стены текста (-text only)
— и так далее исходя из того, что встретится и по необходимости. Особо упоротые люди выстраивают конструкции, которые выбрасывают пикчи по сложным фильтрам (типа «рисунки этого артера, но выше такого-то рейтинга»)
О, спасиб за рекомендации.
— возрастной рейтинг (safe)
Это уже есть в also
— по рейтингу (но не score, а wilson_score, который позволяет встревать годноте, которую тупо видело очень мало народа) — wilson_score.gte:0.8 позволяет попадать адекватным вещам, где-то на 0.7 уже надо включать ручной отбор
Хм, то есть более правильно сортировать по wilson_score, да?
— мемы (-exploitable meme, -meme)
— фотки (-irl. Тег photo может давать ложные срабатывания, все никак не дойдут руки разбить два значения этого тега)
— комиксы (-comic)
— скрины сериала (-screencap)
— всякие 4чаны, скрины самой буры итд (-meta)
— стены текста (-text only)
Добавил в also.
Тег photo может давать ложные срабатывания
Ну, вообще, это логично — например, если кто нарисует арт, в котором Тия, как в опенинге, рассматривает фотку М6 — это вполне подойдёт под тег photo.
Для safe-штук wilson_score несколько лучше работает

Ну, вообще, это логично — например, если кто нарисует арт, в котором Тия, как в опенинге, рассматривает фотку М6 — это вполне подойдёт под тег photo.

Поэтому и пытаемся родить второе название тега для таких случаев
Для safe-штук wilson_score несколько лучше работает
Окей, я сделал его по дефолту.
Поэтому и пытаемся родить второе название тега для таких случаев
Ну, как мне кажется, `irl` отлично подходит.
Пачка обновлений скрипта подъехала:

* Появилась куча шаблонов: для текстового и картиночного спойлера, КДПВ и пикчи под спойлером;
* Блог теперь можно задавать и его названием из ссылки (да, я всё-таки разобрался, как это сделать, но фича экспериментальная, ибо у Андреймала сказано, что функция `get_blog` «недоделанная»);
* Теперь не страшно, если спойлерпиков будет меньше, чем реальных спойлеров (лишние просто будут сделаны текстом);
* Необязательна первая запятая в дополнительных тегах;
* Появился Markdown-овский README;
* Больше исключений обрабатывается нормально;
* Добавлены коды возврата.

TODO:

* Сделать возможность задавать содержимое альттекста в картинке;
* В шаблоны добавить плейсхолдеры для следующих переменных из json дёрпибуры: name, uploader, source_url, id, description;
* Туда же добавить конструирование переменной derpibooru_url = mirror + '/images/' + str(id);
* Более красиво сделать сообщения о выкачке пикч.
Йоу. Что-то подобное недавно пробовал с другом делать но на шарпе.
Чтож, поизучаю код. Если переделаю код заливать отчёты с фотографиями одно удовольствие станет)
Очередное обновление скрипта:

* Сделана возможность задавать содержимое альттекста в картинке;
* В шаблоны добавлены плейсхолдеры для следующих переменных из json дёрпибуры: name, uploader, source_url, id, description — и дефолтные значения для них, кроме id;
* Туда же добавлено конструирование переменной __DB_URL__ = mirror + '/images/' + str(id);
* Более красиво сделаны сообщения о выкачке пикч (прогресс и адрес на дёрпибуре);
* Сделана возможность конфигурирования параметра сортировки и он переделан по умолчанию на `wilson_score`, в отличие от `score`;
* Добавлены дополнительные теги фильтрации в also.
Я вам говорю, рано или поздно табун превратится в сборище десятка ИИ, делающих друг для друга посты. Как в одном из разделов Реддита.
Как что плохое… УВЧ! СР!
Странно выглядит, когда она, вроде бы, приглашает «come with me», но в то же время поворачивается к тебе своим USB 3.0-разъёмом (причём заранее открыв защитные створки)...
Зато фэндом будет жить! =)
Ну и что за дискриминация ИИ, будто им не хочется тоже читать статьи, тексты, посты, как всем нормальным пони!
Апдейт: теперь я сделал механизм «Бон-Бонуса» — это позволяет добавить картинку с кем-то ещё, а не основной понькой пака в конец спойлеров. Например, как в этом вот паке =)
Ещё один апдейт: я тут в паке Лиры №3 понял, что uploader — вовсе не всегда автор, да ещё и часто аплоадят анонимы, в итоге там везде «неизвестные авторы». Поэтому теперь вместо поля __UPLOADER__ будет поле __AUTHOR__, на место которого подставится содержимое тега `artist:` после двоеточия, если он есть; иначе ник загрузившего картинку на дёрпибуру, если он задан; иначе значение из `defaults`.
Новый апдейт. Ручная чистка паков — удовольствие не из приятных, поэтому я автоматизировал это внутри самого скрипта. Ну да, он потерял автономность, но зато теперь на пак тратится не 10-20 минут, а 3-5.

Короче, я назвал это «Cherry Berry-pick» (ну, по аналогии с термином cherry-pick, ага).

Теперь скрипт после запуска выкачивает инфу по всем нужным пикчам, а затем создаёт с ними HTML-ник, который нужно открыть в браузере (URL для открытия скрипт выводит) и потом вписать номера нужных пикч через пробел/запятую/точку с запятой в поле ввода в скрипте (а потом то же самое сделать с бонусными пикчами, которые будут вторым блоком в HTML-нике). После этого скрипт создаст уже готовый черновик, на проверку которого придётся тратить куда меньше времени — ведь пикчи уже отсмотрены и выбраны.
Имхо, не очень удобно, если скрипт лежит не на локальной машине, а на vds, где вообще нет gui — только линукс и питон. Было бы удобней делать промежуточный черновик на табуне, или где то в облаке.
Имхо, не очень удобно, если скрипт лежит не на локальной машине, а на vds, где вообще нет gui — только линукс и питон
Ну это да. Там вся фишка в том, чтобы файл для «cherry berry-pick»-а можно было открыть в браузере. Впросем, если это на vds, можно поставить nginx/апач и подкладывать этот файлик в wwwroot. Главное сделать так, чтобы этот файл не кэшировался.
Было бы удобней делать промежуточный черновик на табуне
Я пробовал это, но вычищать оттуда плохие картинки оказалось куда муторнее, чем сразу создавать черновик с выбранными картинками.
В облаке, кстати, можно, да, но я не очень представляю, как это технически реализовать без привязки к конкретному аккаунту конкретного облака.
Впросем, если это на vds, можно поставить nginx/апач и подкладывать этот файлик в wwwroot.

Порты открывать/пробрасывать муторно, не говоря уже о лишней дыре — vds круглосуточно работает.
В облаке, кстати, можно, да, но я не очень представляю, как это технически реализовать без привязки к конкретному аккаунту конкретного облака.

Простейший вариант — прикручиваем авторизацию к какому нибудь яндекс-диску, с указанием логина/пароля от него в теле скрипта, чтобы выгружал туда по webdav. Ну или ресурсы, подобные sendspace (правда я хз, есть ли у них какое либо апи).

Сейчас модно кстати кидать в мессенджеры, например в телегу или в дискорд, чтобы оттуда рулить но я так не умею, и насколько оно трудоемко — не знаю.
Порты открывать/пробрасывать муторно
Эмм. Ну сервер сам порт, какой надо, откроет. Учитывая то, что это VDS, и он для этого и предназначен — на нём ничего принудительно не банится. Ну и дыра тоже как бы — даже если тебя похакают, ты особо ничего не потеряешь (кроме того я не понимаю, как можно похакать сервер с одной страничкой условно).
прикручиваем авторизацию к какому нибудь яндекс-диску, с указанием логина/пароля от него в теле скрипта
Можно, наверное. А с яндекс-диска нормально смотрятся HTML-файлы? И есть где-нибудь пример работы с API яндекс-диска из питона?
Телега, дискорд… Не кажется, что кидать туда HTML-ник — удобная идея: всё равно это будет отдельный файл, который нужно будет скачивать и открывать в браузере.
Ну сервер сам порт, какой надо, откроет. Учитывая то, что это VDS, и он для этого и предназначен — на нём ничего принудительно не банится. Ну и дыра тоже как бы — даже если тебя похакают, ты особо ничего не потеряешь (кроме того я не понимаю, как можно похакать сервер с одной страничкой условно).

Не откроет — я ручками все открываю (по крайней мере у AWS так). Хакается вообще всё, причём цель не страничка, а линуха; которая эту страничку крутит (банальный брутфорс ssh, sip и так далее). Я то может и не потеряю, но если с этой vds начнут рассылать спам, координировать ddos атаки или рулить шеллом — мне легче не станет. Щас у меня там крутится один единственный скрипт, чья задача мониторить новорегов, сверять почту со списком и при совпадении выписывать пермач; при минимальном вмешательстве с моей стороны. Работает эта штука весьма эффективно, хоть и сделана «на коленке» (разумеется не мной — я лишь составил тз и нашел исполнителей).
А с яндекс-диска нормально смотрятся HTML-файлы? И есть где-нибудь пример работы с API яндекс-диска из питона?

Сложна. Я в этом почти не шарю, весь мой опыт — развернуть консольного клиента яндекса, чтобы с сервера папку с диском синкал в фоне… api заявлены для C, java и php.
Телега, дискорд… Не кажется, что кидать туда HTML-ник — удобная идея: всё равно это будет отдельный файл, который нужно будет скачивать и открывать в браузере.

Да. Штука в том, что на vds ходишь через ssh (разумеется через ключ), а такое не с каждого устройства провернешь (мобилка, разные компы на разных осях — винда, мак, линуха), а та же телега как и яндекс диск открывается со всего, без особых заморочек с секьюрностью — достаточно обычного браузера. Ходить по ssh через браузер я еще не научился (не говоря уже про передачу файлов оттуда), а ставить туда гуй нет смысла тк на все про все аж 8гб + 1 gb ram.
Хотяяя… Я же могу там развернуть этот самый яндекс диск, чтобы он сливал мне тот самый файлик…
я ручками все открываю
Эээ, то есть, тебе, чтобы, например, посадить какой-нибудь сервер на порт, допустим, 1234, нужно пройти куда-нибудь в веб-интерфейс управления VDS и разрешить для него трафик по этому порту? А что делать с вещами, которые вообще не TCP/UDP? Выглядит как-то странно. Походу амазон зачем-то тотально огораживается =/
Хакается вообще всё, причём цель не страничка, а линуха; которая эту страничку крутит
Само собой, но я про то, что проломиться на систему через вебсервер с одной страничкой безо всякой аутентификации, баз и скриптов — выглядит как нечто нереальное.
api заявлены для C, java и php.
Эх, а нужен для Python(
Тем более там не C, а C# и ObjectiveC, это, а также С++ — четыре абсолютно различных языка, вопреки популярному мнению.
а такое не с каждого устройства провернешь (мобилка, разные компы на разных осях — винда, мак, линуха)
У меня есть один чёл, который на наш эльбрус ходит с телефончика (и умудрился прислать мне публичный ключ, чтобы я ему сделал доступ, сначала скриншотом =) Я такой «эээ, ты „ваще лол“, что ли, ты хочешь сказать, мне надо это Base64 переписывать ручками в authorized_keys? Не-не-не, Дэвид Блейн», пришлось ему пересылать мне его текстом).
Я же могу там развернуть этот самый яндекс диск, чтобы он сливал мне тот самый файлик…
Да, в твоём случае это будет явно более автоматизированно, чем перекидка через телеграм, например.
Вот поддерживал бы какой-нибудь яндекс-диск тот же REST — было бы вполне удобно кидать туда тот же файлик через PUT. Или scp/ftp тоже как вариант. Или push на гитхаб лол, нет, это уже слишком =)
Хотя… Ты меня навёл на мысль.
тот же REST — было бы вполне удобно кидать туда тот же файлик через PUT.
Это по сути и есть WebDAV
Хотя REST API там тоже есть
Ну я уже, кажется, нашёл более простой способ =) Там даже никакая авторизация, ключи, токены и прочая лабуда не нужна.
Так, кажется, сделал.
Попробуй ветку rentry из гита, и напиши в строчке с заданием pick такое вот вместо имени файла:
pick = '*:rentry'

У тебя тогда должно залиться не в html на локалхост, а в markdown на rentry.co.
UPD: вроде работает — влил ветку в мастер, можешь теперь просто из мастера брать.
Сейчас обновлю шапку поста.
Работать то может и работает но как то странно.
У меня не создаются временные файлы вообще, ну да фиг с ними — на rentry вроде залился.
Ок, выбираю картинки и получаю
нечто
Pictures for main pack: 3, 9, 12, 15, 17, 20, 33, 46  
Pictures for bonus pack: 25
Logging in...
Uploading OP picture   (https://www.twibooru.org/images/2455471): 
Traceback (most recent call last):
  File "tabun_pack_poster.py", line 326, in <module>
    pic_block, op_block = upload_pics(data_main, is_bonus=False)
  File "tabun_pack_poster.py", line 297, in upload_pics
    alttext = db_replace(tmpl_alttext, picture, mirror, defaults)
  File "tabun_pack_poster.py", line 149, in db_replace
    string = string.replace('__NAME__', picture['name'] if picture['name'] != None else defaults['name'])
KeyError: 'name'

ну и очень странно, что тег main pony на буру почему то прилетает с минусом (судя по логике — те что с минусами наоборот отсеиваются). Я конечно тот еще кодер, но какая то логика должна же быть? Прочие теги вроде бы отрабатываются.
У меня не создаются временные файлы вообще
Так, интересно. У тебя какая ОС? Какой URL у тебя выводит скрипт? Есть ли права на запись в указанный каталог? (попробуй от пользователя там что-то создать?) Что в настройках в опциях config и pick?
Ок, выбираю картинки и получаю
Окееей, моя ошибка, я дурной =) Пофиксил, можешь спуллить новую версию с гитхаба. Это всё было потому, что для твайбуры я проверил выкачку и обрадовался, что всё ок, и забыл проверить заливку (shame on me), а вот при заливке-то всё ломается, потому что там вместо ключа name в json — ключ file_name. А ещё DB_URL неправильно генерился, потому что путь не twibooru.org/images/1234, как на дёрпибуре, а просто twibooru.org/1234. Вот не могли они всё сделать одинаково, нет, надо выпендриться(( Но теперь, вроде, всё ок.
P.S. Интересно было бы какие-нибудь ещё буры проверить, оказывается, у них апи отличаются...
ну и очень странно, что тег main pony на буру почему то прилетает с минусом
В бонус-паке так и должно быть — туда идут те картинки, на которых есть бонусная понька, но нет основной, поэтому main там ставится с минусом.
Так самое смешное, что при замене апи с twi на derpi ровно то же самое (ну или я как то неправильно это прописываю). Правда в этот раз он все таки что то создал (права разумеется есть, тк лежит всё в /home. Ось — убунта 20я.
Не, ну смотри, очевидно, что с twibooru он у тебя что-то сможет скачать, если ты api выставишь в 'twibooru', а с derpibooru или trixiebooru — если выставишь в 'derpibooru'. Может, ты скачивал, например, с twibooru, выставив api = 'derpibooru' или наоборот, и потому оно падало с ошибкой до создания файла?
Вряд ли. Что мне особенно интересно — он что то скачивал куда то — номера картинок же есть и сами картинки в нет спокойно заливались. И логин на табун успешен. А вот когда после выбора скрипт пытается залить все уже на табун — вылезала ошибка.
Ну, при заливке на табун (до предпоследнего коммита) там понятно, почему ошибка с твайбурой была, я её исправил. А вот почему он у тебя файл не создавал — этого я пока не понимаю (вполне возможно, какая-то очевидная мелочь, но проскочившая мимо меня; вот поэтому я так люблю возможность отладки с другими пользователями — потмоу что на них эти мелочи таки-вылезают на вид и их можно поправить).

Да, для создания pick-файла он ничего (кроме json с буры) не скачивает — в этом файле картинки имеют их оригинальный URL на буре. Соответственно, json тоже держится в памяти и никуда не сохраняется. Единственное, что он пишет на диск при своей работе, помимо pick-файла — это файл с номером пака, в котором он хранит, логично, номер этого пака и при каждом следующем вызове его увеличивает.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.