【发布时间】:2017-03-07 03:02:14
【问题描述】:
Sooo,我对编程比较陌生,并且正在尝试学习如何使用 API。因为我经常使用 Slack,所以我想我会从构建一个用于审核目的的 Slack 机器人开始。在大多数情况下,除了我尝试删除消息外,一切正常。 API 返回说它无法找到消息,即使它在通道中(松弛 API 使用时间戳来定位所述消息)。时间戳匹配,但声明消息不存在。这是我的代码:
def __init__(self, token):
self.token = token
self.users = {}
self.channels = {}
self.slack = SlackClient(self.token)
self.as_user = True
def connect(self):
if self.slack.rtm_connect():
self.post_message('#test', "*AUTOMOD* _v0.1_")
while True:
# print(self.slack.rtm_read())
self.parse_data(self.slack.rtm_read())
time.sleep(1)
def parse_data(self, payload):
if payload:
if payload[0]['type'] == 'message':
print(("user: {} message: {} channel: {}").format(payload[0]['user'], payload[0]['text'], payload[0]['channel']))
self.handle_message(payload[0])
def handle_message(self, data):
# these users can post whatever they want.
WHITELISTED = ["U4DU2TS2F", "U3VSRJJD8", "U3WLZUTQE", "U3W1Q2ULT"]
# get userid
sent_from = (data['user'])
# ignore whitelisted
if sent_from in WHITELISTED:
return
# if message was sent from someone not in WHITELISTED, delete it
else:
print(("\n\ntimestamp of message: {}").format(data['ts']))
self.delete_message(data['channel'], data['ts'])
self.post_message(data['channel'], "```" + random.choice(dongers) + "```")
def delete_message(self, channel, timestamp):
print(("deleting message in channel '{}'...").format(channel))
print("timestamp check (just to make sure): ", timestamp)
deleted = self.slack.api_call("chat.delete",
channel=channel,
timestamp=timestamp,
as_user=self.as_user
)
if deleted.get('ok'):
print("\nsuccessfully deleted.\n")
else:
print(("\ncouldn't delete message: {}\n").format(deleted['error']))
输出
timestamp of message: 1488822718.000040
deleting message in channel: 'G4DGYCW2X'
timestamp check (just to make sure...): 1488822718.000040
couldn't delete message: message_not_found
对可能发生的事情有任何想法吗?这是用于上下文的chat.delete 方法。
编辑:
由于@pvg 的“最小、完整和可验证示例”的建议,我已将项目中的整个代码放在gist 中。
【问题讨论】:
-
你应该试着把它写成minimal reproducible example。例如,当您的
handle_message方法被调用时,该消息已发布,但它被调用时,这并不是很清楚。 -
@pvg 哇,好文档。您认为将其全部发布在一个要点中会更好吗?
-
不,这是“最小”的意思。此外,代码实际上必须在您的问题中。所以最佳问题有一个独立的代码 sn-p 显示您遇到的问题,其他人可以尝试。并非总是可能,但在这种情况下可能是。另一个积极的副作用:编写其中一个通常可以让您自己找出问题。
-
@pvg 我明白你在说什么,但我在原始问题中发布的代码是罪魁祸首和最少的代码(它实际上是我的机器人中唯一没有工作)。无论如何,我已经为您的链接添加了书签,因为它似乎是一个很好的资源!
-
它不是独立的。例如,无法从您问题中的代码中看出您实际上是如何接收消息的。