xosski

Vk chat gpt bot

Dec 6th, 2024 (edited)
13
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.67 KB | None | 0 0
  1. import vk_api
  2. from vk_api.longpoll import VkLongPoll, VkEventType
  3. from vk_api.keyboard import VkKeyboard, VkKeyboardColor
  4. import openai
  5. import logging # Добавляем модуль логирования
  6.  
  7. # Инициализация логирования
  8. logging.basicConfig(level=logging.INFO)
  9.  
  10. # Инициализация API ВКонтакте
  11. session = vk_api.VkApi(token="")
  12. api = session.get_api()
  13.  
  14. # Инициализация API OpenAI
  15. openai.api_key = ""
  16.  
  17. # Храним историю состояния клавиатуры и данные пользователя
  18. user_states = {}
  19. user_answers = {}
  20.  
  21. def send_message(user_id, message, keyboard=None):
  22. api.messages.send(
  23. user_id=user_id,
  24. message=message,
  25. random_id=0,
  26. keyboard=keyboard
  27. )
  28.  
  29. for event in VkLongPoll(session).listen():
  30. if event.type == VkEventType.MESSAGE_NEW and event.to_me:
  31. text = event.text.strip().lower() # Приводим текст к нижнему регистру
  32. user_id = event.user_id
  33.  
  34. # Логирование полученного сообщения
  35. logging.info(f"Получено сообщение от {user_id}: {text}") # Добавляем логирование
  36.  
  37. # Логика возврата на предыдущую клавиатуру
  38. if user_id in user_states and text == "назад◀️":
  39. if len(user_states[user_id]) > 1:
  40. user_states[user_id].pop()
  41. previous_keyboard = user_states[user_id][-1]
  42. send_message(user_id, "Возвращаемся к предыдущему меню", keyboard=previous_keyboard)
  43. else:
  44. send_message(user_id, "Вы в главном меню", keyboard=user_states[user_id][0])
  45. continue
  46.  
  47. # Приветствие
  48. if text == "привет":
  49. keyboard = VkKeyboard(one_time=False)
  50. keyboard.add_button("Мои навыки", VkKeyboardColor.POSITIVE)
  51. user_states[user_id] = [keyboard.get_keyboard()]
  52. send_message(user_id, "Привет, нажми кнопку ниже", keyboard=keyboard.get_keyboard())
  53.  
  54. elif text == "начать":
  55. keyboard = VkKeyboard(one_time=False)
  56. keyboard.add_button("Мои навыки", VkKeyboardColor.POSITIVE)
  57. user_states[user_id] = [keyboard.get_keyboard()]
  58. send_message(user_id, "Привет, нажми кнопку ниже", keyboard=keyboard.get_keyboard())
  59.  
  60. # Навыки
  61. elif text == "мои навыки":
  62. keyboard = VkKeyboard()
  63. keyboard.add_button("Генератор идей", VkKeyboardColor.SECONDARY)
  64. keyboard.add_line()
  65. keyboard.add_button("Создать контент", VkKeyboardColor.SECONDARY)
  66. keyboard.add_line()
  67. keyboard.add_button("Сгенерировать изображение", VkKeyboardColor.SECONDARY)
  68. keyboard.add_line()
  69. keyboard.add_button("Инфомационные статьи", VkKeyboardColor.SECONDARY)
  70. keyboard.add_line()
  71. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  72. if user_id not in user_states:
  73. user_states[user_id] = [keyboard.get_keyboard()]
  74. else:
  75. user_states[user_id].append(keyboard.get_keyboard())
  76. send_message(user_id, "Выберите из перечня, представленного ниже", keyboard=keyboard.get_keyboard())
  77.  
  78. # Генератор идей
  79. elif text == "генератор идей":
  80. # Формируем запрос для ChatGPT
  81. prompt = "Ты копирайтер в социальной сети ВК, который генерирует идеи для постов. Придумай креативную и уникальную идею для поста в тематическом сообществе, ответ дай в не более чем двух предложениях.\n Примеры идей:\nНовости\nОпросы\nКонтакт с аудиторией через комментарии\nЛичные истории \nОбмен опытом"
  82.  
  83. # Запрос к OpenAI
  84. try:
  85. response = openai.ChatCompletion.create(
  86. model="gpt-4o-mini", # Или используйте gpt-3.5-turbo
  87. messages=[{
  88. "role": "system", "content": ""
  89. }, {
  90. "role": "user", "content": prompt
  91. }],
  92. max_tokens=2000,
  93. )
  94.  
  95. # Извлекаем текст ответа
  96. idea_text = response['choices'][0]['message']['content'].strip()
  97. send_message(user_id, f"Идея для поста: {idea_text}", keyboard=user_states[user_id][0])
  98. except Exception as e:
  99. send_message(user_id, "Произошла ошибка при генерации идеи. Попробуйте снова позже.", keyboard=user_states[user_id][0])
  100. print(f"Error with OpenAI request: {e}")
  101.  
  102.  
  103. # Создание контента
  104. elif text == "создать контент":
  105. keyboard = VkKeyboard()
  106. keyboard.add_button("Начать создание поста", VkKeyboardColor.POSITIVE)
  107. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  108. if user_id not in user_states:
  109. user_states[user_id] = [keyboard.get_keyboard()]
  110. else:
  111. user_states[user_id].append(keyboard.get_keyboard())
  112. send_message(user_id, "Выберите действие для создания контента", keyboard=keyboard.get_keyboard())
  113.  
  114. # Начало создания поста
  115. elif text == "начать создание поста":
  116. # Запоминаем, что ожидаем ответ на вопрос о теме
  117. if user_id not in user_states:
  118. user_states[user_id] = ["waiting_for_topic"]
  119. else:
  120. user_states[user_id].append("waiting_for_topic")
  121. send_message(user_id, "Напишите, о чём будет идти речь в вашем посте.")
  122.  
  123. # Ожидаем ответ на вопрос "О чём?"
  124. elif user_id in user_states and user_states[user_id][-1] == "waiting_for_topic":
  125. user_answers[user_id] = {"topic": text} # Сохраняем тему
  126. # Запоминаем, что ожидаем ответ на вопрос "Зачем?"
  127. if user_id not in user_states:
  128. user_states[user_id] = ["waiting_for_purpose"]
  129. else:
  130. user_states[user_id].append("waiting_for_purpose")
  131. send_message(user_id, "Теперь, зачем вы хотите создать этот пост?")
  132.  
  133. # Ожидаем ответ на вопрос "Зачем?"
  134. elif user_id in user_states and user_states[user_id][-1] == "waiting_for_purpose":
  135. user_answers[user_id]["purpose"] = text # Сохраняем цель
  136. # Запоминаем, что ожидаем ответ на вопрос "Целевая аудитория"
  137. if user_id not in user_states:
  138. user_states[user_id] = ["waiting_for_audience"]
  139. else:
  140. user_states[user_id].append("waiting_for_audience")
  141. send_message(user_id, "Теперь напишите для кого этот текст: возраст, специалитет и т.д.")
  142.  
  143. # Ожидаем ответ на вопрос "Целевая аудитория"
  144. elif user_id in user_states and user_states[user_id][-1] == "waiting_for_audience":
  145. user_answers[user_id]["audience"] = text # Сохраняем целевую аудиторию
  146. # Запоминаем, что ожидаем ответ на вопрос "Тональность текста"
  147. if user_id not in user_states:
  148. user_states[user_id] = ["waiting_for_tone"]
  149. else:
  150. user_states[user_id].append("waiting_for_tone")
  151. send_message(user_id, "Теперь выберите тональность текста. Например: неформальный, официальный и т.д.")
  152.  
  153. # Ожидаем ответ на вопрос "Тональность текста"
  154. elif user_id in user_states and user_states[user_id][-1] == "waiting_for_tone":
  155. user_answers[user_id]["tone"] = text # Сохраняем тональность
  156. # Формируем запрос для ChatGPT
  157. prompt = f"Ты копирайтер в социальной сети ВК, который создаёт посты для сообщества. Ты должен написать пост на тему {user_answers[user_id]['topic']}, который {user_answers[user_id]['purpose']} пользователя, для следующей целевой аудитории {user_answers[user_id]['audience']} и выдерживай следующую тональность текста: {user_answers[user_id]['tone']}."
  158.  
  159. # Запрос к OpenAI
  160. try:
  161. response = openai.ChatCompletion.create(
  162. model="gpt-4o-mini", # Или используйте gpt-3.5-turbo
  163. messages=[{
  164. "role": "system", "content": "Ты копирайтер в социальной сети ВК, который создаёт посты для сообщества."
  165. }, {
  166. "role": "user", "content": f"Напиши пост на тему {user_answers[user_id]['topic']}, который {user_answers[user_id]['purpose']} пользователя, для следующей целевой аудитории {user_answers[user_id]['audience']} и выдерживай следующую тональность текста: {user_answers[user_id]['tone']}."
  167. }],
  168. max_tokens=2000,
  169. )
  170. # Извлекаем текст ответа
  171. post_text = response['choices'][0]['message']['content'].strip()
  172. send_message(user_id, post_text, keyboard=None)
  173. except Exception as e:
  174. send_message(user_id, "Произошла ошибка при генерации поста. Попробуйте снова позже.", keyboard=None)
  175. print(f"Error with OpenAI request: {e}")
  176.  
  177. # Возвращаем пользователя в главное меню
  178. send_message(user_id, "Возвращаем вас в главное меню", keyboard=user_states[user_id][0])
  179. user_states[user_id] = [user_states[user_id][0]]
  180.  
  181. # Сгенерировать изображение
  182. elif text == "сгенерировать изображение":
  183. # Ожидаем описание
  184. if user_id not in user_states:
  185. user_states[user_id] = ["waiting_for_image_description"]
  186. else:
  187. user_states[user_id].append("waiting_for_image_description")
  188. send_message(user_id, "Напишите описание поста или подробно опишите, какое изображение нужно.")
  189.  
  190. # Обрабатываем описание для изображения
  191. elif user_id in user_states and user_states[user_id][-1] == "waiting_for_image_description":
  192. description = text # Сохраняем описание
  193. # Перевод описания на английский
  194. try:
  195. translation = openai.ChatCompletion.create(
  196. model="gpt-4o-mini",
  197. messages=[{
  198. "role": "system", "content": "Translate the following text to English for an image generation prompt."
  199. }, {
  200. "role": "user", "content": description
  201. }],
  202. max_tokens=2000,
  203. )
  204. translated_description = translation['choices'][0]['message']['content'].strip()
  205.  
  206. # Генерация изображения через DALL-E
  207. image_prompt = f"Generate an image based on this description: {translated_description}"
  208. image_response = openai.Image.create(
  209. model='dall-e-3',
  210. prompt=image_prompt,
  211. n=1,
  212. size="1024x1024",
  213. )
  214. image_url = image_response['data'][0]['url']
  215. send_message(user_id, f"Ваше изображение готово: {image_url}")
  216. except Exception as e:
  217. send_message(user_id, "Произошла ошибка при генерации изображения. Попробуйте снова позже.")
  218. print(f"Error with image generation: {e}")
  219.  
  220. # Возвращаем пользователя в главное меню
  221. send_message(user_id, "Возвращаем вас в главное меню", keyboard=user_states[user_id][0])
  222. user_states[user_id] = [user_states[user_id][0]]
  223.  
  224. elif text == "инфомационные статьи":
  225. keyboard = VkKeyboard()
  226. keyboard.add_button("Вовлечённость", VkKeyboardColor.SECONDARY)
  227. keyboard.add_button("Набор аудитории", VkKeyboardColor.SECONDARY)
  228. keyboard.add_line()
  229. keyboard.add_button("Анализ и статистика", VkKeyboardColor.SECONDARY)
  230. keyboard.add_button("Как писать посты", VkKeyboardColor.SECONDARY)
  231. keyboard.add_line()
  232. keyboard.add_button("Как популяризировать сообщество", VkKeyboardColor.SECONDARY)
  233. keyboard.add_line()
  234. keyboard.add_button("Как уникализировать сообщество", VkKeyboardColor.SECONDARY)
  235. keyboard.add_line()
  236. keyboard.add_button("Распространить сообщество", VkKeyboardColor.SECONDARY)
  237. keyboard.add_line()
  238. keyboard.add_button("FeedBack с аудиторией", VkKeyboardColor.SECONDARY)
  239. keyboard.add_line()
  240. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  241. if user_id not in user_states:
  242. user_states[user_id] = [keyboard.get_keyboard()]
  243. else:
  244. user_states[user_id].append(keyboard.get_keyboard())
  245. send_message(user_id, "Выберите действие для создания контента", keyboard=keyboard.get_keyboard())
  246.  
  247. elif text == "вовлечённость":
  248. keyboard = VkKeyboard()
  249. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  250. if user_id not in user_states:
  251. user_states[user_id] = [keyboard.get_keyboard()]
  252. else:
  253. user_states[user_id].append(keyboard.get_keyboard())
  254. send_message(user_id, "• Качественный контент: Создавайте интересные и информативные посты. \n• Призывы к действию: В конце постов побуждайте пользователей делиться вашим контентом.\n• Хэштеги: Используйте релевантные хэштеги для увеличения охвата.", keyboard=keyboard.get_keyboard())
  255.  
  256. elif text == "набор аудитории":
  257. keyboard = VkKeyboard()
  258. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  259. if user_id not in user_states:
  260. user_states[user_id] = [keyboard.get_keyboard()]
  261. else:
  262. user_states[user_id].append(keyboard.get_keyboard())
  263. send_message(user_id, "• Анализ целевой аудитории: Определите, кто ваши потенциальные подписчики, их интересы и поведение.\n • Контент по интересам: Публикуйте материалы, которые интересны вашей целевой аудитории (статьи, видео, инфографика). \n• Хэштеги и ключевые слова: Используйте релевантные хэштеги и ключевые слова для повышения видимости постов.\n • Обратная связь: Общайтесь с подписчиками, задавайте вопросы и учитывайте их мнение при создании контента.", keyboard=keyboard.get_keyboard())
  264.  
  265. elif text == "вовлечённость":
  266. keyboard = VkKeyboard()
  267. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  268. if user_id not in user_states:
  269. user_states[user_id] = [keyboard.get_keyboard()]
  270. else:
  271. user_states[user_id].append(keyboard.get_keyboard())
  272. send_message(user_id, "", keyboard=keyboard.get_keyboard())
  273.  
  274. elif text == "как писать посты":
  275. keyboard = VkKeyboard()
  276. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  277. if user_id not in user_states:
  278. user_states[user_id] = [keyboard.get_keyboard()]
  279. else:
  280. user_states[user_id].append(keyboard.get_keyboard())
  281. send_message(user_id, "• Заголовок: Начинайте с привлекательного заголовка, который привлечёт внимание.\n \n• Структура текста: Используйте короткие абзацы, списки и подзаголовки для удобства восприятия.\n \n• Визуализация: Добавляйте изображения, видео или GIF-файлы, чтобы сделать посты более привлекательными.\n \n• Призыв к действию: Завершайте посты призывом к действию (например, «Поделитесь мнением в комментариях»).\n \n• Адаптация под аудиторию: Пишите в том стиле и тоне, который соответствует интересам и ожиданиям вашей аудитории.\n \n PS. Или воспользоваться встроенной функцией в нашем боте :)", keyboard=keyboard.get_keyboard())
  282.  
  283. elif text == "анализ и статистика":
  284. keyboard = VkKeyboard()
  285. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  286. if user_id not in user_states:
  287. user_states[user_id] = [keyboard.get_keyboard()]
  288. else:
  289. user_states[user_id].append(keyboard.get_keyboard())
  290. send_message(user_id, "• Статистика сообщества: Регулярно проверяйте статистику по подписчикам, охвату и вовлеченности.\n \n• Анализ постов: Определяйте, какие посты вызывают наибольший интерес, и адаптируйте контент на основе этого.\n \n• Мониторинг конкурентов: Следите за успехами других сообществ для выявления трендов", keyboard=keyboard.get_keyboard())
  291.  
  292. elif text == "как популяризировать сообщество":
  293. keyboard = VkKeyboard()
  294. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  295. if user_id not in user_states:
  296. user_states[user_id] = [keyboard.get_keyboard()]
  297. else:
  298. user_states[user_id].append(keyboard.get_keyboard())
  299. send_message(user_id, "• Регулярный контент: Постите регулярно, чтобы поддерживать интерес.\n \n• Таргетированная реклама: Используйте возможности рекламы ВК для привлечения целевой аудитории.\n\n• Сотрудничество: Объединяйтесь с другими сообществами или блогерами для кросс-промоции.\n\n• Конкурсы и акции: Проводите розыгрыши, чтобы привлечь новых подписчиков.", keyboard=keyboard.get_keyboard())
  300.  
  301. elif text == "как уникализировать сообщество":
  302. keyboard = VkKeyboard()
  303. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  304. if user_id not in user_states:
  305. user_states[user_id] = [keyboard.get_keyboard()]
  306. else:
  307. user_states[user_id].append(keyboard.get_keyboard())
  308. send_message(user_id, "• Определите свою нишу: Найдите уникальную тему или угол зрения, который отличает вас от конкурентов.\n \n• Оригинальный стиль: Разработайте свой стиль общения и визуального оформления.\n \n• Эксклюзивный контент: Предлагайте материалы, которые нельзя найти в других сообществах.", keyboard=keyboard.get_keyboard())
  309.  
  310. elif text == "распространить сообщество":
  311. keyboard = VkKeyboard()
  312. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  313. if user_id not in user_states:
  314. user_states[user_id] = [keyboard.get_keyboard()]
  315. else:
  316. user_states[user_id].append(keyboard.get_keyboard())
  317. send_message(user_id, "• Целевая реклама: Используйте таргетированную рекламу ВКонтакте, чтобы привлечь пользователей, которые интересуются вашей тематикой.\n \n• Партнёрства: Сотрудничайте с другими сообществами или блогерами в вашей нише для взаимного продвижения.\n \n • Конкурсы и розыгрыши: Организуйте конкурсы, которые требуют подписки на ваше сообщество для участия. \n \n • Кросс-промоция: Продвигайте ваше сообщество на других платформах (Instagram, Facebook, Telegram и т.д.).\n \n• Контент-маркетинг: Создавайте качественный контент, который будет делиться пользователями.", keyboard=keyboard.get_keyboard())
  318.  
  319. elif text == "feedback с аудиторией":
  320. keyboard = VkKeyboard()
  321. keyboard.add_button("Назад◀️", VkKeyboardColor.NEGATIVE)
  322. if user_id not in user_states:
  323. user_states[user_id] = [keyboard.get_keyboard()]
  324. else:
  325. user_states[user_id].append(keyboard.get_keyboard())
  326. send_message(user_id, "• Ответы на комментарии: Регулярно отвечайте на комментарии и сообщения подписчиков.\n \n• Опросы и вопросы: Проводите опросы, чтобы узнать мнение аудитории.\n \n• Участие в дискуссиях: Активно участвуйте в обсуждениях, создавая атмосферу открытости.", keyboard=keyboard.get_keyboard())
  327. else:
  328. send_message(user_id, "Произошла ошибка, возвращаю вас в гланое меню", keyboard=user_states[user_id][0])
  329. user_states[user_id] = [user_states[user_id][0]]
Add Comment
Please, Sign In to add comment