TypeError: can only concatenate list (not "str") to list Ошибка на питоне
Это мой первый пост на stack overflow
Вот ошибка:
Traceback (most recent call last):
File "start.py", line 57, in <module>
Дача - 3(40000$)"""), "random_id": random.randint(1, 2147483647)})
TypeError: can only concatenate list (not "str") to list
Вот код:
import vk_api
import random
import time
import datetime
import sqlite3
# token
token = "92c9c824e08f89deed7bc3e35429fe1d9e946b02838ee2764bc3a67864468439b9d1b19a88c8d26329a9d"
vk = vk_api.VkApi(token=token)
vk._auth_token()
# conf
global db
global sql
db = sqlite3.connect('server.db')
sql = db.cursor()
sql.execute("""CREATE TABLE IF NOT EXISTS users (
name TEXT,
user_id TEXT,
cash BIGINT,
power BIGINT
)""")
db.commit()
while True:
try:
messages = vk.method("messages.getConversations", {"offset": 0, "count": 20, "filter": "unanswered"})
if messages["count"] >= 1:
id = messages["items"][0]["last_message"]["from_id"]
body = messages["items"][0]["last_message"]["text"]
if body.lower() == "начать" or body.lower() == "помощь":
sql.execute(f'SELECT user_id FROM users WHERE user_id = "{id}"')
if sql.fetchone() is None:
user_info = vk.method("users.get", {"user_id": id, "fields": "first_name"})
user_name = user_info[0]["first_name"]
sql.execute(f"INSERT INTO users VALUES (?, ?, ?, ?)", (user_name, id, 0, 1))
db.commit()
else:
sql.execute(f'SELECT name FROM users WHERE user_id = "{id}"')
result = sql.fetchall()
print(result)
user_name = result
vk.method("messages.send", {"peer_id": id, "message": user_name + str(""", мои команды:
Профиль
Казино [сумма]
Кубик [грань]
Недвижимость [id]:
Дом - 1(100000$)
Машина - 2(50000$)
Дача - 3(40000$)"""), "random_id": random.randint(1, 2147483647)})
elif body.lower() == "Профиль":
vk.method("messages.send", {"peer_id": id, "message": "Скоро!", "random_id": random.randint(1, 2147483647)})
except Exception as E:
time.sleep(1)
Ответы (1 шт):
Вполне разумно, ошибка в строке
vk.method("messages.send", {"peer_id": id, "message": user_name + str(""", мои команды:
Профиль
Казино [сумма]
Кубик [грань]
Недвижимость [id]:
Дом - 1(100000$)
Машина - 2(50000$)
Дача - 3(40000$)"""), "random_id": random.randint(1, 2147483647)})
user_name имеет тип list и вы пытаетесь его сконкатенировать со строкой, собственно ошибка вам об этом и говорит TypeError: can only concatenate list (not "str") to list, можете попробовать написать "message": ' '.join(user_name) + ... вместо "message": user_name + ...
Вкратце по коду, напишу про то, что бросилось в глаза:
- Зачем писать так
result = sql.fetchall()
print(result)
user_name = result
лучше было сразу написать так:
user_name = sql.fetchall()
print(user_name)
На будущее лучше сразу приучивать логгировать промежуточные результаты
Зачем вы используете тройные двойные ковычки, для определения строки? Достаточно использовать одни двойные или одинарные. Тройные двойные ковычки обычно используются для описания функций и методов классов. Если вы хотите использовать ковычки внутри ковычек, то их можно просто экранировать: если поставить \ перед кавычкой (одинарной или двойной), это скажет интерпретатору о том, что кавычку нужно рассматривать не как начало или конец строки, а как часть строки.
У вас в Traceback написано, что ошибка в 57 строке, лучше было выложить сразу только 57 строку или лучше команду vk.method(...), потому что из всего этого полотна кода сложно сразу понять где ошибка(мне для этого пришлось переносить код в свой редактор и искать 57 строку)
Не стоит публично выкладывать ваш токен)
Ну и небольшие комментарии вцелом по посту. Всегда рад видеть новых людей на stackoverflow. Вы пишете пост в надежде найти помощь от комьюнити, что подразумевает то, что кто-то перейдет к вам в пост прочитает его, попробует его запустить и оставить комментарий, что потребует потратить свое свободное время, а учитывая, что время профессионалов стоит дорого(тут я не говорю про себя), нужно стараться как можно меньше его отнимать. Не совсем правильно писать Вот ошибка, вот код, дальше сами разбирайтесь, это ведь вам нужно решение;)