· 7 years ago · Apr 03, 2018, 11:24 AM
1# -*- coding: utf8 -*-
2import os
3import zipfile
4import argparse
5import re
6import requests
7import json
8from collections import OrderedDict
9
10
11class WidgetInstaller(object):
12 def __init__(self, domain, login, api_key=None, need_update=0):
13 self.login = login
14 self.api_key = api_key
15 self.domain = domain
16 self.need_update = need_update
17 self.session = requests.Session()
18 self.session.headers.update(
19 {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0',
20 'X-Requested-With': 'XMLHttpRequest'})
21 self.base_uri = 'https://{}.amocrm.ru'.format(domain)
22 self.__auth()
23
24 def __request(self, uri, data=None):
25 headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
26 url = self.base_uri + uri
27 return self.session.post(url, headers=headers, data=data)
28
29 def __auth(self):
30 data = {
31 'USER_LOGIN': self.login,
32 'USER_HASH': self.api_key
33 }
34 self.__request('/private/api/auth.php?type=json', data)
35
36 def create_widget_key(self, name):
37 data = {'action': 'create', 'code': name}
38 r = self.__request('/ajax/settings/dev/', data)
39 if r.status_code == 200:
40 text = json.loads(r.text)
41 if 'error' in text:
42 raise Exception(text['error'])
43 else:
44 print('Coздан виджет Ñ ÐºÐ¾Ð´Ð¾Ð¼: {}'.format(name))
45 return self.find_widget_data(name)
46
47 def find_widget_data(self, name):
48 r = self.__request('/ajax/settings/dev/')
49 widgets = json.loads(r.text)
50 if 'error' in widgets:
51 raise Exception(widgets['error'])
52 else:
53 items = widgets['response']['widgets']['items']
54 for item in items:
55 if item['code'] == name:
56 print('Ðайден виджет Ñ ÐºÐ¾Ð´Ð¾Ð¼ {} и Ñекретным ключом {}.'.format(item['code'], item['secret_key']))
57 return item['code'], item['secret_key']
58 return None, None
59
60 def upload_widget(self, archive_path, secret_key, widget_code):
61 file = {
62 ' widget': ('widget.zip', open(archive_path, 'rb'), 'application/x-zip-compressed'),
63 }
64 data = {
65 'secret': secret_key,
66 'widget': widget_code,
67 'amouser': self.login,
68 'amohash': self.api_key,
69 'domain': 'amocrm.ru'
70 }
71
72 url = 'https://widgets.amocrm.ru/{}/upload/'.format(self.domain)
73
74 r = requests.post(url, data=data, files=file)
75 if r.status_code == 200:
76 res = re.sub(r'^<script(.*)script>', '', r.text)
77 text = json.loads(res)
78 if 'error' in text:
79 raise Exception(text['error'])
80 else:
81 print('Виджет {} уÑпешно загружен'.format(widget_code))
82
83 @staticmethod
84 def zip_archive(widget_folder):
85 cur_dir = os.path.abspath(os.curdir)
86 os.chdir(os.path.abspath(widget_folder))
87 z = zipfile.ZipFile(os.path.join(cur_dir, 'widget.zip'), 'w')
88 for root, dirs, files in os.walk(os.curdir):
89 for file in files:
90 z.write(os.path.join(root, file))
91 file_path = os.path.abspath(z.filename)
92 z.close()
93 os.chdir(cur_dir)
94 print('Создан архив {}'.format(file_path))
95 return file_path
96
97 @staticmethod
98 def update_manifest(path, code, secret_key):
99 file = path + "/manifest.json"
100 manifest_dict = json.load(open(file), object_pairs_hook=OrderedDict)
101 manifest_dict['widget']['code'] = code
102 manifest_dict['widget']['secret_key'] = secret_key
103 with open(file, 'w') as file_handler:
104 file_handler.write(json.dumps(manifest_dict, sort_keys=False, indent=4))
105 print('Файл manifest.json изменен.')
106 return True
107
108
109def main():
110 try:
111 parser = argparse.ArgumentParser()
112 parser.add_argument('-l', help=u'Логин')
113 parser.add_argument('-a', help=u'API-ключ')
114 parser.add_argument('-d', help=u'Субдомен')
115 parser.add_argument('-n', help=u'Ð˜Ð¼Ñ Ð²Ð¸Ð´Ð¶ÐµÑ‚Ð°')
116 parser.add_argument('-f', help=u'Папка Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ виджета')
117 parser.add_argument('--update', help=u'Обновить ÑущеÑтвующий виджет', nargs='?', type=bool, const=True,
118 default=False)
119 args = parser.parse_args()
120 app = WidgetInstaller(args.d, args.l, args.a, args.update)
121 code, secret_key = app.find_widget_data(args.n)
122 if not code:
123 code, secret_key = app.create_widget_key(args.n)
124 elif not args.update:
125 raise Exception(
126 'Виджет Ñ ÐºÐ¾Ð´Ð¾Ð¼ {} уже ÑущеÑтвует, Ð´Ð»Ñ ÐµÐ³Ð¾ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð¶Ð¸Ñ‚Ðµ параметр --update'.format(code))
127 app.update_manifest(args.f, code, secret_key)
128 archive_path = app.zip_archive(args.f)
129 app.upload_widget(archive_path=archive_path, secret_key=secret_key, widget_code=code)
130 except (IOError, Exception) as e:
131 print(e)
132 input("Press Enter to continue...")
133
134
135if __name__ == '__main__':
136 main()