Русский чат бот для Вконтакте на Powershell скрипте

  1. генерація токена
  2. Powershell скрипт "Русский чат бот для вконтакте":

У минулій запису я вже писав про те, як можна реалізувати у себе автовідповідач для популярних соціальних мереж , Який буде спілкуватися замість Вас. Раніше я їм активно грався. Цей російський чат бот для Вконтакте мною використовувався для того, щоб виявити спамера в незнайомому співрозмовникові і не відволікатися на його повідомлення. Але коли Вконтакте ввело кнопку "Спам" і стало успішно боротися зі спамом, потреба автовідповідача відпала.

Тепер прийшла друга біда: купа незнайомих людей намагаються втягнути мене в політичні дискусії на тему Україна-Росія-США, які мені абсолютно не цікаві.

Тому захотілося відродити той автовідповідач - нехай він обговорює про візитках Яроша, великий комбінатор Бендера, кріп і американців, які хочуть нас посварити. Навіщо мені на цю дурницю відволікатися? Краще вже поверну до ладу автовідповідач, це більш веселе заняття =) Тільки ось захотілося допив в ньому дещо, для зручності. І обійтися без установки delphi, та й qip не хотів встановлювати. Тому переписав його на Powershell -скріпте.

До речі про користь скрипта: ось пишу зараз цей запис, а паралельно зі скриптом якась дівчина спілкується, вона вже п'ять годин випрошує у мого скрипта скинути гроші на телефон, при цьому скрипт хитрий - і телефон отримав, і гроші пообіцяв скинути (тільки не зараз), і умову поставив: скине якщо вона, дівчина, буде себе добре вести. Ось і спілкуються вже так 5 годин. Співрозмовниця намагається з'ясувати коли саме і скільки грошей скрипт збирається їй скинути, ну і спілкується з ним за життя, щоб його не образити =)

Крім самого скрипта нам знадобиться:

  • База питань-відповідей - текстовий файл такого ж формату, як і в боті реалізованому через QIP плагін . В скрипті використовується той же формат бази. Качайте архіви за такими адресами: раз або два і скопіюйте в них файл reg.txt
  • Згенерувати токен - ключ, завдяки якому вконтакте зрозуміє що скрипт, це Ви. Для цього, в свою чергу, потрібно:
    • Створити у вконтакте своє standalone-додаток і скопіювати його id.

З базою питань-відповідей все зрозуміло, йдете по посиланнях і качаєте одну з тих баз, якими люди поділилися. Рекомендую базу вдосконалювати, чим більше в ній буде питань і більш продуманої її структура - тим більше людські діалоги будуть виходити. Своєю базою я поки не готовий ділиться =) Може потім реалізую на сайті api через яке можна буде посилати питання і отримувати відповідь з бази.

генерація токена

За адресою com/editapp?act=create> vk.com/editapp?act=create створюємо standalone-додаток (під яким виступатиме цей скрипт), назва можете вписати будь-яке. При створенні програми вконтакте пошле Вам на телефон код, який потрібно буде ввести.

Далі в створеному додатку переходимо на вкладку "настройки" і запам'ятовуємо "ID додатки" - воно нам знадобиться для генерації токена.

Чесно кажучи Вам не обов'язково створювати свій додаток, досить взяти ID вже будь-якого, створеного ким завгодно додатки. Але є "але":

  • Воно повинно бути standalone-типу: відправлення повідомлень доступно тільки Standalone-додатків.
  • Під вконтакте є обмеження по кількості звернень в секунду з будь-якої програми. І щоб кілька користувачів використовуючи один і той же програма не вперлося в це обмеження, краще створити свій додаток.
  • Цьому додатком будуть видані ті права які вписані в засланні отримання токена - будьте обережні. Краще створити свій додаток, а не надавати чужому будь-які небезпечні права

Отримали ID додатки? Йдемо далі.

Переходимо в браузері за такою адресою:

https://oauth.vk.com/authorize?client_id=ТутIDПриложения&scope=offline,messages&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.24&response_type=token

Замість "ТутIDПріложенія" вказуємо ID свого застосування.

"Scope = offline, messages" - говорить про те, що токен буде надано:

  • офлайновий доступ (термін дії токена буде нескінченний, не потрібно буде раз на добу отримувати новий)
  • доступ до повідомлень

При переході за вказаною адресою у вас запитають права на:

  • Доступ до повідомлень (ми хочемо отримувати і відправляти повідомлення)
  • Особистої інформації (завжди запитується)
  • У будь-який час (так як токен безстроковий)

Дозволяємо.

Після чого ви потрапите на сторінку з текстом:

Будь ласка, не копіюйте дані з адресного рядка для сторонніх сайтів. Таким чином Ви можете втратити доступ до вашого облікового запису.

А в адресному рядку браузера буде приблизно така адреса:

https://oauth.vk.com/blank.html#access_token=6fd83efcffc00be12345678901234567890123456789a23b7b73a4dc3e7c64ec5914768c8dbddd2d461af&expires_in=0&user_id=24552345

Токен це те, що починається після "access_token =" і закінчується перед "& expires_in =". Його і вставляємо в скрипт.

Powershell скрипт "Русский чат бот для вконтакте":

# Скрипт автответчіка для Вконтакте # Автор: elims.org.ua # Дані які потрібно вказати: $ users_id = 2141,1234234,134156,4525 #id людей, яких ігнорувати, тобто з ними скрипт не спілкуватиметься $ base_file_path = "C: \ Dropbox \ QIPBot \ reg.txt "# вказуємо де знаходиться файл з базою питань-відповідей $ token =" 6fd83efcffc00be12345678901234567890123456789a23b7b73a4dc3e7c64ec5914768c8dbddd2d461af "# вказуємо токен function get_message_base {# отримуємо і конвертуємо базу питань відповідей $ message_base_file = Get-Content $ base_file_path $ global: file_modify = [int] [double] :: Parse ($ (Get-Date -date (Get-Item C: \ Dropbox \ QIPBot \ reg.txt) .LastWriteTime.ToUniversalTime () -uformat% s)) # дата зміни файлу в юнікс форматі $ global: message_base = @ {} # створ аем порожній асоціативний масив $ global: message_base.matches = @ {} $ global: message_base.answers = @ {} $ i = 0 foreach ($ line in $ message_base_file) {# для кожного рядка з файлу if ($ line -match ' ^ \ ^. * \ $$ ') {# якщо знайшли правило $ global: message_base.matches [$ i] = $ line # записуємо правило в масив $ line_j = $ line_i + 2 # номер рядка з якої починаються відповіді на правило $ answers_i = 0 # кількість відповідей на правило $ answers = @ {} # масив з відповідей на певне питання do {# записуємо відповіді на правило в окремий масив $ answers [$ answers_i] = $ message_base_file [$ line_j] # записуємо відповіді на певне питання в масив $ answers_i ++ $ line_j ++} while (-not ($ message_base_file [$ line_j + 1] -match '^ \ ^. * \ $$') - and ($ line_j - le $ message_base_file.count)) $ global: message_base.answers [$ i] = $ answers # записуємо масив відповідей на певне питання в загальний масив відповідей $ i ++} $ line_i ++ # номер поточного рядка в файлі}} get_message_base # отримуємо id останнього повідомлення , на всі наступні потрібно відповідати: $ uri = "https://api.vk.com/method/messages.get?count=1&v=5.24&access_token="+$token $ request = Invoke-WebRequest -Uri $ uri $ response_array = $ request.content | ConvertFrom-Json # Конвертуємо отримані дані з формату JSON в масив $ message_id_last = $ response_array.response.items [0] .id "id останнього повідомлення:" + $ message_id_last # Нескінченний цикл, в якому відбувається спілкування: do {$ uri = " https://api.vk.com/method/messages.get?count=10&v=5.24&access_token="+$token $ request = Invoke-WebRequest -Uri $ uri # отримали останні 10 вхідних повідомлень $ response_array = $ request.content | ConvertFrom-Json # Конвертуємо отримані дані з формату JSON в масив $ message_id = $ response_array.response.items $ items_i = $ response_array.response.items.count do {# йдемо в зворотному порядку за повідомленнями $ items_i-- $ item = $ response_array .response.items [$ items_i] # якщо людина не серед виключених і повідомлення має id більше того, після якого потрібно відповідати if (-not ($ users_id -contains $ item.user_id) -and ($ item.id -gt $ message_id_last )) {$ i = 0 do {# для кожного правила $ i ++ if ($ item.body -match $ message_base.matches [$ i]) {# перевіряємо чи підпадає повідомлення під правило "Питання від" + $ item.user_id + "id-повідомлення:" + $ item.id + ":" + $ item.body $ maximum = $ message_base.answers [$ i] .count - 1 if ($ maximum -gt 0) {$ answer_number = Get-Random -minim um 0 -maximum $ maximum} else {$ answer_number = 0} $ answer = $ message_base.answers [$ i] [$ answer_number] $ time_sleep = $ answer.length / 5 # дивимося скільки символів у відповіді і ділимо на 5 для імітації швидкості друку 5 символів в секунду $ time_sleep_i = 0 "Час загального сну:" + $ time_sleep do {# затримка для імітування швидкості друку, раз в 10 секунд посилаємо запит, який говорить що йде друк $ uri = "https: // api. vk.com/method/messages.setActivity?user_id= "+ $ item.user_id +" & type = typing & v = 5.24 & access_token = "+ $ token # посилаємо процес набору тексту $ request = Invoke-WebRequest -Uri $ uri if ($ time_sleep - $ time_sleep_i -ge 10) { "спимо 10 секунд" Start-Sleep -s 10} else { "спимо секунд:" + ($ time_sleep- $ time_sleep_i) Start-Sleep -s ($ time_sleep- $ time_sleep_i)} $ time _sleep_i = $ time_sleep_i + 10} while ($ time_sleep_i -lt $ time_sleep) "Відповідь: $ i з" + $ message_base.matches.count + "" + $ answer if ($ i -eq ($ message_base.matches.count - 1)) {# зберігаємо питання на які не були знайдені відповіді і підпали під загальне правило $ item.body | Out-File -Append "C: \ Temp \ questions-without-answers.txt" -Encoding UTF8 # відповіді на ці питання можна придумати і додати в базу} $ i = -1 # відповідь знайдений, перериваємо подальший пошук маски $ message_id_last = $ item.id # оновлюємо покажчик на останній отвеченних повідомлення # посилаємо відповідь $ uri = "https://api.vk.com/method/messages.send?user_id="+$item.user_id+"&message="+$answer+" & v = 5.24 & access_token = "+ $ token $ request = Invoke-WebRequest -Uri $ uri}} while (($ i -le $ message_base.matches.count-2) -and ($ i -ne -1))}} while ($ items_i -ge 0) $ file_modify_check = [int] [double] :: Parse ($ (Get-Date -date (Get-Item $ base_file_path) .LastWriteTime.ToUniversalTime () -uformat% s)) # unix- час останньої модифікації файлу питань-відповідей if ($ file_modify_check -gt $ file_modify) {get_message_base} # якщо баз питань відповідей змінювалася, то знову її зчитуємо $ time = [int] [double] :: Parse ($ (Get-Date -date (get-date) .ToUniversalTime () - uformat% s)) # беремо даний час в юнікс- форматі і переводить в ціле число write-host ( "$ time Наступний запит буде через 5 секунди. Останнє повідомлення $ message_id_last ") Start-Sleep -s 5} while (1 -eq 1) # нескінченний цикл

На самому початку скрипта, після рядка "# Дані які потрібно вказати:" вказуємо свої дані (замість моїх): id-людей з якими автовідповідач не повинен спілкуватися, шлях до файлу з питаннями-відповідями і токен.

Запускаємо з командного рядка Powershell-скрипт і милуємося його роботою =)

PS: На всякий випадок попереджу - користуйтеся акуратно, без зловживань, все-таки ботоводство ніде не вітається.

Сподобалося? =) Поділися з друзями:

Навіщо мені на цю дурницю відволікатися?
Com/editapp?
Com/authorize?
Get?
Get?
SetActivity?
Send?
Сподобалося?

Дополнительная информация

rss
Карта