stuppid_bot

Untitled

Jun 15th, 2014
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.78 KB | None | 0 0
  1. # -*- coding: utf8 -*-
  2. # Модуль для работы с API Вконтакте. Список методов API можно увидеть здесь https://vk.com/dev/methods.
  3. #
  4. import os
  5. import re
  6. import sys
  7. import json
  8. import time
  9. import uuid
  10. import urllib
  11. import urllib2
  12. import mimetypes
  13. import webbrowser
  14.  
  15. class VKClientError(Exception):
  16.     pass
  17.  
  18. class VKClient(object):
  19.     def __init__(self, api_version=None, access_token=None, user_id=None, expires=None):
  20.         self.api_version = api_version
  21.         self.access_token = access_token
  22.         self.user_id = user_id
  23.         self.expires = expires
  24.         self.user_agent = 'VKClient (Python %s.%s.%s)' % sys.version_info[:3]
  25.         self.auth_url = 'https://oauth.vk.com/'
  26.         self.api_url = 'https://api.vk.com/method/'
  27.         self.delay_time = 0
  28.  
  29.     def auth(self, params, auth_type='authorize'):
  30.         params['v'] = self.api_version
  31.         self.encode_params(params)
  32.         response = self.get_json(self.auth_url + auth_type + '?' + urllib.urlencode(params))
  33.         if 'error' in response:
  34.             if response['error'] == 'need_captcha':
  35.                 self.captcha_params(params, response)
  36.                 return self.auth(params)
  37.             if response['error'] == 'need_validation' and 'redirect_uri' in response:
  38.                 webbrowser.open(response['redirect_uri'])
  39.             raise VKClientError(response['error'] + ': ' + response['error_description'])
  40.         self.access_token = response['access_token']
  41.         if 'user_id' in response:
  42.             self.user_id = response['user_id']
  43.         if 'expires_in' in response and response['expires_in'] > 0:
  44.             self.expires = time.time() + response['expires_in']
  45.  
  46.     def api(self, method, params={}):
  47.         self.delay()      
  48.         params['v'] = self.api_version
  49.         if self.access_token:
  50.             params['access_token'] = self.access_token
  51.         self.encode_params(params)
  52.         data = urllib.urlencode(params)
  53.         headers = {'Content-Type': 'application/x-www-form-urlencoded'}
  54.         response = self.get_json(self.api_url + method, data, headers)
  55.         if 'error' in response:
  56.             response = response['error']
  57.             if response['error_code'] == 14:
  58.                 self.captcha_params(params, response)
  59.                 return self.api(method, params)
  60.             raise VKClientError('API Error: %s - %s' % (response['error_code'], response['error_msg']))
  61.         return response['response']
  62.  
  63.     def upload(self, upload_url, files):
  64.         upload_url = str(upload_url)
  65.         boundary = uuid.uuid4().hex
  66.         data = []
  67.         for name, path in files.items():
  68.             if re.match('https?://', path, re.I):
  69.                 u = urllib.urlopen(path)
  70.                 content_type = u.info()['content-type']
  71.                 content = u.read()
  72.             else:
  73.                 path = path.encode(sys.getfilesystemencoding())
  74.                 extension = os.path.splitext(path)[1]
  75.                 content_type = mimetypes.types_map[extension] if extension in mimetypes.types_map else 'application/octet-stream'
  76.                 f = open(path, 'rb')
  77.                 content = f.read()
  78.                 f.close()
  79.             data.extend([
  80.                 '--' + boundary,
  81.                 'Content-Disposition: form-data; name="' + name + '"; filename="' + os.path.basename(path) + '"',
  82.                 'Content-Type: ' + content_type,
  83.                 '',
  84.                 content
  85.             ])
  86.         data.extend([
  87.             '--' + boundary + '--',
  88.             ''
  89.         ])
  90.         headers = {'Content-Type': 'multipart/form-data; boundary="' + boundary + '"'}
  91.         data = '\r\n'.join(data)
  92.         response = self.get_json(upload_url, data, headers)
  93.         if 'error' in response:
  94.             raise VKClientError('Upload Error: ' + response['error'])
  95.         return response
  96.  
  97.     def delay(self):
  98.         time.sleep(self.delay_time)
  99.  
  100.     def get_json(self, url, data=None, headers={}):
  101.         headers.setdefault('User-Agent', self.user_agent)
  102.         request = urllib2.Request(url, data, headers)
  103.         try:
  104.             response = urllib2.urlopen(request)
  105.             content = response.read()
  106.         except urllib2.HTTPError, error:
  107.             content = error.read()
  108.         return json.loads(content.decode('utf8'))
  109.  
  110.     def process_captcha(self, url):
  111.         raise VKClientError('Captcha needed')
  112.  
  113.     def captcha_params(self, params, response):
  114.         params['captcha_key'] = self.process_captcha(response['captcha_img'])
  115.         params['captcha_sid'] = response['captcha_sid']
  116.  
  117.     def encode_params(self, params):
  118.         for k, v in params.items():
  119.             if type(v) == unicode:
  120.                 params[k] = v.encode('utf8')
Advertisement
Add Comment
Please, Sign In to add comment