tgvkbot/bot.py
2017-06-21 19:07:15 +03:00

181 lines
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import telebot
from telebot import types
from vk_messages import VkMessage, VkPolling
import vk
import threading
import re
import logging
import cherrypy
from credentials import token, vk_app_id, local_port
logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.WARNING, filename='vk.log')
vk_threads = {}
vk_tokens = {}
bot = telebot.AsyncTeleBot(token)
bot.remove_webhook()
link = 'https://oauth.vk.com/authorize?client_id={}&' \
'display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,messages,offline' \
'&response_type=token&v=5.65'.format(vk_app_id)
mark = types.InlineKeyboardMarkup()
yes = types.InlineKeyboardButton('ВХОД', url=link)
mark.add(yes)
def create_thread(message, vk_token):
a = VkPolling()
t = threading.Thread(name='vk' + str(message.from_user.id), target=a.run, args=(vk_token, bot, message.chat.id,))
t.setDaemon(True)
t.start()
vk_threads[str(message.from_user.id)] = a
vk_tokens[str(message.from_user.id)] = vk_token
def check_thread(message):
for th in threading.enumerate():
if th.getName() == 'vk' + str(message.from_user.id):
return False
return True
def stop_thread(message):
for th in threading.enumerate():
if th.getName() == 'vk' + str(message.from_user.id):
t = vk_threads[str(message.from_user.id)]
t.terminate()
th.join()
def extract_unique_code(text):
# Extracts the unique_code from the sent /start command.
try:
return text[45:].split('&')[0]
except:
return None
def verifycode(code):
session = vk.Session(access_token=code)
api = vk.API(session)
return dict(api.account.getProfileInfo(fields=[]))
def info_extractor(info):
info = info[0].url[8:-1].split('.')
return info
@bot.message_handler(commands=['stop'])
def stop_command(message):
if not check_thread(message):
stop_thread(message)
bot.send_message(message.chat.id, 'Успешный выход!').wait()
else:
bot.send_message(message.chat.id, 'Вход не был выполнен!').wait()
@bot.message_handler(commands=['start'])
def start_command(message):
if check_thread(message):
bot.send_message(message.chat.id,
'Привет, этот бот поможет тебе общаться ВКонтакте, войди по кнопке ниже'
' и отправь мне то, что получишь в адресной строке.',
reply_markup=mark).wait()
else:
bot.send_message(message.chat.id, 'Вход уже выполнен!\n/stop для выхода.').wait()
"""def vk_sender(message, method):
if message.reply_to_message:
if str(message.from_user.id) in vk_tokens:
info = info_extractor(message.reply_to_message.entities)
if info is not None:
if len(info) - 1:
method(message, info[0], False)
vk.API(vk_tokens[str(message.from_user.id)].session).messages.send(chat_id=info[1],
message=message.text)
else:
method(message, info[0], True)
vk.API(vk_tokens[str(message.from_user.id)].session).messages.send(user_id=info[0],
message=message.text)
else:
bot.send_message(message.chat.id, 'Вход не выполнен! /start дл входа').wait()
def send_audio(msg, info, private):
if private:
pass
else:
pass
@bot.message_handler(content_types=['audio'])
def reply_audio(message):
vk_sender(message, send_audio)"""
@bot.message_handler(content_types=['text'])
def reply_text(message):
m = re.search('https://oauth\.vk\.com/blank\.html#access_token=[a-z0-9]*&expires_in=[0-9]*&user_id=[0-9]*',
message.text)
if m:
code = extract_unique_code(m.group(0))
if check_thread(message):
try:
verifycode(code)
create_thread(message, VkMessage(code))
bot.send_message(message.chat.id, 'Вход выполнен!').wait()
bot.send_message(message.chat.id, 'Бот позволяет получать и отвечать на текстовые сообщения'
' из ВКонтакте\nПример личного сообщения:').wait()
bot.send_message(message.chat.id, '*Иван Петров:*\nПривет, я тут классный мессенджер нашёл,'
' попробуешь? telegram.org/download', parse_mode='Markdown').wait()
bot.send_message(message.chat.id, 'Для сообщений из групповых чатов будет указываться'
' чат после имени отправителя:').wait()
bot.send_message(message.chat.id, '*Ник Невидов @ My English is perfect:*\n'
'London is the capital of Great Britain',
parse_mode='Markdown').wait()
bot.send_message(message.chat.id, 'Чтобы ответить, используй Reply на нужное сообщение.'
' (нет, на эти не сработает, нужно реальное)',
parse_mode='Markdown').wait()
except:
bot.send_message(message.chat.id, 'Неверная ссылка, попробуй ещё раз!').wait()
else:
bot.send_message(message.chat.id, 'Вход уже выполнен!\n/stop для выхода.').wait()
return
if message.reply_to_message:
if str(message.from_user.id) in vk_tokens:
info = info_extractor(message.reply_to_message.entities)
if info is not None:
if len(info) - 1:
vk.API(vk_tokens[str(message.from_user.id)].session).messages.send(chat_id=info[1],
message=message.text)
else:
vk.API(vk_tokens[str(message.from_user.id)].session).messages.send(user_id=info[0],
message=message.text)
else:
bot.send_message(message.chat.id, 'Вход не выполнен! /start дл входа').wait()
#bot.polling()
class WebhookServer(object):
# index равнозначно /, т.к. отсутствию части после ip-адреса (грубо говоря)
@cherrypy.expose
def index(self):
length = int(cherrypy.request.headers['content-length'])
json_string = cherrypy.request.body.read(length).decode("utf-8")
update = telebot.types.Update.de_json(json_string)
bot.process_new_updates([update])
return ''
if __name__ == '__main__':
bot.remove_webhook()
bot.set_webhook('https://bot.asergey.me/{}/'.format(token))
cherrypy.config.update(
{'server.socket_host': '127.0.0.1', 'server.socket_port': local_port, 'engine.autoreload.on': False})
cherrypy.quickstart(WebhookServer(), '/', {'/': {}})