Skip to content

Instantly share code, notes, and snippets.

@iNerV

iNerV/bot1 Secret

Created January 5, 2015 10:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iNerV/992319e93a5bfe3cb304 to your computer and use it in GitHub Desktop.
Save iNerV/992319e93a5bfe3cb304 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
__author__ = 'NerV'
import urllib
import json
import os
import sqlite3
import time
import urllib.request
import urllib.parse
import re
from grab import Grab
from urllib.request import urlretrieve
import subprocess
from vkbot_option import token
def send_message(id, message):
req = "https://api.vk.com/method/messages.send?"
data = urllib.parse.urlencode({
'access_token': token,
'user_id': id,
'message': message,
'v': 5.25})
binary_data = data.encode('utf8')
req2 = urllib.request.Request(req, binary_data)
params = urllib.request.urlopen(req2)
return json.loads(params.read().decode())
def search_subs(kageid, translator):
g = Grab()
g.go('http://fansubs.ru/base.php?id=' + str(kageid))
try:
i = 2
i2 = g.doc.select('//table[contains(@width, "750")]').count()
i3 = i + 4
link_srt = None
authors_list = []
while True:
link_srt = 'http://fansubs.ru/base.php?srt=' + g.doc.select('//table[contains(@width, "750")]')[i].select('.//input[contains(@name, "srt")]').attr('value')
while True:
try:
authors = g.doc.select('//table[contains(@width, "100%")]')[i3].select('.//td[contains(@valign, "middle")]').text()
try:
authors_list.append(authors.split(':')[1].split('[')[0].lower().strip())
except IndexError:
authors_list.append(authors.split('[')[0].lower().strip())
i3 += 1
print(authors)
except IndexError:
print(i3)
i3 += 1
break
if translator.lower() in authors_list:
break
else:
i += 1
print(i2)
return link_srt
except IndexError:
print(i)
print('no subs')
return 'Ошибка: указанный переводчик не переводил данное аниме.'
def get_rows(conn, message):
c = conn.cursor()
ms_words = message.split(' | ')
try:
if 'по названию' in message:
title = ms_words[2]
ani_type = ms_words[3]
c.execute("SELECT * FROM kage WHERE (title LIKE ? AND ani_type LIKE ?)", (title, ani_type))
elif 'по id' in message:
kageid = ms_words[2]
c.execute("SELECT * FROM kage WHERE (kageid = ?)", (kageid,))
else:
return 'test'
return c.fetchall()
except IndexError:
pass
# def get_rows2(conn, message):
# c = conn.cursor()
# pass
def get_user_messages(user_id, conn):
"""Получаем список новых сообщений от заданного пользователя"""
c = conn.cursor()
print('get_user_messages')
req = "https://api.vk.com/method/messages.getHistory?"
data = urllib.parse.urlencode({
'access_token': token,
'v': 5.25,
'user_id': user_id,
'count': 1,
})
binary_data = data.encode('utf8')
req2 = urllib.request.Request(req, binary_data)
params = urllib.request.urlopen(req2)
response = json.loads(params.read().decode())['response']['items']
# print('chtoto')
# print(response)
for msg in response:
print('db2')
if msg['from_id'] == msg['user_id']:
print('db3')
c.execute("SELECT * FROM messages WHERE (msg_id LIKE ?)", (msg['id'],))
db = c.fetchall()
print(db)
if len(db) == 0:
print('in db')
print(msg['id'])
c.execute('INSERT INTO messages (msg_id) VALUES (?)', (msg['id'],))
print('db')
return msg
else:
print('aaaaaaaaaaaaaaaa')
else:
time.sleep(1)
get_user_messages(user_id, conn)
print('db4')
print('db5')
def make_active(conn, user_id):
print('make_active')
response = get_user_messages(user_id, conn)
c = conn.cursor()
if not response['body'].lower().find('стоп'):
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
c.execute('UPDATE queue SET active=1 WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
def get_series(conn, user_id):
print('get_series')
response = get_user_messages(user_id, conn)
c = conn.cursor()
if not response['body'].lower().find('стоп'):
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
c.execute("UPDATE queue SET series=? WHERE user_id=?", (response['body'], user_id,))
conn.commit()
make_active(conn, user_id)
def get_end_watermark(conn, user_id):
print('get_end_watermark')
response = get_user_messages(user_id, conn)
c = conn.cursor()
if not response['body'].lower().find('стоп'):
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
c.execute("UPDATE queue SET end_watermark=? WHERE user_id=?", (response['body'], user_id,))
conn.commit()
get_series(conn, user_id)
def get_watermark(conn, user_id):
print('get_watermark')
response = get_user_messages(user_id, conn)
c = conn.cursor()
if not response['body'].lower().find('стоп'):
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
c.execute("UPDATE queue SET watermark=? WHERE user_id=?", (response['body'], user_id,))
conn.commit()
get_end_watermark(conn, user_id)
def get_start_watermark(conn, user_id):
print('get_start_watermark')
response = get_user_messages(user_id, conn)
c = conn.cursor()
if not response['body'].lower().find('стоп'):
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
c.execute("UPDATE queue SET start_watermark=? WHERE user_id=?", (response['body'], user_id,))
conn.commit()
get_watermark(conn, user_id)
def get_desc(conn, user_id):
print('get_desc')
response = get_user_messages(user_id, conn)
c = conn.cursor()
if not response['body'].lower().find('стоп'):
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
c.execute("UPDATE queue SET description=? WHERE user_id=?", (response['body'], user_id,))
conn.commit()
get_start_watermark(conn, user_id)
def get_translator(conn, user_id):
print('get_translator')
response = get_user_messages(user_id, conn)
c = conn.cursor()
if not response['body'].lower().find('стоп'):
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
c.execute("UPDATE queue SET translator=? WHERE user_id=?", (response['body'], user_id,))
conn.commit()
get_desc(conn, user_id)
def get_ani_type(conn, user_id):
print('get_ani_type')
response = get_user_messages(user_id, conn)
c = conn.cursor()
print('get_ani_type2')
print(response['body'])
if not response['body'].lower().find('стоп'):
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
print('get_ani_type3')
c.execute("UPDATE queue SET ani_type=? WHERE user_id=?", (response['body'], user_id,))
conn.commit()
print('get_ani_type4')
get_translator(conn, user_id)
def get_anime_name(conn, user_id):
print('get_anime_name')
response = get_user_messages(user_id, conn)
c = conn.cursor()
if not response['body'].lower().find('стоп'):
print('test2')
c.execute('DELETE FROM queue WHERE (user_id LIKE ?)', (user_id,))
conn.commit()
send_message(user_id, 'Вы отменили своё решение. Чтобы попрбовать снова, напишите "скачать"')
else:
print('test1test')
print(response['body'])
c.execute("UPDATE queue SET anime_name=? WHERE user_id=?", (response['body'], user_id,))
conn.commit()
send_message(user_id, 'Впишите тип аниме ТВ или ОВА')
get_ani_type(conn, user_id)
def get_page_id(nic):
req = "https://api.vk.com/method/users.get?"
data = urllib.parse.urlencode({
'access_token': token,
'user_ids': nic,
'v': 5.25})
binary_data = data.encode('utf8')
req2 = urllib.request.Request(req, binary_data)
params = urllib.request.urlopen(req2)
return json.loads(params.read().decode())['response'][0]['id']
def get_message_text(response, num):
for item in response:
if num == item['id']:
return item['body']
def get_message_profile(response, num): # переименовать потом
for item in response:
if num == item['id']:
return item['user_id']
def reply_to_message2(message, user_id, conn):
rows = get_rows(conn, message)
if not message.lower().find('скачать'):
ms_words = message.split(' | ')
try:
if 'по названию' in message:
for row in rows:
print('test')
print(row[1])
print(ms_words[4])
send_message(user_id, search_subs(row[1], ms_words[4]))
elif 'по id' in message:
for row in rows:
print(row[1])
print(ms_words[3])
send_message(user_id, search_subs(row[1], ms_words[3]))
except (IndexError, TypeError):
send_message(user_id, 'Простите, вы где-то ошиблись. Для справки напишите "помогите"')
elif not message.lower().find('помоги'):
send_message(user_id, 'Здравствуйте, это справочное сообщение. на даный момент поддерживаются следующие команды: «скачать | по названию | Bleach | ТВ | Advokat» (без кавычек), или «скачать | по id | 3735 | Мария Гостюхина» (опять таки без кавычек. Команда «анекдот» и команда «ня». Это только тестовые команды, со временем они поменяются и станут проще. вы можете оставить свои пожелания в комментариях к этой записи: https://vk.com/wall-43342147_57515 или в группе http://vk.com/giseki')
elif not message.lower().find('привет'):
send_message(user_id, 'Привет, спасибо, что ты написал мне. Я обязательно помогу тебе сделать хардсаб нужного аниме. Для справки напиши "помоги"')
elif not message.lower().find('ня'):
send_message(user_id, 'Ня кавай, ня кавай, Нас по звукам узнавай, Мы орём на весь трамвай. Ня кавай, ня кавай, лучше к нам не приставай, а то будет ня кавай!')
elif not message.lower().find('анекдот'):
g = Grab()
g.go('http://www.anekdot.ru/rss/slices/random.html')
joke = g.doc.select('//td[contains(@class, "anek_content")]').select('.//div').text()
send_message(user_id, joke)
else:
print('I obey, my lord')
send_message(user_id, 'Простите, данная команда не поддерживается. Но если вы напишите "анекдот" я расскажу вам шутку! А для справки напишите "помоги"')
def reply_to_message(message, user_id, conn):
print('reply_to_message')
c = conn.cursor()
if not message.lower().find('скачать'): # проверять сообщение на взождение слова "скачать", если оно есть выполнячть этот кусок кода.
c.execute("SELECT * FROM queue WHERE (user_id LIKE ?)", (user_id,))
db = c.fetchall()
if len(db) > 0:
print('test1')
get_anime_name(conn, user_id)
else:
c.execute('INSERT INTO queue (user_id) VALUES (?)', (user_id,))
conn.commit()
get_anime_name(conn, user_id)
else: # если слово "скачать" не найдено, выплнять этот кусок кода.
if not message.lower().find('помоги'):
send_message(user_id, 'Здравствуйте, это справочное сообщение. на даный момент поддерживаются следующие команды: «скачать | по названию | Bleach | ТВ | Advokat» (без кавычек), или «скачать | по id | 3735 | Мария Гостюхина» (опять таки без кавычек. Команда «анекдот» и команда «ня». Это только тестовые команды, со временем они поменяются и станут проще. вы можете оставить свои пожелания в комментариях к этой записи: https://vk.com/wall-43342147_57515 или в группе http://vk.com/giseki')
elif not message.lower().find('привет'):
send_message(user_id, 'Привет, спасибо, что ты написал мне. Я обязательно помогу тебе сделать хардсаб нужного аниме. Для справки напиши "помоги"')
elif not message.lower().find('ня'):
send_message(user_id, 'Ня кавай, ня кавай, Нас по звукам узнавай, Мы орём на весь трамвай. Ня кавай, ня кавай, лучше к нам не приставай, а то будет ня кавай!')
elif not message.lower().find('анекдот'):
g = Grab()
g.go('http://www.anekdot.ru/rss/slices/random.html')
joke = g.doc.select('//td[contains(@class, "anek_content")]').select('.//div').text()
send_message(user_id, joke)
else:
print('I obey, my lord')
send_message(user_id, 'Простите, данная команда не поддерживается. Но если вы напишите "анекдот" я расскажу вам шутку! А для справки напишите "помоги"')
# if len(message.split(' ')) >= 2:
# send_message(user_id, 'Простите, данная команда не поддерживается. Но если вы напишите "анекдот" я расскажу вам шутку! А для справки напишите "помоги"')
# else:
# c.execute('INSERT INTO queue (user_id) VALUES (?)', (user_id,))
def play_with_messages(response):
print('play_with_messages')
conn = sqlite3.connect('kage.db')
c = conn.cursor()
for msg in response:
c.execute("SELECT * FROM messages WHERE (msg_id LIKE ?)", (msg['id'],))
db = c.fetchall()
if len(db) > 0:
pass
else:
reply_to_message(get_message_text(response, msg['id']), get_message_profile(response, msg['id']), conn)
c.execute('INSERT INTO messages (msg_id) VALUES (?)', (msg['id'],))
conn.commit()
def get_messages():
req = "https://api.vk.com/method/messages.get?"
data = urllib.parse.urlencode({
'access_token': token,
'v': 5.25})
binary_data = data.encode('utf8')
req2 = urllib.request.Request(req, binary_data)
params = urllib.request.urlopen(req2)
return json.loads(params.read().decode())
while True:
try:
params = get_messages()
play_with_messages(params['response']['items'])
time.sleep(5)
except Exception:
continue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment