电报直接消息到频道
电报Telegram 支持向频道发送直接消息,还可以使用此功能推荐(甚至是付费)频道帖子。
私信
虽然在 API 中,直接频道消息组有时被称为“单论坛”,但它们实际上与已保存消息 API有更多相似之处。
channel#fe685355 flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true autotranslation:flags2.15?true broadcast_messages_allowed:flags2.16?true monoforum:flags2.17?true forum_tabs:flags2.19?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector<RestrictionReason> admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector<Username> stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int bot_verification_icon:flags2.13?long send_paid_messages_stars:flags2.14?long linked_monoforum_id:flags2.18?long = Chat;message#9815cec8 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true invert_media:flags.27?true flags2:# offline:flags2.1?true video_processing_pending:flags2.4?true paid_suggested_post_stars:flags2.8?true paid_suggested_post_ton:flags2.9?true id:int from_id:flags.8?Peer from_boosts_applied:flags.29?int peer_id:Peer saved_peer_id:flags.28?Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long via_business_bot_id:flags2.0?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long reactions:flags.20?MessageReactions restriction_reason:flags.22?Vector<RestrictionReason> ttl_period:flags.25?int quick_reply_shortcut_id:flags.30?int effect:flags2.2?long factcheck:flags2.3?FactCheck report_delivery_until_date:flags2.5?int paid_message_stars:flags2.6?long suggested_post:flags2.7?SuggestedPost = Message;messageService#7a800e0a flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true reactions_are_possible:flags.9?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer saved_peer_id:flags.28?Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction reactions:flags.20?MessageReactions ttl_period:flags.25?int = Message;inputReplyToMonoForum#69d66c45 monoforum_peer_id:InputPeer = InputReplyTo; inputReplyToMessage#869fbe10 flags:# reply_to_msg_id:int top_msg_id:flags.0?int reply_to_peer_id:flags.1?InputPeer quote_text:flags.2?string quote_entities:flags.3?Vector<MessageEntity> quote_offset:flags.4?int monoforum_peer_id:flags.5?InputPeer todo_item_id:flags.6?int = InputReplyTo;monoForumDialog#64407ea7 flags:# unread_mark:flags.3?true nopaid_messages_exception:flags.4?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_reactions_count:int draft:flags.1?DraftMessage = SavedDialog;updateReadMonoForumInbox#77b0e372 channel_id:long saved_peer_id:Peer read_max_id:int = Update; updateReadMonoForumOutbox#a4a79376 channel_id:long saved_peer_id:Peer read_max_id:int = Update;updateDraftMessage#edfc111e flags:# peer:Peer top_msg_id:flags.0?int saved_peer_id:flags.1?Peer draft:DraftMessage = Update; updateChannelReadMessagesContents#25f324f7 flags:# channel_id:long top_msg_id:flags.0?int saved_peer_id:flags.1?Peer messages:Vector<int> = Update; updateDialogUnreadMark#b658f23e flags:# unread:flags.0?true peer:DialogPeer saved_peer_id:flags.1?Peer = Update; updateMessageReactions#1e297bfa flags:# peer:Peer msg_id:int top_msg_id:flags.0?int saved_peer_id:flags.1?Peer reactions:MessageReactions = Update;---functions---channels.updatePaidMessagesPrice#4b12327b flags:# broadcast_messages_allowed:flags.0?true channel:InputChannel send_paid_messages_stars:long = Updates;messages.getSavedDialogs#1e91fc99 flags:# exclude_pinned:flags.0?true parent_peer:flags.1?InputPeer offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:long = messages.SavedDialogs; messages.getSavedDialogsByID#6f6f9c96 flags:# parent_peer:flags.1?InputPeer ids:Vector<InputPeer> = messages.SavedDialogs; messages.getSavedHistory#998ab009 flags:# parent_peer:flags.0?InputPeer peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages; messages.readSavedHistory#ba4a3b5b parent_peer:InputPeer peer:InputPeer max_id:int = Bool; messages.deleteSavedHistory#4dc5085f flags:# parent_peer:flags.0?InputPeer peer:InputPeer max_id:int min_date:flags.2?int max_date:flags.3?int = messages.AffectedHistory;messages.search#29ee847a flags:# peer:InputPeer q:string from_id:flags.0?InputPeer saved_peer_id:flags.2?InputPeer saved_reaction:flags.3?Vector<Reaction> top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages; messages.getSearchCounters#1bbcf300 flags:# peer:InputPeer saved_peer_id:flags.2?InputPeer top_msg_id:flags.0?int filters:Vector<MessagesFilter> = Vector<messages.SearchCounter>; messages.getSearchResultsCalendar#6aa3f6bd flags:# peer:InputPeer saved_peer_id:flags.2?InputPeer filter:MessagesFilter offset_id:int offset_date:int = messages.SearchResultsCalendar; messages.getSearchResultsPositions#9c7f2f10 flags:# peer:InputPeer saved_peer_id:flags.2?InputPeer filter:MessagesFilter offset_id:int limit:int = messages.SearchResultsPositions;messages.markDialogUnread#8c5006f8 flags:# unread:flags.0?true parent_peer:flags.1?InputPeer peer:InputDialogPeer = Bool; messages.getDialogUnreadMarks#21202222 flags:# parent_peer:flags.0?InputPeer = Vector<DialogPeer>;messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates; messages.unpinAllMessages#62dd747 flags:# peer:InputPeer top_msg_id:flags.0?int saved_peer_id:flags.1?InputPeer = messages.AffectedHistory;messages.getUnreadReactions#bd7f90ac flags:# peer:InputPeer top_msg_id:flags.0?int saved_peer_id:flags.1?InputPeer offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages; messages.readReactions#9ec44f93 flags:# peer:InputPeer top_msg_id:flags.0?int saved_peer_id:flags.1?InputPeer = messages.AffectedHistory;channels.getMessageAuthor#ece2a0e6 channel:InputChannel id:int = User;
可以使用channels.updatePaidMessagesPrice来切换频道私信,并将频道 ID 传递给它channel:同样的方法也可以用于设置Telegram Stars用户必须付费才能向频道发送私信(或向超级群组发送消息,请参阅付费消息 »)。
一旦启用,通道.broadcast_messages_allowed标志将被设置,通道.linked_monoforum_id将自动填充一个新的特殊超级组(也称为单体论坛)的 ID 。
要向频道发送直接消息,用户只需向关联的单体论坛发送消息即可:与普通的超级群组/论坛不同,无需加入即可。
单体论坛具有以下特殊特征:
-
单体论坛的频道范围id与普通超级群组和频道的范围不同(这在生成和分类相关的机器人 API ID 时尤其重要,请参阅此处 »以了解单体论坛 ID 的正确使用方法)。
-
频道标志仅对monoforummonoforum设置。
-
通道标志只会针对关联的通道broadcast_messages_allowed设置。
-
单体论坛的频道将linked_monoforum_id被设置为关联频道的 ID。
- 如上所述,关联频道的通道将linked_monoforum_id设置为关联单体论坛的 ID。
-
发送到单体论坛的所有消息都会被分成“主题”,并重用与选项卡式论坛相同的用户界面(注意:无论频道的值如何,单体论坛都应该使用选项卡式论坛用户界面)forum_tabs。
每个主题都与一个用户关联,并且只包含用户与频道之间的直接消息历史记录。
主题由消息和消息服务saved_peer_id字段标识,该字段等于用户的 ID。
当然,这意味着 monoforum 主题的实现方式与论坛主题(基于线程)不同:这也意味着,与普通论坛不同,monoforum 完全支持消息线程,因为它们不用于主题。
请注意,消息saved_peer_id字段也用于实现一个独特的功能,即保存的消息对话框 »:在这种情况下,它将peer_id等于当前登录用户的 ID,而不是 Monoforum 的 ID。
-
拥有manage_direct_messages 管理员权限的频道管理员可以查看和回复 monoforum 所有主题发送的所有消息。
要向特定的 monoforum 主题/用户发送消息,在调用messages.sendMessage和其他方法时,频道管理员必须将inputReplyToMonoForum传递给reply_to,其中monoforum_peer_id等于主题 ID(即saved_peer_id):生成的传出消息将具有saved_peer_id等于传递的monoforum_peer_id(等于并设置为管理员和接收用户)。
该消息将以与 monoforum 关联的频道的名义发送(即send_as服务器将强制将其设置为(monoforum 的)频道) :不允许linked_monoforum_id自定义值,并且会直接忽略。send_as
Monoforum 管理员(仅限用户,不包括机器人)可以调用channels.getMessageAuthor来获取其他 Monoforum 管理员代表与 Monoforum 关联的频道发送到 Monoforum 的消息的原始发送者。
要回复 monoforum 主题中的消息,请传递inputReplyToMessage,并reply_to_msg_id像往常一样填充其他标志,使其monoforum_peer_id等于主题 ID(即saved_peer_id);与普通论坛不同,不要填充top_msg_id。
以下方法均可被频道管理员用于管理单体论坛。
- 使用messages.getSavedDialogs/messages.getSavedDialogsByID,并parent_peer传入 monoforum 的 ID,即可获取主题列表或主题列表的子集,始终以monoForumDialog 的形式返回。
以下方法需要parent_peer分别设置为论坛 ID 和peer主题 ID(否则,它们将影响已保存/普通对话,而不是论坛主题):
- 使用messages.getSavedHistory从主题的消息历史记录中获取消息(仅应在尚未缓存这些消息的新登录客户端中使用,因为在正常运行期间,monoforum 主题消息会像往常一样使用更新自动传递给客户端)。
- 使用messages.readSavedHistory将主题消息标记为已读。
- 使用messages.deleteSavedHistory可以批量删除主题中的消息。
- 使用messages.markDialogUnread、messages.getDialogUnreadMarks将特定 monoforum 主题标记为未读/取消标记,并获取现有的未读标记。
- 使用messages.getUnreadReactions和messages.readReactions来处理反应
`messages.updatePinnedMessage`可用于将消息置顶到某个主题中,只需将论坛 IDpeer和消息 ID 传递给它即可id(消息将自动置顶到包含该主题的子主题中,而不是所有主题);置顶到主题中的消息可以按照此处的说明获取 »,区别在于调用`messages.search`时, `id`peer必须等于论坛 ID,saved_peer_id`id` 必须等于主题 ID。使用`messages.unpinAllMessages`可以取消置顶论坛中的所有消息,并且可以选择设置saved_peer_id标志来仅取消置顶指定主题中的消息。
要在单个论坛中搜索消息,请使用常用的messages.search、messages.getSearchCounters、messages.getSearchResultsCalendar和messages.getSearchResultsPositions方法,并将参数设置为peer单个论坛的 ID。
要在单个论坛的主题中搜索消息,还需要将参数设置saved_peer_id为该主题的 ID。messages.getPinnedSavedDialogs、messages.toggleSavedDialogPin、messages.reorderPinnedSavedDialogs只能用于已保存的消息,不能用于monoforums。
管理员将收到updateReadMonoForumInbox/updateReadMonoForumOutbox更新,而不是updateReadChannelInbox/updateReadChannelOutbox更新。
管理员还会收到来自 monoforums 的updateDraftMessage、updateChannelReadMessagesContents、updateDialogUnreadMark、updateMessageReactionssaved_peer_id更新中的一个附加标记,其中包含主题 ID。
-
非管理员用户只能查看和发送自己所在主题的消息。
要向频道发送直接消息,用户只需向关联的单体论坛发送消息即可:与普通的超级群组/论坛不同,无需加入单体论坛。
向 monoforum 发送消息时,仍然会识别出发往 monoforum 的消息saved_peer_id,但无需设置inputReplyToMonoForum或inputReplyToMessage。monoforum_peer_id
从用户的角度来看,单主题论坛顾名思义就是单主题论坛,因此在使用 API 时应该像对待超级群组一样对待它们。
对于图形客户端,用户端界面应与一对一聊天所使用的界面类似。
要以(非管理员)用户身份与单体论坛中的消息进行交互,请使用通常用于超级群组的所有方法,而不是变messages.*Saved*体,并且不要使用上面列出的任何修改后的saved_*参数,这些参数只能由单体论坛管理员使用。
某些更新也是如此:非管理员用户永远不会saved_peer_id在updateDraftMessage、updateDialogUnreadMark中收到额外的标志,但会在updateMessageReactions、updateChannelReadMessagesContents中收到该标志。
同样,非管理员用户永远不会收到updateReadMonoForumInbox/updateReadMonoForumOutbox 的更新,而是收到updateReadChannelInbox/updateReadChannelOutbox 的更新。
付费私信
---functions---channels.updatePaidMessagesPrice#4b12327b flags:# broadcast_messages_allowed:flags.0?true channel:InputChannel send_paid_messages_stars:long = Updates;频道所有者可以选择向希望发送私信的用户收取一定数量的星星。
要启用或禁用付费私信,请相应地填充channels.updatePaidMessagesPricesend_paid_messages_stars字段:请记住,始终传递频道的 ID,而不是链接的单体论坛的 ID(这与超级群组或普通论坛中的付费消息不同,在这些情况下,必须使用超级群组/单体论坛的 ID)。channelchannel
请点击这里»查看完整流程的更多信息。
推荐帖子
Telegram 为频道管理员提供了一个强大的盈利功能:推荐帖子。
可以通过频道的单一论坛提交帖子建议,请点击此处»查看完整流程。
Monoforum链接
Monoforum 链接可用于打开与频道关联的直接消息聊天(又称 monoforum),有关 monoforum 的更多信息,请参阅此处 »。
注意:分享发送到单一论坛的消息时,请使用普通消息链接»,并使用单一论坛的 ID,而不是关联频道的 ID;同样的规则也适用于所有其他涉及单一论坛的聊天相关链接。