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.
Files changed (283) hide show
  1. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/CHANGELOG.md +10 -0
  2. telepost_bot-2.78.1/PKG-INFO +180 -0
  3. telepost_bot-2.78.1/README.en.md +138 -0
  4. telepost_bot-2.78.1/README.md +133 -0
  5. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/publish.py +11 -0
  6. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/pyproject.toml +8 -2
  7. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/build_info.py +1 -1
  8. telepost_bot-2.78.1/telepost_bot.egg-info/PKG-INFO +180 -0
  9. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/SOURCES.txt +1 -0
  10. telepost_bot-2.78.1/tests/test_legacy_delivery_port_navigation.py +143 -0
  11. telepost_bot-2.78.0/PKG-INFO +0 -164
  12. telepost_bot-2.78.0/README.en.md +0 -117
  13. telepost_bot-2.78.0/README.md +0 -117
  14. telepost_bot-2.78.0/telepost_bot.egg-info/PKG-INFO +0 -164
  15. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/LICENSE +0 -0
  16. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/MANIFEST.in +0 -0
  17. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config/__init__.py +0 -0
  18. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config/fly-telepost-policy.example.json +0 -0
  19. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config/review_policy.md +0 -0
  20. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config/settings.py +0 -0
  21. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/config.ini.example +0 -0
  22. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/database/__init__.py +0 -0
  23. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/database/db_manager.py +0 -0
  24. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/__init__.py +0 -0
  25. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/api_commands.py +0 -0
  26. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/automation.py +0 -0
  27. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/botconfig.py +0 -0
  28. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/callback_handlers.py +0 -0
  29. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/channel_listener.py +0 -0
  30. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/command_handlers.py +0 -0
  31. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/conversation.py +0 -0
  32. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/error_handler.py +0 -0
  33. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/index_handlers.py +0 -0
  34. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/mode_selection.py +0 -0
  35. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/moderation.py +0 -0
  36. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/preview_handlers.py +0 -0
  37. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/reaction_stats.py +0 -0
  38. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/recovery.py +0 -0
  39. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/review.py +0 -0
  40. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/schedule_status.py +0 -0
  41. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/search_handlers.py +0 -0
  42. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/stats_handlers.py +0 -0
  43. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/handlers/upload.py +0 -0
  44. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/main.py +0 -0
  45. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/mcp_server/__init__.py +0 -0
  46. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/mcp_server/review_client.py +0 -0
  47. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/mcp_server/server.py +0 -0
  48. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/models/__init__.py +0 -0
  49. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/models/state.py +0 -0
  50. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/__init__.py +0 -0
  51. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/SOURCES.sha256 +0 -0
  52. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/__init__.py +0 -0
  53. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/error-mapping.json +0 -0
  54. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/ackresult.candidate_search.json +0 -0
  55. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/capabilities.pixivflow.json +0 -0
  56. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/event.job.expired.json +0 -0
  57. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/event.job.succeeded.json +0 -0
  58. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/eventpage.candidate_search.json +0 -0
  59. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.cancelled.candidate_search.json +0 -0
  60. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.failed.no_candidate.json +0 -0
  61. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.queued.json +0 -0
  62. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.running.json +0 -0
  63. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/job.succeeded.candidate_search.json +0 -0
  64. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/jobpage.candidate_search.json +0 -0
  65. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/task.candidate_search.json +0 -0
  66. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/fixtures/task.candidate_search.target_only.json +0 -0
  67. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/protocol/v1/protocol.schema.json +0 -0
  68. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/run.py +0 -0
  69. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/services/__init__.py +0 -0
  70. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/services/review_service.py +0 -0
  71. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/setup.cfg +0 -0
  72. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/__init__.py +0 -0
  73. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/api/__init__.py +0 -0
  74. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/__init__.py +0 -0
  75. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/admin_ops.py +0 -0
  76. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/automation.py +0 -0
  77. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/delivery_planner.py +0 -0
  78. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/editorial.py +0 -0
  79. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/hot.py +0 -0
  80. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/novel_fallback_card.py +0 -0
  81. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/novel_preview.py +0 -0
  82. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/pixivflow_jobs.py +0 -0
  83. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/post_media.py +0 -0
  84. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/posts.py +0 -0
  85. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/publication.py +0 -0
  86. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/reaction_backfill.py +0 -0
  87. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/recovery.py +0 -0
  88. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/refetch.py +0 -0
  89. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/rerender.py +0 -0
  90. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/resubmit.py +0 -0
  91. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/review_queue.py +0 -0
  92. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/submitter_notify.py +0 -0
  93. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/application/telepress_provider.py +0 -0
  94. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/__init__.py +0 -0
  95. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/automation.py +0 -0
  96. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/delivery.py +0 -0
  97. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/editorial.py +0 -0
  98. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/errors.py +0 -0
  99. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/hot.py +0 -0
  100. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/media.py +0 -0
  101. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/navigation.py +0 -0
  102. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/novel_preview.py +0 -0
  103. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/packing.py +0 -0
  104. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/presentation.py +0 -0
  105. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/presentation_policy.py +0 -0
  106. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/refetch_state.py +0 -0
  107. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/review.py +0 -0
  108. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/domain/submission.py +0 -0
  109. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/__init__.py +0 -0
  110. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/auth.py +0 -0
  111. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/rbac.py +0 -0
  112. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/role_bindings.py +0 -0
  113. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/miniapp/session.py +0 -0
  114. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/__init__.py +0 -0
  115. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/audit.py +0 -0
  116. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/cli.py +0 -0
  117. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/doctor.py +0 -0
  118. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/errors.py +0 -0
  119. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/observability/redact.py +0 -0
  120. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/__init__.py +0 -0
  121. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/__init__.py +0 -0
  122. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/automation.py +0 -0
  123. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/columns.py +0 -0
  124. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/editorial.py +0 -0
  125. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/ledger.py +0 -0
  126. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/media_assets.py +0 -0
  127. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/moderation.py +0 -0
  128. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/novel_preview.py +0 -0
  129. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/posts.py +0 -0
  130. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/protocol_events.py +0 -0
  131. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/recovery.py +0 -0
  132. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/refetch.py +0 -0
  133. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/reviews.py +0 -0
  134. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/storage/sqlite/submitter_notifications.py +0 -0
  135. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/__init__.py +0 -0
  136. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/capture.py +0 -0
  137. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/__init__.py +0 -0
  138. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/discussion.py +0 -0
  139. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/executor.py +0 -0
  140. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/gateway.py +0 -0
  141. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/legacy_runner.py +0 -0
  142. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/planner.py +0 -0
  143. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/preparation.py +0 -0
  144. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/registry.py +0 -0
  145. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/delivery/sender.py +0 -0
  146. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/review_keyboard.py +0 -0
  147. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost/telegram/review_stager.py +0 -0
  148. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/dependency_links.txt +0 -0
  149. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/entry_points.txt +0 -0
  150. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/requires.txt +0 -0
  151. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/telepost_bot.egg-info/top_level.txt +0 -0
  152. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_admin_api.py +0 -0
  153. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_anonymous.py +0 -0
  154. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_api_commands.py +0 -0
  155. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_api_server.py +0 -0
  156. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_api_version.py +0 -0
  157. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_architecture_application.py +0 -0
  158. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_architecture_core.py +0 -0
  159. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_automation.py +0 -0
  160. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_backfill_attribution.py +0 -0
  161. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_blacklist.py +0 -0
  162. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_bot_token_logging.py +0 -0
  163. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_botconfig.py +0 -0
  164. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_boundary.py +0 -0
  165. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_callback_contract.py +0 -0
  166. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_caption_mentions.py +0 -0
  167. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_compatibility.py +0 -0
  168. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_conversation_flow.py +0 -0
  169. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_data_class_cleanup.py +0 -0
  170. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_database.py +0 -0
  171. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_database_operations.py +0 -0
  172. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_delivery_planner.py +0 -0
  173. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_disposition.py +0 -0
  174. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_doctor.py +0 -0
  175. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_editorial.py +0 -0
  176. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_file_validator.py +0 -0
  177. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_frozen_support.py +0 -0
  178. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_handlers.py +0 -0
  179. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_heat_calculator.py +0 -0
  180. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_helper_functions.py +0 -0
  181. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_hot_domain.py +0 -0
  182. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_identity_provenance.py +0 -0
  183. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_integration.py +0 -0
  184. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_logic_flow.py +0 -0
  185. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_logical_submissions.py +0 -0
  186. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_maintenance_jobs.py +0 -0
  187. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_manager_notifications.py +0 -0
  188. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_decision_audit.py +0 -0
  189. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_delivery_pipeline.py +0 -0
  190. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_domain.py +0 -0
  191. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_preparation.py +0 -0
  192. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_media_proxy_delivery.py +0 -0
  193. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_menu_shortcut_single_reply.py +0 -0
  194. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_messages.py +0 -0
  195. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_api.py +0 -0
  196. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_auth.py +0 -0
  197. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_content.py +0 -0
  198. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_entries.py +0 -0
  199. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_history.py +0 -0
  200. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_miniapp_rbac.py +0 -0
  201. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_mixed_media_integrity.py +0 -0
  202. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_moderation_and_admin_ux.py +0 -0
  203. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_navigation.py +0 -0
  204. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_no_owner_probe.py +0 -0
  205. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_novel_cover_preview.py +0 -0
  206. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_novel_delivery_semantics.py +0 -0
  207. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_novel_preview.py +0 -0
  208. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_observability.py +0 -0
  209. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_observability_lifecycle.py +0 -0
  210. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_online_reading_root_button.py +0 -0
  211. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_packing_ssot.py +0 -0
  212. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_polling_server.py +0 -0
  213. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_preview_pagination.py +0 -0
  214. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_production_handler_graph.py +0 -0
  215. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_protocol_contract.py +0 -0
  216. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_publication_presentation.py +0 -0
  217. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_publish_idempotency.py +0 -0
  218. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_publish_regressions.py +0 -0
  219. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_publish_reply.py +0 -0
  220. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_reaction_backfill.py +0 -0
  221. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_reaction_stats.py +0 -0
  222. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_recovery.py +0 -0
  223. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch.py +0 -0
  224. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_card_state.py +0 -0
  225. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_events.py +0 -0
  226. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_job_lifecycle.py +0 -0
  227. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_reason_normalization.py +0 -0
  228. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_refetch_replacement.py +0 -0
  229. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_remote_fetch_fallback.py +0 -0
  230. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_rerender.py +0 -0
  231. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_resubmit.py +0 -0
  232. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_review.py +0 -0
  233. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_review_consistency.py +0 -0
  234. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_review_http_mcp.py +0 -0
  235. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_review_service.py +0 -0
  236. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_robustness.py +0 -0
  237. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_run_dispatcher.py +0 -0
  238. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_run_mode.py +0 -0
  239. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_run_supervisor.py +0 -0
  240. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_schedule_outcomes.py +0 -0
  241. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_search_recovery.py +0 -0
  242. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_security.py +0 -0
  243. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_shutdown.py +0 -0
  244. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_streaming_uploads.py +0 -0
  245. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_submission_timeout_idempotency.py +0 -0
  246. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_telegram_golden_messages.py +0 -0
  247. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_telegram_media_cache.py +0 -0
  248. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_upload.py +0 -0
  249. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_user_friendly_messages.py +0 -0
  250. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_ready.py +0 -0
  251. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_router.py +0 -0
  252. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_secret.py +0 -0
  253. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_secret_logging.py +0 -0
  254. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_webhook_static.py +0 -0
  255. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/tests/test_work_id_wire.py +0 -0
  256. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/ui/__init__.py +0 -0
  257. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/ui/keyboards.py +0 -0
  258. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/ui/messages.py +0 -0
  259. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/__init__.py +0 -0
  260. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/api_server.py +0 -0
  261. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/api_tokens.py +0 -0
  262. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/blacklist.py +0 -0
  263. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/cache.py +0 -0
  264. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/config_wizard.py +0 -0
  265. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/database.py +0 -0
  266. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/file_validator.py +0 -0
  267. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/heat_calculator.py +0 -0
  268. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/helper_functions.py +0 -0
  269. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/index_manager.py +0 -0
  270. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/logging_config.py +0 -0
  271. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/maintenance_jobs.py +0 -0
  272. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/polling_server.py +0 -0
  273. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/run_mode.py +0 -0
  274. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/runtime_policy.py +0 -0
  275. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/schedule_watchdog.py +0 -0
  276. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/search_engine.py +0 -0
  277. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/submission.py +0 -0
  278. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/utils/webhook_server.py +0 -0
  279. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/__init__.py +0 -0
  280. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/dist/assets/2d82b92e720462f8dd3b-Bh4Fahcw.svg +0 -0
  281. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/dist/assets/index-C-xxEN9W.js +0 -0
  282. {telepost_bot-2.78.0 → telepost_bot-2.78.1}/webapp/dist/assets/index-DJgL81We.css +0 -0
  283. {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
+ [![Release](https://img.shields.io/github/v/release/redtidev1918/TelePost)](https://github.com/redtidev1918/TelePost/releases/latest)
57
+ [![PyPI](https://img.shields.io/pypi/v/telepost-bot.svg)](https://pypi.org/project/telepost-bot/)
58
+ [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
59
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
60
+ [![Documentation](https://img.shields.io/badge/docs-redtidev1918.github.io-6366f1)](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
+ [![Release](https://img.shields.io/github/v/release/redtidev1918/TelePost)](https://github.com/redtidev1918/TelePost/releases/latest)
10
+ [![PyPI](https://img.shields.io/pypi/v/telepost-bot.svg)](https://pypi.org/project/telepost-bot/)
11
+ [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
12
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
13
+ [![Documentation](https://img.shields.io/badge/docs-redtidev1918.github.io-6366f1)](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
+ [![Release](https://img.shields.io/github/v/release/redtidev1918/TelePost)](https://github.com/redtidev1918/TelePost/releases/latest)
10
+ [![PyPI](https://img.shields.io/pypi/v/telepost-bot.svg)](https://pypi.org/project/telepost-bot/)
11
+ [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
12
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
13
+ [![Documentation](https://img.shields.io/badge/docs-redtidev1918.github.io-6366f1)](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
- config = ["review_policy.md"]
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.0" # x-release-please-version
11
+ RELEASE_VERSION = "2.78.1" # x-release-please-version
12
12
  RELEASE_COMMIT = "dev"
13
13
  BUILD_DATE = "dev"
14
14
  SERVICE = "telepost"