telepost-bot 2.78.0__tar.gz → 2.78.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/CHANGELOG.md +10 -0
- telepost_bot-2.78.1/PKG-INFO +180 -0
- telepost_bot-2.78.1/README.en.md +138 -0
- telepost_bot-2.78.1/README.md +133 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/publish.py +11 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/pyproject.toml +8 -2
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/build_info.py +1 -1
- telepost_bot-2.78.1/telepost_bot.egg-info/PKG-INFO +180 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/SOURCES.txt +1 -0
- telepost_bot-2.78.1/tests/test_legacy_delivery_port_navigation.py +143 -0
- telepost_bot-2.78.0/PKG-INFO +0 -164
- telepost_bot-2.78.0/README.en.md +0 -117
- telepost_bot-2.78.0/README.md +0 -117
- telepost_bot-2.78.0/telepost_bot.egg-info/PKG-INFO +0 -164
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/LICENSE +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/MANIFEST.in +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config/fly-telepost-policy.example.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config/review_policy.md +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config/settings.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config.ini.example +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/database/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/database/db_manager.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/api_commands.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/automation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/botconfig.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/callback_handlers.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/channel_listener.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/command_handlers.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/conversation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/error_handler.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/index_handlers.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/mode_selection.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/moderation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/preview_handlers.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/reaction_stats.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/recovery.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/review.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/schedule_status.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/search_handlers.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/stats_handlers.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/upload.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/main.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/mcp_server/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/mcp_server/review_client.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/mcp_server/server.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/models/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/models/state.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/SOURCES.sha256 +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/error-mapping.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/ackresult.candidate_search.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/capabilities.pixivflow.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/event.job.expired.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/event.job.succeeded.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/eventpage.candidate_search.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.cancelled.candidate_search.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.failed.no_candidate.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.queued.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.running.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.succeeded.candidate_search.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/jobpage.candidate_search.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/task.candidate_search.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/task.candidate_search.target_only.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/protocol.schema.json +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/run.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/services/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/services/review_service.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/setup.cfg +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/api/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/admin_ops.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/automation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/delivery_planner.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/editorial.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/hot.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/novel_fallback_card.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/novel_preview.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/pixivflow_jobs.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/post_media.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/posts.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/publication.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/reaction_backfill.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/recovery.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/refetch.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/rerender.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/resubmit.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/review_queue.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/submitter_notify.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/telepress_provider.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/automation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/delivery.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/editorial.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/errors.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/hot.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/media.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/navigation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/novel_preview.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/packing.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/presentation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/presentation_policy.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/refetch_state.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/review.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/submission.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/auth.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/rbac.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/role_bindings.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/session.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/audit.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/cli.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/doctor.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/errors.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/redact.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/automation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/columns.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/editorial.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/ledger.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/media_assets.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/moderation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/novel_preview.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/posts.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/protocol_events.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/recovery.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/refetch.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/reviews.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/submitter_notifications.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/capture.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/discussion.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/executor.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/gateway.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/legacy_runner.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/planner.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/preparation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/registry.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/sender.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/review_keyboard.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/review_stager.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/dependency_links.txt +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/entry_points.txt +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/requires.txt +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/top_level.txt +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_admin_api.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_anonymous.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_api_commands.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_api_server.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_api_version.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_architecture_application.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_architecture_core.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_automation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_backfill_attribution.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_blacklist.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_bot_token_logging.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_botconfig.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_boundary.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_callback_contract.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_caption_mentions.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_compatibility.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_conversation_flow.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_data_class_cleanup.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_database.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_database_operations.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_delivery_planner.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_disposition.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_doctor.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_editorial.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_file_validator.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_frozen_support.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_handlers.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_heat_calculator.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_helper_functions.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_hot_domain.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_identity_provenance.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_integration.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_logic_flow.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_logical_submissions.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_maintenance_jobs.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_manager_notifications.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_decision_audit.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_delivery_pipeline.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_domain.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_preparation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_proxy_delivery.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_menu_shortcut_single_reply.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_messages.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_api.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_auth.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_content.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_entries.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_history.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_rbac.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_mixed_media_integrity.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_moderation_and_admin_ux.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_navigation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_no_owner_probe.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_novel_cover_preview.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_novel_delivery_semantics.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_novel_preview.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_observability.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_observability_lifecycle.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_online_reading_root_button.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_packing_ssot.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_polling_server.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_preview_pagination.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_production_handler_graph.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_protocol_contract.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_publication_presentation.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_publish_idempotency.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_publish_regressions.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_publish_reply.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_reaction_backfill.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_reaction_stats.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_recovery.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_card_state.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_events.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_job_lifecycle.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_reason_normalization.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_replacement.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_remote_fetch_fallback.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_rerender.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_resubmit.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_review.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_review_consistency.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_review_http_mcp.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_review_service.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_robustness.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_run_dispatcher.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_run_mode.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_run_supervisor.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_schedule_outcomes.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_search_recovery.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_security.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_shutdown.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_streaming_uploads.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_submission_timeout_idempotency.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_telegram_golden_messages.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_telegram_media_cache.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_upload.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_user_friendly_messages.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_ready.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_router.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_secret.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_secret_logging.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_static.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_work_id_wire.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/ui/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/ui/keyboards.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/ui/messages.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/api_server.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/api_tokens.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/blacklist.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/cache.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/config_wizard.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/database.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/file_validator.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/heat_calculator.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/helper_functions.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/index_manager.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/logging_config.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/maintenance_jobs.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/polling_server.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/run_mode.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/runtime_policy.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/schedule_watchdog.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/search_engine.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/submission.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/webhook_server.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/__init__.py +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/dist/assets/2d82b92e720462f8dd3b-Bh4Fahcw.svg +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/dist/assets/index-C-xxEN9W.js +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/dist/assets/index-DJgL81We.css +0 -0
- {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/dist/index.html +0 -0
|
@@ -8,6 +8,16 @@
|
|
|
8
8
|
> 发布说明面向普通用户:写「对用户有什么改变」,不写内部实现细节(模块名、函数名、配置键);
|
|
9
9
|
> 技术细节放进代码注释或 `docs/`。每个 Release 的正文由本文件对应版本段自动生成。
|
|
10
10
|
|
|
11
|
+
## [2.78.1](https://github.com/redtidev1918/TelePost/compare/v2.78.0...v2.78.1) (2026-10-03)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* accept per-platform digests when verifying production machines ([a00d446](https://github.com/redtidev1918/TelePost/commit/a00d446f12272c304d5630bf1a2550c46c44288f))
|
|
17
|
+
* **delivery:** forward root markup in the on_sent execute_plan branch ([7153ed6](https://github.com/redtidev1918/TelePost/commit/7153ed6dcf2043f2ab0b602c5807f518502da1a6))
|
|
18
|
+
* **delivery:** forward root_navigation through the legacy delivery port ([dd1db6a](https://github.com/redtidev1918/TelePost/commit/dd1db6a248fc10689475b307f22a331f76636d9f))
|
|
19
|
+
* off-by-one in the accepted digest count printed in the deploy log ([738e480](https://github.com/redtidev1918/TelePost/commit/738e4801871023aca870d27c4ad0a8f4a38750f0))
|
|
20
|
+
|
|
11
21
|
## [2.78.0](https://github.com/redtidev1918/TelePost/compare/v2.77.0...v2.78.0) (2026-10-03)
|
|
12
22
|
|
|
13
23
|
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: telepost-bot
|
|
3
|
+
Version: 2.78.1
|
|
4
|
+
Summary: Telegram submission, review, and publication bot with a Mini App, HTTP API, and multi-bot supervisor.
|
|
5
|
+
Author: redtidev1918
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/redtidev1918/TelePost
|
|
8
|
+
Project-URL: Repository, https://github.com/redtidev1918/TelePost
|
|
9
|
+
Project-URL: Documentation, https://github.com/redtidev1918/TelePost/tree/main/docs
|
|
10
|
+
Project-URL: Issues, https://github.com/redtidev1918/TelePost/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/redtidev1918/TelePost/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: telegram,bot,submission,review,publication,miniapp,telepost,moderation
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Framework :: AsyncIO
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: Intended Audience :: System Administrators
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Topic :: Communications :: Chat
|
|
24
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: python-telegram-bot[job-queue]>=22.8
|
|
29
|
+
Requires-Dist: aiohttp>=3.14.3
|
|
30
|
+
Requires-Dist: python-dotenv>=1.2.3
|
|
31
|
+
Requires-Dist: aiosqlite>=0.22.1
|
|
32
|
+
Requires-Dist: psutil>=5.9.8
|
|
33
|
+
Requires-Dist: Pillow>=10.0.0
|
|
34
|
+
Requires-Dist: pyvips>=2.2.0
|
|
35
|
+
Requires-Dist: whoosh>=2.7.4
|
|
36
|
+
Requires-Dist: init-data-py>=1.0.0
|
|
37
|
+
Requires-Dist: telepress>=0.16.4
|
|
38
|
+
Provides-Extra: mcp
|
|
39
|
+
Requires-Dist: mcp<3,>=2.2; extra == "mcp"
|
|
40
|
+
Provides-Extra: dev
|
|
41
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
42
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
43
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
44
|
+
Requires-Dist: pytest-mock>=3.11.0; extra == "dev"
|
|
45
|
+
Requires-Dist: coverage>=7.3.0; extra == "dev"
|
|
46
|
+
Dynamic: license-file
|
|
47
|
+
|
|
48
|
+
# TelePost
|
|
49
|
+
|
|
50
|
+
**语言 / Language:** 中文 · [English](README.en.md)
|
|
51
|
+
|
|
52
|
+
> **Telegram 频道投稿、审核与发布服务。**
|
|
53
|
+
|
|
54
|
+
📚 [完整文档](https://redtidev1918.github.io/TelePost/)
|
|
55
|
+
|
|
56
|
+
[](https://github.com/redtidev1918/TelePost/releases/latest)
|
|
57
|
+
[](https://pypi.org/project/telepost-bot/)
|
|
58
|
+
[](https://www.python.org/)
|
|
59
|
+
[](LICENSE)
|
|
60
|
+
[](https://redtidev1918.github.io/TelePost/)
|
|
61
|
+
|
|
62
|
+
TelePost 是一个自托管服务,用于 Telegram 频道的投稿、审核和发布。用户可以通过 Telegram Bot
|
|
63
|
+
或 Mini App 投稿,其他程序可以通过 HTTP API 提交内容;所有入口最终进入同一套投稿、审核和发布流程。
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
Telegram Bot ─────┐
|
|
67
|
+
Telegram Mini App ├──→ TelePost ──→ Telegram Channel
|
|
68
|
+
HTTP API ─────────┘
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 功能
|
|
72
|
+
|
|
73
|
+
- Bot 投稿:图片、视频、音频和文件
|
|
74
|
+
- 审核队列:审核、修改后发布、剧透控制、审核历史
|
|
75
|
+
- Mini App:投稿、内容浏览、我的投稿、审核和管理
|
|
76
|
+
- HTTP API:文件上传、Bearer Token、幂等提交
|
|
77
|
+
- 频道搜索:历史内容、标签和投稿记录
|
|
78
|
+
- 小说 / 长文:TXT 可生成 Telegraph 在线阅读页
|
|
79
|
+
- 多 Bot:一个进程运行多个相互隔离的 Bot
|
|
80
|
+
- SQLite:持久化存储,重启后恢复
|
|
81
|
+
|
|
82
|
+
## 快速开始
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install telepost-bot
|
|
86
|
+
telepost --setup
|
|
87
|
+
telepost
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
需要 Python 3.10+;图片处理依赖系统级 libvips。
|
|
91
|
+
|
|
92
|
+
开始前:用 [@BotFather](https://t.me/BotFather) 创建一个 Bot,把它加入目标频道并授予发帖权限。
|
|
93
|
+
|
|
94
|
+
首次运行 `telepost` 会进入配置向导,填入 **Bot Token**、**Channel ID**、**Owner ID**;
|
|
95
|
+
之后直接运行 `telepost` 即以前次配置启动。启动后向 Bot 发送 `/start`,再用 `/submit`
|
|
96
|
+
发布第一条投稿。
|
|
97
|
+
|
|
98
|
+
| 名称 | 值 |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| PyPI 项目名 | `telepost-bot` |
|
|
101
|
+
| 命令行 | `telepost` |
|
|
102
|
+
| Python 导入 | `telepost` |
|
|
103
|
+
| Python | 3.10+ |
|
|
104
|
+
|
|
105
|
+
## 安装
|
|
106
|
+
|
|
107
|
+
| 方式 | 用法 | 适合 |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| PyPI | `pip install telepost-bot` | 普通安装、服务器、脚本 |
|
|
110
|
+
| Release | [下载](https://github.com/redtidev1918/TelePost/releases) | 不想安装 Python |
|
|
111
|
+
| Docker | `ghcr.io/redtidev1918/telepost:<version>` | 容器部署 |
|
|
112
|
+
| 源码 | `git clone` | 开发、自建环境 |
|
|
113
|
+
|
|
114
|
+
生产环境固定 Release 版本,不要使用 `latest`。完整安装、升级和卸载见
|
|
115
|
+
[安装与部署](docs/INSTALL.md)。
|
|
116
|
+
|
|
117
|
+
## HTTP API
|
|
118
|
+
|
|
119
|
+
先在 Bot 中用 `/gen_token` 生成 Token,再提交内容:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
curl -X POST 'https://example.com/api/v1/submissions' \
|
|
123
|
+
-H 'Authorization: Bearer tp_xxxx' \
|
|
124
|
+
-F 'files=@image.jpg' \
|
|
125
|
+
-F 'title=Example' \
|
|
126
|
+
-F 'tags=illustration' \
|
|
127
|
+
-F 'idempotency_key=example:123'
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
适合 RSS、爬虫、CI、定时任务、自有脚本以及 PixivFlow 等自动化工具。
|
|
131
|
+
|
|
132
|
+
完整接口与字段见 [HTTP API](docs/API.md)。
|
|
133
|
+
|
|
134
|
+
## Mini App
|
|
135
|
+
|
|
136
|
+
Mini App 是 TelePost 的可选 Web 前端。
|
|
137
|
+
|
|
138
|
+
普通用户可以投稿、浏览公开内容和查看自己的投稿;reviewer / admin 可以使用审核和管理功能。
|
|
139
|
+
|
|
140
|
+
Mini App 与 Bot 共用同一套后端、权限和投稿状态。配置见 [Mini App](docs/MINIAPP.md)。
|
|
141
|
+
|
|
142
|
+
## 多 Bot 与部署
|
|
143
|
+
|
|
144
|
+
TelePost 支持在一个进程中运行多个相互隔离的 Bot,各自拥有独立的配置、数据目录与 Telegram 入口。
|
|
145
|
+
|
|
146
|
+
可以部署在本地服务器、VPS、Docker / Compose 或 Fly.io。没有公网 HTTPS 时使用 Polling;
|
|
147
|
+
需要接收 Telegram Webhook 时使用 Webhook。
|
|
148
|
+
|
|
149
|
+
[安装与部署](docs/INSTALL.md) · [配置](docs/CONFIGURATION.md) ·
|
|
150
|
+
[运行模式](docs/WEBHOOK_MODE.md) · [Fly.io](docs/FLYIO_DEPLOYMENT.md)
|
|
151
|
+
|
|
152
|
+
正式发版和生产部署见 [运维手册](docs/OPERATIONS.md)。
|
|
153
|
+
|
|
154
|
+
## 文档
|
|
155
|
+
|
|
156
|
+
完整文档站:**https://redtidev1918.github.io/TelePost/**
|
|
157
|
+
|
|
158
|
+
| 内容 | 文档 |
|
|
159
|
+
| --- | --- |
|
|
160
|
+
| 安装、升级、卸载 | [安装与部署](docs/INSTALL.md) |
|
|
161
|
+
| 配置 | [配置参考](docs/CONFIGURATION.md) |
|
|
162
|
+
| Telegram 命令 | [命令参考](docs/COMMANDS.md) |
|
|
163
|
+
| HTTP API | [API](docs/API.md) |
|
|
164
|
+
| Mini App | [Mini App](docs/MINIAPP.md) |
|
|
165
|
+
| Webhook / Polling | [运行模式](docs/WEBHOOK_MODE.md) |
|
|
166
|
+
| Fly.io | [Fly.io 部署](docs/FLYIO_DEPLOYMENT.md) |
|
|
167
|
+
| 运维 | [运维手册](docs/OPERATIONS.md) |
|
|
168
|
+
| 故障排查 | [故障排查](docs/TROUBLESHOOTING.md) |
|
|
169
|
+
| 开发 | [测试指南](docs/TESTING.md) |
|
|
170
|
+
|
|
171
|
+
## 相关项目
|
|
172
|
+
|
|
173
|
+
- [PixivFlow](https://github.com/redtidev1918/PixivFlow) — Pixiv 下载、筛选和自动收集工具
|
|
174
|
+
- [pixivflow-telepost-deploy](https://github.com/redtidev1918/pixivflow-telepost-deploy) — PixivFlow + TelePost 组合部署
|
|
175
|
+
|
|
176
|
+
均为可选集成,不是 TelePost 的运行依赖。
|
|
177
|
+
|
|
178
|
+
## 许可证
|
|
179
|
+
|
|
180
|
+
[MIT License](LICENSE)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# TelePost
|
|
2
|
+
|
|
3
|
+
**Language / 语言:** [中文](README.md) · English
|
|
4
|
+
|
|
5
|
+
> **Submissions, moderation, and publishing for Telegram channels.**
|
|
6
|
+
|
|
7
|
+
📚 [Documentation](https://redtidev1918.github.io/TelePost/)
|
|
8
|
+
|
|
9
|
+
[](https://github.com/redtidev1918/TelePost/releases/latest)
|
|
10
|
+
[](https://pypi.org/project/telepost-bot/)
|
|
11
|
+
[](https://www.python.org/)
|
|
12
|
+
[](LICENSE)
|
|
13
|
+
[](https://redtidev1918.github.io/TelePost/)
|
|
14
|
+
|
|
15
|
+
TelePost is a self-hosted service for submissions, moderation, and publishing on Telegram channels.
|
|
16
|
+
People submit from the Telegram Bot or the Mini App, and other programs submit through the HTTP API —
|
|
17
|
+
every entry point ends up in the same submission, moderation, and publishing flow.
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
Telegram Bot ─────┐
|
|
21
|
+
Telegram Mini App ├──→ TelePost ──→ Telegram Channel
|
|
22
|
+
HTTP API ─────────┘
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Features
|
|
26
|
+
|
|
27
|
+
- Bot submissions: images, video, audio, and files
|
|
28
|
+
- Review queue: review, edit-before-publish, spoiler control, review history
|
|
29
|
+
- Mini App: submit, browse content, view your own submissions, moderate, and manage
|
|
30
|
+
- HTTP API: file upload, Bearer tokens, idempotent submissions
|
|
31
|
+
- Channel search: past content, tags, and submission records
|
|
32
|
+
- Novels / long-form text: TXT uploads can produce a Telegraph reading page
|
|
33
|
+
- Multi-bot: several isolated bots in a single process
|
|
34
|
+
- SQLite: persistent storage that survives restarts
|
|
35
|
+
|
|
36
|
+
## Quick start
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install telepost-bot
|
|
40
|
+
telepost --setup
|
|
41
|
+
telepost
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Needs Python 3.10+; image handling requires the system-level libvips library.
|
|
45
|
+
|
|
46
|
+
Before you start: create a bot with [@BotFather](https://t.me/BotFather), add it to your target
|
|
47
|
+
channel, and grant it permission to post.
|
|
48
|
+
|
|
49
|
+
The first `telepost` run opens the setup wizard for the **Bot Token**, **Channel ID**, and
|
|
50
|
+
**Owner ID**; after that, `telepost` starts with the saved configuration. Once it is running, send
|
|
51
|
+
`/start` to the bot and use `/submit` for your first submission.
|
|
52
|
+
|
|
53
|
+
| Name | Value |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| PyPI project | `telepost-bot` |
|
|
56
|
+
| CLI command | `telepost` |
|
|
57
|
+
| Python import | `telepost` |
|
|
58
|
+
| Python | 3.10+ |
|
|
59
|
+
|
|
60
|
+
## Installation
|
|
61
|
+
|
|
62
|
+
| Method | Usage | Fits |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| PyPI | `pip install telepost-bot` | Regular installs, servers, scripts |
|
|
65
|
+
| Release | [Download](https://github.com/redtidev1918/TelePost/releases) | No Python installation needed |
|
|
66
|
+
| Docker | `ghcr.io/redtidev1918/telepost:<version>` | Container deployments |
|
|
67
|
+
| Source | `git clone` | Development, self-managed hosts |
|
|
68
|
+
|
|
69
|
+
In production, pin a release version; do not use `latest`. Full install, upgrade, and uninstall
|
|
70
|
+
steps: [Install and deployment](docs/en/INSTALL.md).
|
|
71
|
+
|
|
72
|
+
## HTTP API
|
|
73
|
+
|
|
74
|
+
Generate a token with `/gen_token` in the bot, then submit content:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
curl -X POST 'https://example.com/api/v1/submissions' \
|
|
78
|
+
-H 'Authorization: Bearer tp_xxxx' \
|
|
79
|
+
-F 'files=@image.jpg' \
|
|
80
|
+
-F 'title=Example' \
|
|
81
|
+
-F 'tags=illustration' \
|
|
82
|
+
-F 'idempotency_key=example:123'
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Works well for RSS, scrapers, CI, scheduled jobs, custom scripts, and tools such as PixivFlow.
|
|
86
|
+
|
|
87
|
+
Full endpoints and fields: [HTTP API guide](docs/en/API.md).
|
|
88
|
+
|
|
89
|
+
## Mini App
|
|
90
|
+
|
|
91
|
+
The Mini App is an optional web front end for TelePost.
|
|
92
|
+
|
|
93
|
+
Regular users can submit, browse public content, and view their own submissions; reviewers and
|
|
94
|
+
admins get the moderation and admin features.
|
|
95
|
+
|
|
96
|
+
The Mini App shares the same backend, permissions, and submission state as the Bot. Setup:
|
|
97
|
+
[Mini App](docs/MINIAPP.md)(中文).
|
|
98
|
+
|
|
99
|
+
## Multi-bot & deployment
|
|
100
|
+
|
|
101
|
+
TelePost can run several isolated bots in one process, each with its own configuration, data
|
|
102
|
+
directory, and Telegram entry point.
|
|
103
|
+
|
|
104
|
+
Deploy on a local server, a VPS, Docker / Compose, or Fly.io. Use Polling when there is no public
|
|
105
|
+
HTTPS endpoint; use Webhook when you need to receive Telegram webhooks.
|
|
106
|
+
|
|
107
|
+
[Install and deployment](docs/en/INSTALL.md) · [Configuration](docs/en/CONFIGURATION.md) ·
|
|
108
|
+
[Run modes](docs/WEBHOOK_MODE.md)(中文) · [Fly.io](docs/FLYIO_DEPLOYMENT.md)(中文)
|
|
109
|
+
|
|
110
|
+
Official releases and production deployment: [Operations](docs/OPERATIONS.md)(中文).
|
|
111
|
+
|
|
112
|
+
## Documentation
|
|
113
|
+
|
|
114
|
+
Full documentation site: **https://redtidev1918.github.io/TelePost/**
|
|
115
|
+
|
|
116
|
+
| What you want to do | Guide |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| Install, upgrade, uninstall | [Install and deployment](docs/en/INSTALL.md) |
|
|
119
|
+
| Configuration | [Configuration](docs/en/CONFIGURATION.md) |
|
|
120
|
+
| Telegram commands | [Command reference](docs/en/COMMANDS.md) |
|
|
121
|
+
| HTTP API | [API guide](docs/en/API.md) |
|
|
122
|
+
| Mini App | [Mini App](docs/MINIAPP.md)(中文) |
|
|
123
|
+
| Webhook / Polling | [Run modes](docs/WEBHOOK_MODE.md)(中文) |
|
|
124
|
+
| Fly.io | [Fly.io deployment](docs/FLYIO_DEPLOYMENT.md)(中文) |
|
|
125
|
+
| Operations | [Operations](docs/OPERATIONS.md)(中文) |
|
|
126
|
+
| Troubleshooting | [Troubleshooting](docs/TROUBLESHOOTING.md)(中文) |
|
|
127
|
+
| Development | [Testing guide](docs/TESTING.md)(中文) |
|
|
128
|
+
|
|
129
|
+
## Related projects
|
|
130
|
+
|
|
131
|
+
- [PixivFlow](https://github.com/redtidev1918/PixivFlow) — Pixiv downloading, filtering, and automated collection
|
|
132
|
+
- [pixivflow-telepost-deploy](https://github.com/redtidev1918/pixivflow-telepost-deploy) — combined PixivFlow + TelePost deployment
|
|
133
|
+
|
|
134
|
+
Both are optional integrations, not runtime dependencies of TelePost.
|
|
135
|
+
|
|
136
|
+
## License
|
|
137
|
+
|
|
138
|
+
[MIT License](LICENSE)
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# TelePost
|
|
2
|
+
|
|
3
|
+
**语言 / Language:** 中文 · [English](README.en.md)
|
|
4
|
+
|
|
5
|
+
> **Telegram 频道投稿、审核与发布服务。**
|
|
6
|
+
|
|
7
|
+
📚 [完整文档](https://redtidev1918.github.io/TelePost/)
|
|
8
|
+
|
|
9
|
+
[](https://github.com/redtidev1918/TelePost/releases/latest)
|
|
10
|
+
[](https://pypi.org/project/telepost-bot/)
|
|
11
|
+
[](https://www.python.org/)
|
|
12
|
+
[](LICENSE)
|
|
13
|
+
[](https://redtidev1918.github.io/TelePost/)
|
|
14
|
+
|
|
15
|
+
TelePost 是一个自托管服务,用于 Telegram 频道的投稿、审核和发布。用户可以通过 Telegram Bot
|
|
16
|
+
或 Mini App 投稿,其他程序可以通过 HTTP API 提交内容;所有入口最终进入同一套投稿、审核和发布流程。
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
Telegram Bot ─────┐
|
|
20
|
+
Telegram Mini App ├──→ TelePost ──→ Telegram Channel
|
|
21
|
+
HTTP API ─────────┘
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 功能
|
|
25
|
+
|
|
26
|
+
- Bot 投稿:图片、视频、音频和文件
|
|
27
|
+
- 审核队列:审核、修改后发布、剧透控制、审核历史
|
|
28
|
+
- Mini App:投稿、内容浏览、我的投稿、审核和管理
|
|
29
|
+
- HTTP API:文件上传、Bearer Token、幂等提交
|
|
30
|
+
- 频道搜索:历史内容、标签和投稿记录
|
|
31
|
+
- 小说 / 长文:TXT 可生成 Telegraph 在线阅读页
|
|
32
|
+
- 多 Bot:一个进程运行多个相互隔离的 Bot
|
|
33
|
+
- SQLite:持久化存储,重启后恢复
|
|
34
|
+
|
|
35
|
+
## 快速开始
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pip install telepost-bot
|
|
39
|
+
telepost --setup
|
|
40
|
+
telepost
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
需要 Python 3.10+;图片处理依赖系统级 libvips。
|
|
44
|
+
|
|
45
|
+
开始前:用 [@BotFather](https://t.me/BotFather) 创建一个 Bot,把它加入目标频道并授予发帖权限。
|
|
46
|
+
|
|
47
|
+
首次运行 `telepost` 会进入配置向导,填入 **Bot Token**、**Channel ID**、**Owner ID**;
|
|
48
|
+
之后直接运行 `telepost` 即以前次配置启动。启动后向 Bot 发送 `/start`,再用 `/submit`
|
|
49
|
+
发布第一条投稿。
|
|
50
|
+
|
|
51
|
+
| 名称 | 值 |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| PyPI 项目名 | `telepost-bot` |
|
|
54
|
+
| 命令行 | `telepost` |
|
|
55
|
+
| Python 导入 | `telepost` |
|
|
56
|
+
| Python | 3.10+ |
|
|
57
|
+
|
|
58
|
+
## 安装
|
|
59
|
+
|
|
60
|
+
| 方式 | 用法 | 适合 |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| PyPI | `pip install telepost-bot` | 普通安装、服务器、脚本 |
|
|
63
|
+
| Release | [下载](https://github.com/redtidev1918/TelePost/releases) | 不想安装 Python |
|
|
64
|
+
| Docker | `ghcr.io/redtidev1918/telepost:<version>` | 容器部署 |
|
|
65
|
+
| 源码 | `git clone` | 开发、自建环境 |
|
|
66
|
+
|
|
67
|
+
生产环境固定 Release 版本,不要使用 `latest`。完整安装、升级和卸载见
|
|
68
|
+
[安装与部署](docs/INSTALL.md)。
|
|
69
|
+
|
|
70
|
+
## HTTP API
|
|
71
|
+
|
|
72
|
+
先在 Bot 中用 `/gen_token` 生成 Token,再提交内容:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
curl -X POST 'https://example.com/api/v1/submissions' \
|
|
76
|
+
-H 'Authorization: Bearer tp_xxxx' \
|
|
77
|
+
-F 'files=@image.jpg' \
|
|
78
|
+
-F 'title=Example' \
|
|
79
|
+
-F 'tags=illustration' \
|
|
80
|
+
-F 'idempotency_key=example:123'
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
适合 RSS、爬虫、CI、定时任务、自有脚本以及 PixivFlow 等自动化工具。
|
|
84
|
+
|
|
85
|
+
完整接口与字段见 [HTTP API](docs/API.md)。
|
|
86
|
+
|
|
87
|
+
## Mini App
|
|
88
|
+
|
|
89
|
+
Mini App 是 TelePost 的可选 Web 前端。
|
|
90
|
+
|
|
91
|
+
普通用户可以投稿、浏览公开内容和查看自己的投稿;reviewer / admin 可以使用审核和管理功能。
|
|
92
|
+
|
|
93
|
+
Mini App 与 Bot 共用同一套后端、权限和投稿状态。配置见 [Mini App](docs/MINIAPP.md)。
|
|
94
|
+
|
|
95
|
+
## 多 Bot 与部署
|
|
96
|
+
|
|
97
|
+
TelePost 支持在一个进程中运行多个相互隔离的 Bot,各自拥有独立的配置、数据目录与 Telegram 入口。
|
|
98
|
+
|
|
99
|
+
可以部署在本地服务器、VPS、Docker / Compose 或 Fly.io。没有公网 HTTPS 时使用 Polling;
|
|
100
|
+
需要接收 Telegram Webhook 时使用 Webhook。
|
|
101
|
+
|
|
102
|
+
[安装与部署](docs/INSTALL.md) · [配置](docs/CONFIGURATION.md) ·
|
|
103
|
+
[运行模式](docs/WEBHOOK_MODE.md) · [Fly.io](docs/FLYIO_DEPLOYMENT.md)
|
|
104
|
+
|
|
105
|
+
正式发版和生产部署见 [运维手册](docs/OPERATIONS.md)。
|
|
106
|
+
|
|
107
|
+
## 文档
|
|
108
|
+
|
|
109
|
+
完整文档站:**https://redtidev1918.github.io/TelePost/**
|
|
110
|
+
|
|
111
|
+
| 内容 | 文档 |
|
|
112
|
+
| --- | --- |
|
|
113
|
+
| 安装、升级、卸载 | [安装与部署](docs/INSTALL.md) |
|
|
114
|
+
| 配置 | [配置参考](docs/CONFIGURATION.md) |
|
|
115
|
+
| Telegram 命令 | [命令参考](docs/COMMANDS.md) |
|
|
116
|
+
| HTTP API | [API](docs/API.md) |
|
|
117
|
+
| Mini App | [Mini App](docs/MINIAPP.md) |
|
|
118
|
+
| Webhook / Polling | [运行模式](docs/WEBHOOK_MODE.md) |
|
|
119
|
+
| Fly.io | [Fly.io 部署](docs/FLYIO_DEPLOYMENT.md) |
|
|
120
|
+
| 运维 | [运维手册](docs/OPERATIONS.md) |
|
|
121
|
+
| 故障排查 | [故障排查](docs/TROUBLESHOOTING.md) |
|
|
122
|
+
| 开发 | [测试指南](docs/TESTING.md) |
|
|
123
|
+
|
|
124
|
+
## 相关项目
|
|
125
|
+
|
|
126
|
+
- [PixivFlow](https://github.com/redtidev1918/PixivFlow) — Pixiv 下载、筛选和自动收集工具
|
|
127
|
+
- [pixivflow-telepost-deploy](https://github.com/redtidev1918/pixivflow-telepost-deploy) — PixivFlow + TelePost 组合部署
|
|
128
|
+
|
|
129
|
+
均为可选集成,不是 TelePost 的运行依赖。
|
|
130
|
+
|
|
131
|
+
## 许可证
|
|
132
|
+
|
|
133
|
+
[MIT License](LICENSE)
|
|
@@ -559,7 +559,13 @@ async def _execute_with_on_sent(gateway, request, on_sent):
|
|
|
559
559
|
)
|
|
560
560
|
sender = PTBSender(gateway._bot, request.chat_id,
|
|
561
561
|
timeouts=gateway._timeouts())
|
|
562
|
+
# Same contract as DeliveryGateway.deliver: root-only navigation (e.g. the
|
|
563
|
+
# READ_ONLINE button) must reach execute_plan, otherwise the on_sent branch
|
|
564
|
+
# silently drops it. execute_plan attaches it to the root message only and
|
|
565
|
+
# never to albums / overflow / discussion replies (§root-only-navigation).
|
|
566
|
+
root_markup = sender._navigation_markup(request.root_navigation)
|
|
562
567
|
return await execute_plan(plan, sender, caption=request.caption,
|
|
568
|
+
root_reply_markup=root_markup,
|
|
563
569
|
on_sent=_collect)
|
|
564
570
|
|
|
565
571
|
|
|
@@ -977,6 +983,11 @@ class _LegacyDeliveryPort:
|
|
|
977
983
|
album_size=request.album_size,
|
|
978
984
|
reply_to_message_id=request.reply_to_message_id,
|
|
979
985
|
reply_mode=request.reply_mode.value,
|
|
986
|
+
# Root-only inline navigation (e.g. the READ_ONLINE button on a
|
|
987
|
+
# novel with a Telegraph preview). It must survive the legacy
|
|
988
|
+
# adapter: dropping it here silently removes the online-reading
|
|
989
|
+
# entrance from every application-layer publication.
|
|
990
|
+
root_navigation=request.root_navigation,
|
|
980
991
|
)
|
|
981
992
|
finally:
|
|
982
993
|
cleanup_prepared_dicts(dict_items)
|
|
@@ -108,6 +108,11 @@ packages = [
|
|
|
108
108
|
# package-data below). Built via ``npm run build`` before packaging.
|
|
109
109
|
"webapp",
|
|
110
110
|
]
|
|
111
|
+
# Every data file is declared explicitly in ``package-data`` below. Turning off
|
|
112
|
+
# the implicit "whatever git tracks" inclusion keeps the wheel reproducible and
|
|
113
|
+
# stops setuptools from treating the Mini App build output as importable
|
|
114
|
+
# packages (it reports ``webapp.dist.assets`` as ambiguous otherwise).
|
|
115
|
+
include-package-data = false
|
|
111
116
|
|
|
112
117
|
[tool.setuptools.package-data]
|
|
113
118
|
# The Mini App build ships inside the ``webapp`` package so a wheel install
|
|
@@ -118,6 +123,7 @@ packages = [
|
|
|
118
123
|
# site-packages/webapp/dist after install, so no runtime path changes needed.
|
|
119
124
|
webapp = ["dist/**/*"]
|
|
120
125
|
# Review policy ships with the config package so load_review_policy()'s
|
|
121
|
-
# installed-package fallback finds it inside site-packages.
|
|
122
|
-
|
|
126
|
+
# installed-package fallback finds it inside site-packages. The Fly.io example
|
|
127
|
+
# policy ships too (operators copy and edit it into their working directory).
|
|
128
|
+
config = ["review_policy.md", "fly-telepost-policy.example.json"]
|
|
123
129
|
"protocol.v1" = ["*.json", "*.sha256", "fixtures/*"]
|
|
@@ -8,7 +8,7 @@ to the entry points; when present it overrides these committed defaults.
|
|
|
8
8
|
# Bumped automatically by release-please (extra-files in
|
|
9
9
|
# release-please-config.json). Release bundles and images override it at build
|
|
10
10
|
# time with the exact version/commit; this constant is the local-dev fallback.
|
|
11
|
-
RELEASE_VERSION = "2.78.
|
|
11
|
+
RELEASE_VERSION = "2.78.1" # x-release-please-version
|
|
12
12
|
RELEASE_COMMIT = "dev"
|
|
13
13
|
BUILD_DATE = "dev"
|
|
14
14
|
SERVICE = "telepost"
|