Advertisement
stuppid_bot

Untitled

Jul 12th, 2014
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.36 KB | None | 0 0
  1. # -*- coding: u8 -*-
  2. import sys
  3. import urllib
  4. import time
  5. import utils
  6. import json
  7. import re
  8. import httplib
  9. import keyword
  10.  
  11. MATCH_PARAM = '_(' + '|'.join(keyword.kwlist) + ')$'
  12.  
  13. class VKError(Exception):
  14.     pass
  15.  
  16. class VKValidationError(VKError):
  17.     pass
  18.  
  19. class VKCaptchaError(VKError):
  20.     pass
  21.  
  22. class VKAuthorizationError(VKError):
  23.     def __init__(self, resp):
  24.         super(VKAuthorizationError, self).__init__('{error} - {error_description}'.format(**resp))
  25.         self.error = resp['error']
  26.  
  27. class VKApiCallError(VKError):
  28.     def __init__(self, error):
  29.         super(VKApiCallError, self).__init__('[{error_code}] {error_msg}'.format(**error))
  30.         self.code = error['error_code']
  31.  
  32. class VKRobot(object):
  33.     def __init__(self, username=None, password=None, delay_time=0, api_version=5.23, user_agent='VKRobot'):
  34.         self.username = username
  35.         self.password = password
  36.         self.delay_time = delay_time
  37.         self.user_agent = user_agent
  38.         self.api_version = api_version
  39.         # пробуем авторизоваться
  40.         p = {
  41.             'username': username,
  42.             'password': password,
  43.             'client_id': 3140623,
  44.             'client_secret': 'VeWdmVclDCtn6ihuP1nt',
  45.             'grant_type': 'password',
  46.             'test_redirect_uri': 1
  47.         }
  48.         while 1:
  49.             u = 'https://oauth.vk.com/token?'  + self._encodeParams(p)
  50.             r = self.getJSON(u)
  51.             if not 'error' in r:
  52.                 break
  53.             if 'need_validation' == r['error']:
  54.                 self.validate(r)
  55.             elif 'need_captcha' == r['error']:
  56.                 self._captchaParams(p, r)
  57.             else:
  58.                 raise VKAuthorizationError(r)
  59.         self.access_token = r['access_token']
  60.         self.user_id = r['user_id']
  61.  
  62.     def call(self, _method, **params):
  63.         u"""
  64.  
  65.        Вызывает метод API и в случае удачи возвращает response. Если имя
  66.        параметра совпадает с ключевым словом, то к имени нужно добавить
  67.        подчеркивание, например: _from, _global.
  68.        """
  69.         params['access_token'] = self.access_token
  70.         params.setdefault('v', self.api_version)
  71.         u = 'https://api.vk.com/method/' + _method
  72.         for k, v in params.items():
  73.             m = re.match(MATCH_PARAM, k)
  74.             if m:
  75.                 params[m.group(1)] = params.pop(k)
  76.         h = {'Content-Type': 'application/x-www-form-urlencoded'}
  77.         while 1:
  78.             d = self._encodeParams(params)
  79.             print u
  80.             print params
  81.             r = self.getJSON(u, d, h)
  82.             if 'response' in r:
  83.                 return r['response']
  84.             r = r['error']
  85.             if r['error_code'] == 14:
  86.                 self._captchaParams(params, r)
  87.             elif r['error_code'] == 17:
  88.                 self.validate(r)
  89.             else:
  90.                 raise VKApiCallError(r)
  91.  
  92.     def get(self, url, data=None, headers={}):
  93.         u"""
  94.        Возвращает response, либо бросает исключение, если в ответе есть
  95.        поле error.
  96.        """
  97.         r = self.getJSON(url, data, headers)
  98.         if 'error' in r:
  99.             raise VKError(r['error'])
  100.         return r
  101.  
  102.     def upload(self, url, files):
  103.         u"""
  104.        Загружает файлы. files - словарь, ключами которого являются имена
  105.        полей, а значениями пути до файлов.
  106.        """
  107.         L = []
  108.         b = uuid.uuid4().hex
  109.         t = 'application/unknown'
  110.         for n, p in files.items():
  111.             if re.match('(?i)https?://', p, re.I):
  112.                 p = str(p)
  113.                 u = urllib.urlopen(p)
  114.                 t = u.info().get('content-type', t)
  115.                 d = u.read()
  116.             else:
  117.                 f = open(src, 'rb')
  118.                 d = f.read()
  119.                 f.close()
  120.                 e = os.path.splitext(src)[1]
  121.                 t = mimetypes.types_map.get(e, t)
  122.                 p = p.encode(sys.getfilesystemencoding())
  123.             L.extend([
  124.                 '--' + b,
  125.                 'Content-Disposition: form-data; name="' + n + '"; filename="'\
  126.                 + os.path.basename(p) + '"',
  127.                 'Content-Type: ' + t,
  128.                 '',
  129.                 d
  130.             ])
  131.         L.extend([
  132.             '--' + b + '--',
  133.             ''
  134.         ])
  135.         h = {'Content-Type': 'multipart/form-data; boundary=' + b}
  136.         return self.get(url, '\r\n'.join(L), h)
  137.  
  138.     def uploadPhoto(self, u, p):
  139.         u"""Загружает фото."""
  140.         return self.upload(u, {'photo': p})
  141.  
  142.     def uploadFile(self, u, p):
  143.         return self.upload(u, {'file': p})
  144.  
  145.     def uploadFiles(self, u, L):
  146.         u"""Загружает список файлов."""
  147.         a = {}
  148.         for i in range(len(L)):
  149.             a['file%i' % (i + 1)] = L[i]
  150.         return self.upload(u, a)
  151.  
  152.     def upload_video(self, url, src):
  153.         u"""Загружает видео."""
  154.         return self.upload(url, {'video_file': src})
  155.  
  156.     def getJSON(self, url, data=None, headers={}):
  157.         u"""Возвращает результат парсинга JSON."""
  158.         headers['User-Agent'] = self.user_agent
  159.         if self.delay_time:
  160.             time.sleep(self.delay_time)
  161.         j = utils.get_page(url, data, headers)
  162.         try:
  163.             j = json.loads(j)
  164.         except:
  165.             # некоторые методы API отдают данные в windows-1251, вместо UTF-8
  166.             j = json.loads(j, '1251')
  167.         return j
  168.  
  169.     def validate(self, resp):
  170.         u"""
  171.        Осуществляет автоматическую валидацию пользователя при заходе из
  172.        подозрительного места.
  173.        """
  174.         s = utils.get_page(resp['redirect_uri'])
  175.         m = re.search(r'/security_check\?[^"]+', s)
  176.         if m:
  177.             u = m.group(0)
  178.             c = httplib.HTTPConnection('oauth.vk.com')
  179.             c.request('GET', u)
  180.             r = c.getresponse()
  181.             h = dict(r.getheaders())
  182.             if h['location'] == '/blank.html?success=1':
  183.                 print u'Валидация пройдена.'
  184.                 return
  185.         raise VKValidationError('Validation failed.')
  186.  
  187.     def getCaptchaKey(self, url):
  188.         u"""Возвращает значение капчи."""
  189.         raise VKCaptchaError('Captcha needed.')
  190.  
  191.     def _captchaParams(self, params, resp):
  192.         u"""Добавляет парамерты капчи."""
  193.         params['captcha_sid'] = resp['captcha_sid']
  194.         params['captcha_key'] = self.getCaptchaKey(resp['captcha_img'])
  195.  
  196.     def _encodeParams(self, params):
  197.         u"""Формирует строку параметров."""
  198.         for k, v in params.items():
  199.             if type(v) == None:
  200.                 del params[k]
  201.                 continue
  202.             if type(v) == str:
  203.                 v = v.decode(sys.stdin.encoding)
  204.             if type(v) == unicode:
  205.                 v = v.encode('u8')
  206.             params[k] = v
  207.         return urllib.urlencode(params)
  208. #################### GENEREATED CODE GOES AFTER THIS LINE ####################
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement