Advertisement
stuppid_bot

Untitled

Jul 8th, 2014
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.88 KB | None | 0 0
  1. # -*- coding: utf8 -*-
  2. import urllib
  3. import re
  4. from keyword import kwlist
  5. from HTMLParser import HTMLParser
  6. htmlparser = HTMLParser()
  7.  
  8. DEV_URL = 'http://vk.com/dev/'
  9.  
  10. def get_contents(url):
  11.     u = urllib.urlopen(url)
  12.     d = u.read()
  13.     ct = u.info().get('content-type')
  14.     if ct:
  15.         m = re.search(r'\bcharset=(.+)\b', ct)
  16.         if m:
  17.             d = d.decode(m.group(1))
  18.     return d
  19.  
  20. def find_params(s, block_name):
  21.     m = re.search(r'<div class="wk_header dev_block_header">' + block_name + r'</div>\s+<table>([\s\S]+?)</table>', s)
  22.     if m:
  23.         partial = m.group(1)
  24.         pat = r'<td class="dev_param_name"[^>]+>([\s\S]+?)</td><td class="dev_param_desc fl_l">([\s\S]+?)</td>'
  25.         params = re.findall(pat, partial)
  26.         return params
  27.  
  28. def prep(s):
  29.     s = re.sub('<[^>]+>', '', s)
  30.     s = htmlparser.unescape(s)
  31.     s = s.strip()
  32.     s = re.sub(r'\s+', ' ', s)
  33.     return s
  34.  
  35. def wrap(s, indent = '\n', initial_indent=None):
  36.     if initial_indent is None:
  37.         initial_indent = indent + '  '
  38.     ret = []
  39.     width = 80 - len(indent)
  40.     width1 = 80  - len(initial_indent)
  41.     words = s.split(' ')
  42.     temp = ''
  43.     for word in words:
  44.         if (1 + len(word) + len(temp)) <= (width if len(ret) else width1):
  45.             temp += (' ' if len(temp) else '') + word
  46.         else:
  47.             ret.append(temp)
  48.             temp = word
  49.     if len(temp):
  50.         ret.append(temp)
  51.     ret = initial_indent + indent.join(ret)
  52.     return ret
  53.  
  54. methods_url = DEV_URL + 'methods'
  55. _code = ''
  56. _code += '# -*- coding: utf8 -*-\n'
  57. _code += '# @author err0x0 <tz4678@gmail.com>\n'
  58. _code += '# @url https://github.com/err0x0/vk/\n'
  59. _code += 'from vkclient import *\n'
  60. _code += 'from keyword import kwlist\n'
  61. _code += '\n'
  62. _code += 'class VKClient2(VKClient):\n'
  63. _code += '    u"""\n'
  64. _code += u'    Код класса сгенерирован на основе документации по ссылке\n'
  65. _code += u'    {}. Параметры, имена которых совпадают с ключевыми\n'.format(methods_url)
  66. _code += u'    словами, должны начинаться с подчеркивания(eg: _from, _global).\n'
  67. _code += '    """\n'
  68. _code += '    def __init__(self, *args, **kwargs):\n'
  69. _code += '        super(VKClient2, self).__init__(*args, **kwargs)\n'
  70. _code += "        self._pattern = '_(' + '|'.join(kwlist) +  ')$'\n"
  71. _code += '\n'
  72. _code += '    def _smart_call(self, method, params={}):\n'
  73. _code += '        for k in params.keys():\n'
  74. _code += "            if (k == 'self' and params[k] == self) or\\\n"
  75. _code += "               (k == 'kwargs' and params[k] == params):\n"
  76. _code += '                   del params[k]\n'
  77. _code += '                   continue\n'
  78. _code += '            m = re.match(self._pattern, k)\n'
  79. _code += '            if m:\n'
  80. _code += '                params[m.group(1)] = params.pop(k)\n'
  81. _code += '        return self.api(method, params)'
  82.           ################################# 80 CHARS LINE ################################
  83. _code += '\n'
  84. _code += '\n    #'
  85. _code += '\n    #' + u'МЕТОДЫ ДЛЯ РАБОТЫ С API'.center(75)
  86. _code += '\n    #'
  87.  
  88. __code = ''
  89. html = get_contents(methods_url)
  90. api_methods = re.findall('<span class="dev_methods_list_span">(.+)</span>', html)
  91. methods_without_params = []
  92. for api_method in api_methods:
  93.     class_method = re.sub(r'\.|(?=[\x41-\x5a])', '_', api_method).lower()
  94.     method_url = DEV_URL + api_method
  95.     print method_url
  96.     html = get_contents(method_url)
  97.     # описание метода
  98.     m = re.search(r'<div class="dev_method_desc">([\s\S]+?)</div>', html)
  99.     description = prep(m.group(1))
  100.     _code += wrap(description, '\n    #' + ' ' * 37, '\n    # ' + class_method.rjust(34) + '  ')
  101.     _code += '\n    #'
  102.     # требуемый уровень доступа
  103.     m = re.search(r'<div class="dev_sett_block">([\s\S]+?)</div>', html)
  104.     requirements = prep(m.group(1))
  105.     params_title = u'Параметры'
  106.     params = find_params(html, params_title)
  107.     args = ['self']
  108.     required = []
  109.     optional = []
  110.     params_block = ''
  111.     if params:
  112.         params_block += '\n\n          ' + params_title + ':'
  113.         for k, v in params:
  114.             if k in kwlist:
  115.                 k = '_' + k
  116.             params_block +=  wrap(k + ' - ' + prep(v), '\n            ')
  117.             if v.lower().find(u'обязательный') != -1:
  118.                 required.append(k)
  119.             else:
  120.                 optional.append(k + '=None')
  121.     else:
  122.         methods_without_params.append(api_method)
  123.     args = args + required + optional
  124.     args.append('**kwargs')
  125.     __code += '\n'
  126.     __code += wrap('\n    def {}({}):'.format(class_method, ', '.join(args)), '\\\n        ', '')
  127.     __code += '\n        u"""'
  128.     __code += '\n          @link http://' + DEV_URL + api_method
  129.     __code += '\n'
  130.     __code +=  wrap(description, '\n        ')
  131.     __code += '\n'
  132.     __code += wrap(requirements, '\n        ')
  133.     __code += params_block
  134.     error_title = u'Коды ошибок'
  135.     errors = find_params(html, error_title)
  136.     if errors and len(errors):
  137.         __code += '\n'
  138.         __code += '\n          ' + error_title + ':'
  139.         for errno, errmsg in errors:
  140.             __code += wrap(errno + ' - ' + prep(errmsg), '\n            ')
  141.     # возвращаемый результат
  142.     __code += '\n'
  143.     m = re.search(r'<div class="dev_method_res">([\s\S]+?)<div>', html)
  144.     __code +=  wrap(prep(m.group(1)), '\n        ')
  145.     __code += '\n        """'
  146.     if len(args) > 2:
  147.         __code += '\n        kwargs.update(locals())'
  148.     __code += "\n        return self._smart_call('{}', kwargs)".format(api_method)
  149. _code += __code
  150. print u'Методы без параметров:'
  151. for method in methods_without_params:
  152.     print DEV_URL + method
  153. open('vklib/vkclient2.py', 'w').write(_code.encode('utf8'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement