commit
957505d53d
161
bot.py
161
bot.py
@ -19,6 +19,8 @@ vk_threads = {}
|
||||
|
||||
vk_dialogs = {}
|
||||
|
||||
VK_API_VERSION = '3.0'
|
||||
|
||||
FILE_URL = 'https://api.telegram.org/file/bot{0}/{1}'
|
||||
|
||||
vk_tokens = redis.from_url(os.environ.get("REDIS_URL"))
|
||||
@ -30,7 +32,7 @@ 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,docs,photos,video' \
|
||||
'&response_type=token&v=5.65'.format(vk_app_id)
|
||||
'&response_type=token&v={}'.format(vk_app_id, VK_API_VERSION)
|
||||
|
||||
|
||||
def get_pages_switcher(markup, page, pages):
|
||||
@ -68,7 +70,8 @@ def request_user_dialogs(session, userid):
|
||||
users_ids = []
|
||||
group_ids = []
|
||||
positive_group_ids = []
|
||||
dialogs = vk.API(session).messages.getDialogs(count=200)
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
dialogs = api.messages.getDialogs(count=200)
|
||||
for chat in dialogs[1:]:
|
||||
if 'chat_id' in chat:
|
||||
chat['title'] = replace_shields(chat['title'])
|
||||
@ -84,12 +87,12 @@ def request_user_dialogs(session, userid):
|
||||
positive_group_ids.append(str(g)[1:])
|
||||
|
||||
if users_ids:
|
||||
users = vk.API(session).users.get(user_ids=users_ids, fields=['first_name', 'last_name', 'uid'])
|
||||
users = api.users.get(user_ids=users_ids, fields=['first_name', 'last_name', 'uid'])
|
||||
else:
|
||||
users = []
|
||||
|
||||
if positive_group_ids:
|
||||
groups = vk.API(session).groups.getById(group_ids=positive_group_ids, fields=[])
|
||||
groups = api.groups.getById(group_ids=positive_group_ids, fields=[])
|
||||
else:
|
||||
groups = []
|
||||
|
||||
@ -131,8 +134,9 @@ def create_markup(message, user, page, edit=False):
|
||||
|
||||
def search_users(message, text):
|
||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
markup = types.InlineKeyboardMarkup(row_width=1)
|
||||
result = vk.API(session).messages.searchDialogs(q=text, limit=10, fields=[])
|
||||
result = api.messages.searchDialogs(q=text, limit=10, fields=[])
|
||||
for chat in result:
|
||||
if chat['type'] == 'profile':
|
||||
markup.add(types.InlineKeyboardButton('{} {}'.format(chat['first_name'], chat['last_name']),
|
||||
@ -169,7 +173,8 @@ def callback_buttons(call):
|
||||
parse_mode='HTML', reply_markup=markup).wait()
|
||||
elif 'group' in call.data:
|
||||
session = VkMessage(vk_tokens.get(str(call.from_user.id))).session
|
||||
chat = vk.API(session).messages.getChat(chat_id=call.data.split('group')[1], fields=[])
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
chat = api.messages.getChat(chat_id=call.data.split('group')[1], fields=[])
|
||||
bot.answer_callback_query(call.id,
|
||||
'Вы в беседе {}'.format(replace_shields(chat['title']))).wait()
|
||||
bot.send_message(call.from_user.id,
|
||||
@ -178,11 +183,12 @@ def callback_buttons(call):
|
||||
currentchat[str(call.from_user.id)] = {'title': chat['title'], 'id': 'group' + str(chat['chat_id'])}
|
||||
elif call.data.lstrip('-').isdigit():
|
||||
session = VkMessage(vk_tokens.get(str(call.from_user.id))).session
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
if '-' in call.data:
|
||||
user = vk.API(session).groups.getById(group_id=call.data.lstrip('-'), fields=[])[0]
|
||||
user = api.groups.getById(group_id=call.data.lstrip('-'), fields=[])[0]
|
||||
user = {'first_name': user['name'], 'last_name': ''}
|
||||
else:
|
||||
user = vk.API(session).users.get(user_ids=call.data, fields=[])[0]
|
||||
user = api.users.get(user_ids=call.data, fields=[])[0]
|
||||
bot.answer_callback_query(call.id,
|
||||
'Вы в чате с {} {}'.format(user['first_name'], user['last_name'])).wait()
|
||||
bot.send_message(call.from_user.id,
|
||||
@ -200,7 +206,9 @@ def create_thread(uid, vk_token):
|
||||
t.start()
|
||||
vk_threads[str(uid)] = a
|
||||
vk_tokens.set(str(uid), vk_token)
|
||||
vk.API(longpoller.session).account.setOffline()
|
||||
session = longpoller.session
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
api.account.setOffline()
|
||||
|
||||
|
||||
def check_thread(uid):
|
||||
@ -265,7 +273,7 @@ def extract_unique_code(text):
|
||||
|
||||
def verifycode(code):
|
||||
session = vk.Session(access_token=code)
|
||||
api = vk.API(session)
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
return dict(api.account.getProfileInfo(fields=[]))
|
||||
|
||||
|
||||
@ -422,25 +430,27 @@ def audio_title_creator(message, performer=None, title=None):
|
||||
|
||||
def send_text(message, userid, group, forward_messages=None):
|
||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
if group:
|
||||
vk.API(session).messages.send(chat_id=userid, message=message.text, forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, message=message.text, forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(user_id=userid, message=message.text, forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, message=message.text, forward_messages=forward_messages)
|
||||
|
||||
|
||||
def send_doc(message, userid, group, forward_messages=None):
|
||||
filetype = message.content_type
|
||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
if filetype == 'document' and 'video' not in message.document.mime_type:
|
||||
file = wget.download(
|
||||
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
|
||||
openedfile = open(file, 'rb')
|
||||
files = {'file': openedfile}
|
||||
fileonserver = ujson.loads(requests.post(vk.API(session).docs.getUploadServer()['upload_url'],
|
||||
fileonserver = ujson.loads(requests.post(api.docs.getUploadServer()['upload_url'],
|
||||
files=files).text)
|
||||
attachment = vk.API(session).docs.save(file=fileonserver['file'],
|
||||
title=getattr(message, filetype).file_name,
|
||||
tags='')
|
||||
attachment = api.docs.save(file=fileonserver['file'],
|
||||
title=getattr(message, filetype).file_name,
|
||||
tags='')
|
||||
openedfile.close()
|
||||
os.remove(file)
|
||||
|
||||
@ -450,10 +460,10 @@ def send_doc(message, userid, group, forward_messages=None):
|
||||
openedfile = open(file, 'rb')
|
||||
files = {'file': openedfile}
|
||||
fileonserver = ujson.loads(
|
||||
requests.post(vk.API(session).docs.getUploadServer(type='audio_message')['upload_url'],
|
||||
requests.post(api.docs.getUploadServer(type='audio_message')['upload_url'],
|
||||
files=files).text)
|
||||
attachment = vk.API(session).docs.save(file=fileonserver['file'], title='Аудиосообщение',
|
||||
tags='')
|
||||
attachment = api.docs.save(file=fileonserver['file'], title='Аудиосообщение',
|
||||
tags='')
|
||||
openedfile.close()
|
||||
os.remove(file)
|
||||
|
||||
@ -468,64 +478,65 @@ def send_doc(message, userid, group, forward_messages=None):
|
||||
os.rename(file, newfile)
|
||||
openedfile = open(newfile, 'rb')
|
||||
files = {'file': openedfile}
|
||||
fileonserver = ujson.loads(requests.post(vk.API(session).docs.getUploadServer()['upload_url'],
|
||||
fileonserver = ujson.loads(requests.post(api.docs.getUploadServer()['upload_url'],
|
||||
files=files).text)
|
||||
attachment = vk.API(session).docs.save(file=fileonserver['file'],
|
||||
title=audio_title_creator(message, message.audio.performer,
|
||||
message.audio.title), tags='')
|
||||
attachment = api.docs.save(file=fileonserver['file'],
|
||||
title=audio_title_creator(message, message.audio.performer,
|
||||
message.audio.title), tags='')
|
||||
openedfile.close()
|
||||
os.remove(newfile)
|
||||
|
||||
if group:
|
||||
if message.caption:
|
||||
|
||||
vk.API(session).messages.send(chat_id=userid, message=message.caption,
|
||||
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
|
||||
attachment[0]['did']),
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, message=message.caption,
|
||||
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
|
||||
attachment[0]['did']),
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(chat_id=userid,
|
||||
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
|
||||
attachment[0]['did']),
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid,
|
||||
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
|
||||
attachment[0]['did']),
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
if message.caption:
|
||||
vk.API(session).messages.send(user_id=userid, message=message.caption,
|
||||
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
|
||||
attachment[0]['did']),
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, message=message.caption,
|
||||
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
|
||||
attachment[0]['did']),
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(user_id=userid,
|
||||
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
|
||||
attachment[0]['did']),
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid,
|
||||
attachment='doc{}_{}'.format(attachment[0]['owner_id'],
|
||||
attachment[0]['did']),
|
||||
forward_messages=forward_messages)
|
||||
|
||||
|
||||
def send_photo(message, userid, group, forward_messages=None):
|
||||
filetype = message.content_type
|
||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
file = wget.download(
|
||||
FILE_URL.format(token, bot.get_file(getattr(message, filetype)[-1].file_id).wait().file_path))
|
||||
openedfile = open(file, 'rb')
|
||||
files = {'file': openedfile}
|
||||
fileonserver = ujson.loads(requests.post(vk.API(session).photos.getMessagesUploadServer()['upload_url'],
|
||||
fileonserver = ujson.loads(requests.post(api.photos.getMessagesUploadServer()['upload_url'],
|
||||
files=files).text)
|
||||
attachment = vk.API(session).photos.saveMessagesPhoto(server=fileonserver['server'], photo=fileonserver['photo'],
|
||||
hash=fileonserver['hash'])
|
||||
attachment = api.photos.saveMessagesPhoto(server=fileonserver['server'], photo=fileonserver['photo'],
|
||||
hash=fileonserver['hash'])
|
||||
if group:
|
||||
if message.caption:
|
||||
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(chat_id=userid, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
if message.caption:
|
||||
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, message=message.caption, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(user_id=userid, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
openedfile.close()
|
||||
os.remove(file)
|
||||
|
||||
@ -533,29 +544,30 @@ def send_photo(message, userid, group, forward_messages=None):
|
||||
def send_sticker(message, userid, group, forward_messages=None):
|
||||
filetype = message.content_type
|
||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
file = wget.download(
|
||||
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
|
||||
Image.open(file).save("{}.png".format(file))
|
||||
openedfile = open('{}.png'.format(file), 'rb')
|
||||
files = {'file': openedfile}
|
||||
fileonserver = ujson.loads(requests.post(vk.API(session).photos.getMessagesUploadServer()['upload_url'],
|
||||
fileonserver = ujson.loads(requests.post(api.photos.getMessagesUploadServer()['upload_url'],
|
||||
files=files).text)
|
||||
attachment = vk.API(session).photos.saveMessagesPhoto(server=fileonserver['server'], photo=fileonserver['photo'],
|
||||
hash=fileonserver['hash'])
|
||||
attachment = api.photos.saveMessagesPhoto(server=fileonserver['server'], photo=fileonserver['photo'],
|
||||
hash=fileonserver['hash'])
|
||||
if group:
|
||||
if message.caption:
|
||||
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, message=message.caption, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(chat_id=userid, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
if message.caption:
|
||||
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, message=message.caption, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(user_id=userid, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, attachment=attachment[0]['id'],
|
||||
forward_messages=forward_messages)
|
||||
openedfile.close()
|
||||
os.remove('{}.png'.format(file))
|
||||
os.remove(file)
|
||||
@ -564,48 +576,49 @@ def send_sticker(message, userid, group, forward_messages=None):
|
||||
def send_video(message, userid, group, forward_messages=None):
|
||||
filetype = message.content_type
|
||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
||||
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
file = wget.download(
|
||||
FILE_URL.format(token, bot.get_file(getattr(message, filetype).file_id).wait().file_path))
|
||||
openedfile = open(file, 'rb')
|
||||
files = {'video_file': openedfile}
|
||||
|
||||
if group:
|
||||
attachment = vk.API(session).video.save(is_private=1)
|
||||
attachment = api.video.save(is_private=1)
|
||||
fileonserver = ujson.loads(requests.post(attachment['upload_url'],
|
||||
files=files).text)
|
||||
video = 'video{}_{}'.format(attachment['owner_id'], attachment['owner_id']['video_id'])
|
||||
if message.caption:
|
||||
vk.API(session).messages.send(chat_id=userid, message=message.caption, attachment=video,
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, message=message.caption, attachment=video,
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(chat_id=userid, attachment=video, forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, attachment=video, forward_messages=forward_messages)
|
||||
else:
|
||||
attachment = vk.API(session).video.save(is_private=1)
|
||||
attachment = api.video.save(is_private=1)
|
||||
fileonserver = ujson.loads(requests.post(attachment['upload_url'],
|
||||
files=files).text)
|
||||
video = 'video{}_{}'.format(attachment['owner_id'], attachment['vid'])
|
||||
if message.caption:
|
||||
vk.API(session).messages.send(user_id=userid, message=message.caption, attachment=video,
|
||||
forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, message=message.caption, attachment=video,
|
||||
forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(user_id=userid, attachment=video, forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, attachment=video, forward_messages=forward_messages)
|
||||
openedfile.close()
|
||||
os.remove(file)
|
||||
|
||||
|
||||
def send_contact(message, userid, group, forward_messages=None):
|
||||
session = VkMessage(vk_tokens.get(str(message.from_user.id))).session
|
||||
api = vk.API(session, v=VK_API_VERSION)
|
||||
if message.contact.last_name:
|
||||
text = 'Контакт: {} {}'.format(message.contact.first_name, message.contact.last_name)
|
||||
else:
|
||||
text = 'Контакт: {}'.format(message.contact.first_name)
|
||||
if group:
|
||||
vk.API(session).messages.send(chat_id=userid, message=text, forward_messages=forward_messages)
|
||||
vk.API(session).messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, message=text, forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
|
||||
else:
|
||||
vk.API(session).messages.send(user_id=userid, message=text, forward_messages=forward_messages)
|
||||
vk.API(session).messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
|
||||
api.messages.send(user_id=userid, message=text, forward_messages=forward_messages)
|
||||
api.messages.send(chat_id=userid, message=message.contact, forward_messages=forward_messages)
|
||||
|
||||
|
||||
@bot.message_handler(content_types=['document', 'voice', 'audio'])
|
||||
|
@ -7,6 +7,8 @@ import ujson
|
||||
import vk
|
||||
import wget
|
||||
|
||||
VK_POLLING_VERSION = '3.0'
|
||||
|
||||
logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.WARNING, filename='vk.log')
|
||||
vk_tokens = redis.from_url(os.environ.get("REDIS_URL"))
|
||||
|
||||
@ -36,10 +38,11 @@ class VkPolling:
|
||||
|
||||
|
||||
def handle_messages(m, vk_user, bot, chat_id, mainmessage=None):
|
||||
api = vk.API(vk_user.session, v=VK_POLLING_VERSION)
|
||||
if m['uid'] > 0:
|
||||
user = vk.API(vk_user.session).users.get(user_ids=m["uid"], fields=[])[0]
|
||||
user = api.users.get(user_ids=m["uid"], fields=[])[0]
|
||||
else:
|
||||
group = vk.API(vk_user.session).groups.getById(group_ids=str(m['uid'])[1:])[0]
|
||||
group = api.groups.getById(group_ids=str(m['uid'])[1:])[0]
|
||||
user = {'first_name': group['name'], 'last_name': None}
|
||||
|
||||
if 'body' in m and not 'attachment' in m and not 'geo' in m and not 'fwd_messages' in m:
|
||||
@ -228,8 +231,8 @@ def attachment_handler(m, user, bot, chat_id, mainmessage=None):
|
||||
disable_notification=check_notification(m),
|
||||
reply_to_message_id=mainmessage).wait()
|
||||
try:
|
||||
user = vk.API(get_session(vk_tokens.get(str(chat_id)))).users.get(user_ids=attach['wall_reply']["uid"],
|
||||
fields=[])[0]
|
||||
api = vk.API(get_session(vk_tokens.get(str(chat_id))), v=VK_POLLING_VERSION)
|
||||
user = api.users.get(user_ids=attach['wall_reply']["uid"], fields=[])[0]
|
||||
if attach['wall_reply']['text']:
|
||||
data = add_user_info(m, user["first_name"], user["last_name"]) + \
|
||||
attach['wall_reply']['text'].replace('<br>', '\n') + add_reply_info(m)
|
||||
@ -329,7 +332,7 @@ class VkMessage:
|
||||
|
||||
def get_new_messages(self):
|
||||
|
||||
api = vk.API(self.session)
|
||||
api = vk.API(self.session, v=VK_POLLING_VERSION)
|
||||
try:
|
||||
ts_pts = ujson.dumps({"ts": self.ts, "pts": self.pts})
|
||||
new = api.execute(code='return API.messages.getLongPollHistory({});'.format(ts_pts))
|
||||
@ -349,9 +352,7 @@ class VkMessage:
|
||||
if count == 0:
|
||||
pass
|
||||
else:
|
||||
messages = msgs[1:]
|
||||
for m in messages:
|
||||
res.append(m)
|
||||
res = msgs[1:]
|
||||
return res
|
||||
|
||||
|
||||
@ -360,7 +361,7 @@ def get_session(token):
|
||||
|
||||
|
||||
def get_tses(session):
|
||||
api = vk.API(session)
|
||||
api = vk.API(session, v=VK_POLLING_VERSION)
|
||||
|
||||
ts = api.messages.getLongPollServer(need_pts=1)
|
||||
return ts['ts'], ts['pts']
|
||||
|
Loading…
x
Reference in New Issue
Block a user