stuppid_bot

Untitled

Jul 15th, 2014 (edited)
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.94 KB | None | 0 0
  1. # -*- coding: u8 -*-
  2. ################################################################################
  3. #                                                                              #
  4. # @link http://vk.com/... Персональная страница автора Вконтакте.      #
  5. #                                                                              #
  6. # @link https://github.com/err0x0/ Мои репозитории.                            #
  7. #                                                                              #
  8. # Copyright (c) 2014  <[email protected]>                        #
  9. #                                                                              #
  10. # Данная лицензия разрешает лицам, получившим копию данного программного       #
  11. # обеспечения и сопутствующей документации (в дальнейшем именуемыми            #
  12. # «Программное Обеспечение»), безвозмездно использовать Программное            #
  13. # Обеспечение без ограничений, включая неограниченное право на использование,  #
  14. # копирование, изменение, добавление, публикацию, распространение,             #
  15. # сублицензирование и/или продажу копий Программного Обеспечения, также как и  #
  16. # лицам, которым предоставляется данное Программное Обеспечение, при           #
  17. # соблюдении следующих условий:                                                #
  18. #                                                                              #
  19. # Указанное выше уведомление об авторском праве и данные условия должны быть   #
  20. # включены во все копии или значимые части данного Программного Обеспечения.   #
  21. #                                                                              #
  22. # ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО    #
  23. # ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ  #
  24. # ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ  #
  25. # И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ #
  26. # НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ       #
  27. # ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ,      #
  28. # ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ #
  29. # ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.    #
  30. #                                                                              #
  31. ################################################################################
  32. import sys
  33. import os
  34. import urllib
  35. import time
  36. import utils
  37. import json
  38. import re
  39. import httplib
  40. import keyword
  41. import captcha
  42.  
  43. MATCH_PARAM = '_(' + '|'.join(keyword.kwlist) + ')$'
  44.  
  45. class VKError(Exception):
  46.     pass
  47.  
  48. class VKValidationError(VKError):
  49.     pass
  50.  
  51. class VKCaptchaError(VKError):
  52.     pass
  53.  
  54. class VKAuthorizationError(VKError):
  55.     def __init__(self, error_type, description):
  56.         super(VKAuthorizationError, self).__init__('%s - %s' % (error_type, description))
  57.         self.type = error_type
  58.  
  59. class VKApiCallError(VKError):
  60.     def __init__(self, code, message):
  61.         super(VKApiCallError, self).__init__('[%s] %s' % (code, message))
  62.         self.code = code
  63.  
  64. class VKRobot(object):
  65.     def __init__(self, username, password, api_version=5.23, lang=None,
  66.                  delay_time=0, user_agent='VKRobot'):
  67.         self.username = username
  68.         self.password = password
  69.         self.api_version = api_version
  70.         self.lang = lang
  71.         self.delay_time = delay_time
  72.         self.user_agent = user_agent
  73.         # пробуем авторизоваться
  74.         p = {
  75.             'username': username,
  76.             'password': password,
  77.             'client_id': 3140623,
  78.             'client_secret': 'VeWdmVclDCtn6ihuP1nt',
  79.             'grant_type': 'password',
  80.             # 'test_redirect_uri': 1
  81.         }
  82.         while 1:
  83.             u = 'https://oauth.vk.com/token?'  + self._encodeParams(p)
  84.             # print u
  85.             r = self.getJSON(u)
  86.             if not 'error' in r:
  87.                 break
  88.             if 'need_validation' == r['error']:
  89.                 self.validate(r['redirect_uri'])
  90.             elif 'need_captcha' == r['error']:
  91.                 self._setCaptchaParams(p, r['captcha_img'], r['captcha_sid'])
  92.             else:
  93.                 raise VKAuthorizationError(r['error'], r['error_description'])
  94.         self.access_token = r['access_token']
  95.         self.user_id = r['user_id']
  96.  
  97.     def call(self, _method, **params):
  98.         u"""
  99.        Вызывает метод API и в случае удачи возвращает response. Если имя
  100.        параметра совпадает с ключевым словом, то к имени нужно добавить
  101.        подчеркивание, например: _from, _global.
  102.        """
  103.         # print params
  104.         params['access_token'] = self.access_token
  105.         params['v'] = self.api_version
  106.         params['lang'] = self.lang
  107.         u = 'https://api.vk.com/method/' + _method
  108.         for k, v in params.items():
  109.             m = re.match(MATCH_PARAM, k)
  110.             if m:
  111.                 params[m.group(1)] = params.pop(k)
  112.         h = {'Content-Type': 'application/x-www-form-urlencoded'}
  113.         while 1:
  114.             d = self._encodeParams(params)
  115.             # print u
  116.             # print params
  117.             r = self.getJSON(u, d, h)
  118.             if 'response' in r:
  119.                 return r['response']
  120.             r = r['error']
  121.             if r['error_code'] == 14:
  122.                 self._setCaptchaParams(params, r['captcha_img'], r['captcha_sid'])
  123.             elif r['error_code'] == 17:
  124.                 self.validate(r['redirect_uri'])
  125.             else:
  126.                 raise VKApiCallError(r['error_code'], r['error_msg'])
  127.  
  128.     def get(self, url, data=None, headers={}):
  129.         u"""
  130.        Возвращает response, либо бросает исключение, если в ответе есть
  131.        поле error.
  132.        """
  133.         r = self.getJSON(url, data, headers)
  134.         if 'error' in r:
  135.             raise VKError(r['error'])
  136.         return r
  137.  
  138.     def delay(self, sec):
  139.         time.sleep(sec)
  140.  
  141.     def getJSON(self, url, data=None, headers={}):
  142.         u"""Возвращает результат парсинга JSON."""
  143.         headers['User-Agent'] = self.user_agent
  144.         if self.delay_time:
  145.             self.delay(self.delay_time)
  146.         j = utils.get_page(url, data, headers)
  147.         try:
  148.             j = json.loads(j)
  149.         except:
  150.             # некоторые методы API отдают данные в windows-1251, вместо UTF-8
  151.             j = json.loads(j, '1251')
  152.         return j
  153.  
  154.     def validate(self, u):
  155.         u"""
  156.        Осуществляет автоматическую валидацию пользователя при заходе из
  157.        подозрительного места.
  158.        """
  159.         s = utils.get_page(u)
  160.         m = re.search(r'/security_check\?[^"]+', s)
  161.         if m:
  162.             u = m.group(0)
  163.             c = httplib.HTTPConnection('oauth.vk.com')
  164.             c.request('GET', u)
  165.             r = c.getresponse()
  166.             h = dict(r.getheaders())
  167.             if h['location'] == '/blank.html?success=1':
  168.                 print u'Валидация пройдена.'
  169.                 return
  170.         raise VKValidationError('Validation failed.')
  171.  
  172.     def upload(self, u, files, fields={}):
  173.         u"""Загружает файлы."""
  174.         t, d = utils.encode_formdata(files)
  175.         return self.get(u, d, {'Content-Type': t})
  176.  
  177.     def uploadPhoto(self, u, p):
  178.         u"""Загружает фото."""
  179.         return self.upload(u, {'photo': p})
  180.  
  181.     def uploadFile(self, u, p):
  182.         return self.upload(u, {'file': p})
  183.  
  184.     def uploadFiles(self, u, L):
  185.         u"""Загружает список файлов."""
  186.         a = {}
  187.         for i in range(len(L)):
  188.             a['file%i' % (i + 1)] = L[i]
  189.         return self.upload(u, a)
  190.  
  191.     def uploadPhotos(self, photo_list, album_id, group_id=None):
  192.         u"""Грузим фотографии в альбом."""
  193.         u = self.photos_getUploadServer(album_id, group_id)['upload_url']
  194.         ret = []
  195.         for i in range(0, len(photo_list), 5):
  196.             photos = photo_list[i : i + 5]
  197.             r = self.uploadFiles(u, photos)
  198.             r['album_id'] = r.pop('aid')
  199.             ret += self.photos_save(**r)
  200.         return ret
  201.  
  202.     def uploadWallPhoto(self, filename, owner_id=0):
  203.         u"""Грузим фото на стену."""
  204.         group_id = abs(owner_id) if owner_id < 1 else None
  205.         u = self.photos_getWallUploadServer(group_id)['upload_url']
  206.         r = self.uploadPhoto(u, filename)
  207.         if group_id:
  208.             r['group_id'] = group_id
  209.         elif owner_id:
  210.             r['user_id'] = owner_id
  211.         return self.photos_saveWallPhoto(**r)
  212.  
  213.     def uploadOwnerPhoto(self, filename, group_id=0):
  214.         u"""Грузим фото на аву."""
  215.         owner_id = None
  216.         if group_id:
  217.             owner_id = -group_id
  218.         u = self.photos_getOwnerPhotoUploadServer(owner_id)['upload_url']
  219.         r = self.uploadPhoto(u, filename)
  220.         return self.photos_saveOwnerPhoto(**r)
  221.  
  222.     def uploadMessagePhoto(self, filename):
  223.         u"""Грузим фото в личное сообщение."""
  224.         u = self.photos_getMessagesUploadServer()['upload_url']
  225.         r = self.uploadPhoto(u, filename)
  226.         return self.photos_saveMessagesPhoto(**r)
  227.  
  228.     def uploadAudio(self, filename, title=None, artist=None):
  229.         u"""Грузим аудио-запись."""
  230.         u = self.audio_getUploadServer()['upload_url']
  231.         r = self.uploadFile(u, filename)
  232.         r['title'] = title
  233.         r['artist'] = artist
  234.         ret = self.audio_save(**r)
  235.  
  236.     def uploadDoc(self, filename, group_id=None):
  237.         u"""Грузим документ в 'Документы'."""
  238.         u = self.docs_getUploadServer(group_id)['upload_url']
  239.         r = self.uploadFile(u, filename)
  240.         return self.docs_save(**r)
  241.  
  242.     def uploadWallDoc(self, filename, group_id=None):
  243.         u"""Грузим документ на стену."""
  244.         u = self.docs_getWallUploadServer(group_id)['upload_url']
  245.         r = self.uploadFile(u, filename)
  246.         return self.docs_save(**r)
  247.  
  248.     def uploadVideo(self, filename, name=None, description=None,
  249.                     is_private=None, wallpost=None, group_id=None,
  250.                     album_id=None, repeat=None):
  251.         u"""Загружает и сохраняет видеофайл."""
  252.         r = self.video_save(name, description, is_private, wallpost,
  253.                             link, group_id, album_id, repeat)
  254.         u = r['upload_url']
  255.         # содержит единственное поле 'size'
  256.         r1 = self.upload(u, {'video_file': filename})
  257.         r.update(r1)
  258.         return r
  259.  
  260.     def importVideo(self, url, name=None, description=None,
  261.                     is_private=None, wallpost=None, group_id=None,
  262.                     album_id=None, repeat=None):
  263.         u"""Импортуриует видео с популярных видеохостингов типа YouTube."""
  264.         u = self.video_save(name, description, is_private, wallpost,
  265.                             url, group_id, album_id, repeat)['upload_url']
  266.         return self.get(u)
  267.  
  268.     def atach(self, o, t='', id_key='id'):
  269.         p = t + '{owner_id}_{' + id_key + '}'
  270.         return (','.join([p.format(**x) for x in o])\
  271.                 if type(o) == list\
  272.                 else p.format(**o)) + ','
  273.  
  274.     def getCaptchaKey(self, url):
  275.         u"""Возвращает значение капчи."""
  276.         return captcha.render_captcha(url, os.path.basename(sys.argv[0]))
  277.         raise VKCaptchaError('Captcha needed.')
  278.  
  279.     def _setCaptchaParams(self, params, url, sid):
  280.         u"""Добавляет парамерты капчи."""
  281.         params['captcha_sid'] = sid
  282.         params['captcha_key'] = self.getCaptchaKey(url)
  283.  
  284.     def _encodeParams(self, params):
  285.         u"""Формирует строку параметров."""
  286.         # params = dict(params)
  287.         for k, v in params.items():
  288.             if v == None:
  289.                 del params[k]
  290.                 continue
  291.             # if type(v) == str:
  292.             #     v = v.decode(sys.stdin.encoding)
  293.             if type(v) == unicode:
  294.                 v = v.encode('u8')
  295.             params[k] = v
  296.         return urllib.urlencode(params)
  297.  
  298.     def _smartCall(self, method, params):
  299.         del params['self']
  300.         return self.call(method, **params)
  301.        
  302. #################### GENERATED CODE GOES AFTER THIS LINE #####################
  303.  
  304.     def users_get(self, user_ids=None, fields=None, name_case=None):
  305.         """
  306.        http://vk.com/dev/users.get
  307.        Возвращает расширенную информацию о пользователях.
  308.        Аргументы:
  309.        user_ids
  310.            перечисленные через запятую идентификаторы пользователей или их
  311.            короткие имена (screen_name). По умолчанию — идентификатор
  312.            текущего пользователя.
  313.            список строк, разделенных через запятую, количество элементов
  314.            должно составлять не более 1000
  315.        fields
  316.            список дополнительных полей, которые необходимо вернуть.
  317.            Доступные значения: sex, bdate, city, country, photo_50,
  318.            photo_100, photo_200_orig, photo_200, photo_400_orig, photo_max,
  319.            photo_max_orig, online, online_mobile, lists, domain, has_mobile,
  320.            contacts, connections, site, education, universities, schools,
  321.            can_post, can_see_all_posts, can_see_audio,
  322.            can_write_private_message, status, last_seen, common_count,
  323.            relation, relatives, counters, screen_name, maiden_name, timezone,
  324.            occupation
  325.            список строк, разделенных через запятую
  326.        name_case
  327.            падеж для склонения имени и фамилии пользователя. Возможные
  328.            значения: именительный – nom, родительный – gen, дательный – dat,
  329.            винительный – acc, творительный – ins, предложный – abl. По
  330.            умолчанию nom.
  331.            строка
  332.        После успешного выполнения возвращает массив объектов пользователей
  333.        http://vk.com/dev/fields.
  334.        """
  335.         return self._smartCall('users.get', locals())
  336.  
  337. # ...
Add Comment
Please, Sign In to add comment