Advertisement
stuppid_bot

Vkontakte API client for Python

Nov 17th, 2013
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.37 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. # @author: noname <tz4678@gmail.com>
  3. # @description: модуль для работы с API Вконтакте
  4. # полный список методов API можно увидеть здесь https://vk.com/dev/methods
  5. import sys
  6. import urllib
  7. import json
  8. from formdata import *
  9. import urllib2
  10.  
  11. class NeedCaptchaError(Exception):
  12.     def __init__(self, captcha_img, captcha_sid):
  13.         self.captcha_img = captcha_img
  14.         self.captcha_sid = captcha_sid
  15.  
  16. class AuthorizationError(Exception):
  17.     def __init__(self, error, error_description):
  18.         super(AuthorizationError, self).__init__('%s. Error Description: %s' % (error, error_description))
  19.         self.error = error
  20.         self.error_description = error_description
  21.  
  22. class ApiError(Exception):
  23.     def __init__(self, error_code, error_msg):
  24.         super(ApiError, self).__init__('%s. Error Code: %s' % (error_msg, error_code))
  25.         self.error_code = error_code
  26.         self.error_msg = error_msg
  27.  
  28. class VkClient(object):
  29.     def __init__(self, client_id = '', client_secret = '', permissions = '', api_version = '', **kwargs):
  30.         self.client_id = kwargs.get('client_id', client_id)
  31.         self.client_secret = kwargs.get('client_secret', client_secret)
  32.         self.permissions = kwargs.get('permissions', permissions)
  33.         self.api_version = kwargs.get('api_version', api_version)
  34.         self.user_agent = 'VkClient (Python %s.%s.%s)' % sys.version_info[:3]
  35.         self.user_id = None
  36.         self.access_token = None
  37.  
  38.     def auth(self, username, password, captcha_sid = '', captcha_key = ''):
  39.         params = {
  40.             'username': username,
  41.             'password': password,
  42.             'captcha_sid': captcha_sid,
  43.             'captcha_key': captcha_key,
  44.             'client_id': self.client_id,
  45.             'client_secret': self.client_secret,
  46.             'scope': self.permissions,          
  47.             'v': self.api_version,
  48.             'grant_type': 'password'
  49.         }
  50.         request = urllib2.Request('https://oauth.vk.com/token?' + urllib.urlencode(params), headers = {'User-Agent': self.user_agent})
  51.         response = urllib2.urlopen(request);
  52.         content = response.read().decode('utf-8')
  53.         result = json.loads(content)
  54.         # print result
  55.         if 'error' in result:
  56.             if result['error'] == 'need_captcha':
  57.                 raise NeedCaptchaError(result['captcha_img'], result['captcha_sid'])
  58.             raise AuthorizationError(result['error'], result.get('error_description', ''))
  59.         self.user_id = result['user_id']
  60.         self.access_token = result['access_token']
  61.  
  62.     def raw_api(self, rel_uri, fields = {}, files = {}, **kwargs):
  63.         fields = kwargs.get('fields', fields)
  64.         files = kwargs.get('files', files)
  65.         headers = {}
  66.         for k, v in fields.items():
  67.             if type(v) == unicode:
  68.                 fields[k] = v.encode('utf-8')
  69.         if len(files):
  70.             body, headers = encode_multipart(fields, files)
  71.         elif len(fields):
  72.             headers = {'Content-Type': 'application/x-www-form-urlencoded'}
  73.             body = urllib.urlencode(fields)
  74.         else:
  75.             body = None
  76.         # print body
  77.         headers['User-Agent'] = self.user_agent
  78.         request = urllib2.Request('https://api.vk.com/method/' + rel_uri, body, headers)
  79.         response = urllib2.urlopen(request)
  80.         content = response.read().decode('utf-8')
  81.         result = json.loads(content)
  82.         # print result
  83.         if 'error' in result:
  84.             error = result['error']
  85.             if error['error_code'] == 14:
  86.                 raise NeedCaptchaError(error['captcha_img'], error['captcha_sid'])
  87.             raise ApiError(error['error_code'], error['error_msg'])
  88.         return result['response']
  89.  
  90.     def api(self, rel_uri, fields = {}, files = {}, **kwargs):
  91.         fields = kwargs.get('fields', fields)
  92.         files = kwargs.get('files', files)
  93.         # автоматически добавляем к запросу токен и версию
  94.         fields['access_token'] = self.access_token
  95.         fields['v'] = self.api_version
  96.         return self.raw_api(rel_uri, fields, files)
  97.  
  98. if __name__ == '__main__':
  99.     client = VkClient()
  100.     print client.raw_api('users.get', {'user_ids': '205387401', 'fields': 'photo_50,city,verified', 'name_case': 'Nom', 'v': '5.3'})
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement