Advertisement
stuppid_bot

Прототип приложения для пиара Вконтакте

Jul 20th, 2014
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.15 KB | None | 0 0
  1. # -*- coding: u8 -*-
  2. import sys
  3. import re
  4. import json
  5. import urllib2 as ul2
  6. from time import sleep
  7. from urllib import urlencode
  8.  
  9. class PR(object):
  10.     def __init__(self):
  11.         self.URL = 'http://x9a.ru/vk/pr.php'
  12.         self.PHPSESSID = None
  13.  
  14.     def call(self, query, data=None):
  15.         u"""Метод передает данные в формате JSON!"""
  16.         url =  self.URL + '?' + urlencode(query)
  17.         print url
  18.         headers = {}
  19.         if self.PHPSESSID:
  20.             headers['Cookie'] = 'PHPSESSID=' + self.PHPSESSID
  21.         if data:
  22.             data = json.dumps(data)
  23.         r = ul2.Request(url, data, headers)
  24.         u = ul2.urlopen(r)
  25.         c = u.info().get('set-cookie')
  26.         try:
  27.             m = re.search('PHPSESSID=([^;]+)', c)
  28.             self.PHPSESSID = m.group(1)
  29.         except:
  30.             pass
  31.         res = u.read()
  32.         print res
  33.         if 'error' in res:
  34.             raise RuntimeError('Application server error: ' + res['error'])
  35.         if 'fail' in res:
  36.             # время жизни сессии истекло, необходимо заново ее начать
  37.             raise RuntimeError('Session failed.')
  38.         res = json.loads(res)
  39.         return res
  40.  
  41. class VKClient(object):
  42.     def __init__(self, username, password):
  43.         query_params = {
  44.             'username': username,
  45.             'password': password,
  46.             'client_id': 3140623,
  47.             'client_secret': 'VeWdmVclDCtn6ihuP1nt',
  48.             'grant_type': 'password',
  49.         }
  50.         query_params = self._encode_params(query_params)
  51.         r = self.get_json('https://oauth.vk.com/token?' + query_params)
  52.         # ! необходимо обрабатывать капчу и валидацию
  53.         if 'error' in r:
  54.             raise RuntimeError('VK Auth failed: ' + r['error_description'])
  55.         self.access_token = r['access_token']
  56.         self.user_id = r['user_id']
  57.  
  58.     def api(self, method, params={}):
  59.         print method
  60.         print params
  61.         params = dict(params)
  62.         params['access_token'] = self.access_token
  63.         payload = self._encode_params(params)
  64.         headers =  {'Content-Type': 'application/x-www-form-urlencoded'}
  65.         r = self.get_json('https://api.vk.com/method/' + method, payload, headers)
  66.         # ! необходимо обрабатывать капчу и валидацию
  67.         if 'error' in r:
  68.             raise RuntimeError('VK Api Error: [{error_code}] {error_msg}'.format(**r['error']))
  69.         return r['response']
  70.  
  71.     def get_json(self, url, data=None, headers={}):
  72.         r = ul2.Request(url, data, headers)
  73.         try:
  74.             u = ul2.urlopen(r)
  75.         except ul2.HTTPError as u:
  76.             pass
  77.         c = u.read()
  78.         return json.loads(c)
  79.  
  80.     def _encode_params(self, params):
  81.         for k, v in params.items():
  82.             if type(v) == unicode:
  83.                 params[k] = v.encode('u8')
  84.         return urlencode(params)
  85.  
  86. def run(login, password):
  87.     vk = VKClient(login, password)
  88.     pr = PR()
  89.     # начинаем сессию
  90.     # единственный обязательный параметр это user_id
  91.     # http://<HOST>/vk/pr.php?action=start&user_id=<USER_ID>&like_profile=1
  92.     r = pr.call({'action': 'start', 'user_id': vk.user_id, 'like_profile': 1})
  93.     if not 'success' in r or not r['success']:
  94.         raise RuntimeError('Something wrong.')
  95.     payload = None
  96.     while 1:
  97.         print payload
  98.         # http://<HOST>/vk/pr.php?action=cmd
  99.         r = pr.call({'action': 'cmd'}, payload)
  100.         results = []
  101.         for command in r['commands']:
  102.             r1 = vk.api(command['method'], command['params'])
  103.             print r1
  104.             results.append({'command': command['name'], 'result': r1})
  105.             # время задержки между вызовами методов api должно устанавливаться приложение
  106.             sleep(5)
  107.         if 'wait' in r:
  108.             print 'wait %s' % r['wait']
  109.             sleep(r['wait'])
  110.         payload = {'report': results}
  111.  
  112. if __name__ == '__main__':
  113.     run('%username%', '%password%')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement