Reddit Data Stream

Планируйте исторические пакеты для собственных файлов JSONL

Запрашивайте исторические страницы, проверяйте записи и создавайте локальный JSONL. Отделяйте оплату получения от локального прогресса и повторов.

Получить API-ключ

Определите ограниченное задание и его результат

Считайте каждый запуск по расписанию историческим получением, а не живым потоком. Reddit Data Stream независим от Reddit, без официальной связи, SSE, подписок WebSocket или ленты изменений. Расписание принадлежит вашему приложению. Оно не устанавливает частоту обновления архива, доставку новых публикаций или уведомления об исправлениях и удалениях. Итоговый локальный файл содержит записи, которые фактически удалось получить в этом запуске.

Начните с https://api.redditdatastream.com/v1/posts?subreddit=apacheairflow&limit=3&page=3 — примера на главной. Он запрашивает не больше трёх публикаций на третьей странице этой выборки. Используйте X-API-Key: <ключ> либо Authorization: Bearer <ключ> на сервере. Страница ключа объясняет регистрацию и однократный показ до оплаты. Действующий ключ не должен попадать в журнал задания или итоговый файл с данными.

Задайте явные фильтры и максимум отдельных вызовов страниц для своего задания. search, posts и comments принимают limit и page от 1 до 100. Для окон дат from и to используют YYYY-MM-DD UTC по created_utc, включая последний день целиком, а не время попадания в архив. Меньшие окна и локальная сортировка не доказывают полноты. min_score фильтрует числовой порог без сортировки и оценки качества.

Проверьте, сериализуйте и опубликуйте локально

Проверьте HTTP-результат до обработки тела как данных. Убедитесь, что data — массив, и проверьте поля, сохраняя пропуски вместо вымышленных значений. Записи плоские; имеющиеся parent_id и link_id допускают локальную группировку без гарантии полной беседы. Эти ссылки не являются фильтрами поиска. API возвращает JSON, а назначение JSONL создаёт ваш код; переключение формата серверного экспорта не подразумевается.

Сериализуйте каждую полученную запись стандартным сериализатором, например json.dumps(record, ensure_ascii=False) в Python, и добавьте один перевод строки после значения. Сериализатор экранирует переносы внутри текста, оставляя одну запись на одной физической строке. При необходимости храните исходный ответ отдельно для диагностики pagination и credits. Успешный пустой массив data создаёт ноль строк записей; не добавляйте вымышленную публикацию вместо отсутствующего результата.

Можно сначала писать во временный локальный файл, проверить завершение и только затем передать результат следующему заданию. Отмечайте локальный прогресс после успешной предусмотренной записи. Это этапы вашей реализации, а не единая транзакция API, охватывающая получение и диск. Отказ диска после успешного ответа остаётся локальной ошибкой; удалённый кредит уже может быть списан. Имя файла или замена файла сами по себе не доказывают однократной доставки.

Читайте pagination.total с relation: eq — точный итог запроса, gte — нижняя граница, unknown — ненадёжный итог, возможно null. Пустая страница после первой может вернуть unknown вместо нуля. Сохраняйте has_more и window_exhausted для описания поддерживаемых границ и останавливайтесь на странице 100. Точный итог или готовый локальный файл не доказывают получения всех исторических совпадений. Разбиение периодов тоже не подтверждает полного охвата.

Повторяйте по результату и сохраняйте неопределённость

Внутренний порядок _doc не является временем, релевантностью, оценкой или порядком попадания в архив. Последняя временная отметка не доказывает, что более ранние записи получены полностью. Локальная контрольная точка описывает попытку или завершённую работу вашей системы, не стабильный серверный курсор. Новое получение той же страницы может отличаться, повторить записи или не вернуть ранее полученный материал без гарантии идентичности.

Обработка уже сохранённого ответа не вызывает архив. Новое удалённое обращение стоит один кредит при успехе, даже пустом. Некорректные запросы не списываются; сбой источника возвращает резерв. Потеря ответа клиентом может следовать за оплаченным успехом: отмечайте такую попытку как неопределённую. Локальное отклонение записи при проверке или сохранении не возвращает стоимость завершённого удалённого запроса. Удаление повторов на вашей стороне также не отменяет предыдущего списания.

При 400 исправьте параметры, при 401 проверьте ключ и домен, при 402 — баланс, при 429 ограничьте и отложите повторы. Публичный /v1/status подтверждает только ответ HTTP-приложения и статическое описание сервиса, не доступность поиска или списание за потерянный ответ. Документация объясняет ограничения маршрутов. Цена — $1 за 1000 успешных запросов, минимум $50 и условные 100 пробных кредитов, без подписок.

Для перевыпуска ключа войдите в кабинет на странице ключа и подтвердите пароль: предыдущий ключ немедленно отключается. Обновите задания, которые его используют. Для оплаты сначала войдите и создайте счёт, затем переведите его точную сумму с указанными токеном и сетью и отправьте хеш транзакции на проверку. Состояние оплаты и локальные контрольные точки конвейера различаются; ни то ни другое не гарантирует будущей доступности архива.