Skip to main content
 首页 » 编程设计

python之不明白为什么这个TypeError : can only concatenate list (not "dict") to list started occurring

2025年05月04日20JeffreyZhao

我曾使用此代码来帮助删除群发消息,但现在由于某种原因它无法正常工作。

删除来自特定 channel 的所有消息:

Traceback (most recent call last): 
  File "C:\Users\test\OneDrive\Documents\mass.py", line 33, in <module> 
delete_all(auth_token, channel_id, username1, username2, get_all_messages(auth_token, channel_id)) 
 
  File "C:\Users\test\OneDrive\Documents\mass.py", line 16, in get_all_messages 
prev = prev + messages 
 
TypeError: can only concatenate list (not "dict") to list 

代码:

import json, requests, sys 
print ("Delete all messages from specific channel") 
 
username1 = "test" 
username2 = "test#0001" 
auth_token = "RWYFHyrtYRY.RYYR_jqj114452E" 
channel_id = "345634345364" 
delete_from_all_users = "False" 
 
def get_all_messages(auth, id, last="", prev=[]): 
    if not last: 
        messages = json.loads(requests.get("http://canary.discordapp.com/api/v6/channels/" + id + "/messages", headers={"authorization": auth}, params={"limit": 100}).content) 
    else: 
        messages = json.loads(requests.get("http://canary.discordapp.com/api/v6/channels/" + id + "/messages", headers={"authorization": auth}, params={"before" : last, "limit" : 100}).content) 
 
    prev = prev + messages 
 
    if len(messages) < 100: 
        print ("Got to end of channel at " + str(len(prev)) + " messages") 
        return prev 
    else: 
        oldest = sorted(messages, key=lambda x: x["timestamp"], reverse=True)[-1] 
        return get_all_messages(auth, id, last=oldest["id"], prev=prev) 
 
def delete_all(auth, id, user1, user2, messages): 
    print ("Trying to delete all messages in " + id + " from username " + user1) 
    for message in messages: 
        # print(message["author"]["username"]) 
        if (message["author"]["username"] == user1): 
            requests.delete("http://canary.discordapp.com/api/v6/channels/" + id + "/messages/" + message["id"],headers={"authorization": auth}) 
    print ("All messages were deleted") 
 
delete_all(auth_token, channel_id, username1, username2, get_all_messages(auth_token, channel_id)) 

我不确定发生了什么变化。剧本奏效了。一个月后我再次运行它,得到了这个错误。

请您参考如下方法:

如果您希望在接收到的内容本身就是一个列表时保持具有平面列表的旧行为,而且还能够将非列表接收到的消息作为单独的项目附加,请考虑:

if isinstance(messages, list): 
    prev.extend(messages) 
else:  # messages is not really a list! 
    prev.append(messages) 

否则,如果您只想将新收到的一批消息作为单个项目附加到您的列表中,无论如何,这看起来像:

prev.append(messages) 

如果右侧的内容也是列表,则只能将+ 与左侧的列表一起使用。错误消息表明这里不是这种情况(在您今天从服务器获得的响应中,右侧的内容是字典而不是列表)。