def handle(self, *args, **options): addresses = Address.objects.all() for address in addresses: #if not address.latitude or not address.longitude: resp = ask_yandex_address_by_str(address.addressLines) print(json_pretty_print(resp)) adr = parse_yandex_address(resp) print(json_pretty_print(adr)) if not adr: continue kwargs = { k: v for k, v in adr.items() if not k in ('addressLines', ) } Address.objects.filter(pk=address.id).update(**kwargs)
def create_deals(self, deals: list): """Добавить сделку name string Название сделки price int Бюджет сделки status_id int ID статуса pipeline_id int ID воронки created_by int ID пользователя, создающий сделку 0=робот updated_by int ID пользователя, изменяющий сделку 0=робот closed_at int Дата закрытия сделки, передается в Unix Timestamp created_at int Дата создания сделки, передается в Unix Timestamp updated_at int Дата изменения сделки, передается в Unix Timestamp loss_reason_id int ID причины отказа responsible_user_id int ID пользователя, ответственного за сделку custom_fields_values array Массив по дополнительным полям _embedded object вложенные теги _embedded[tags] array|null данные тегов _embedded[tags][0] object Модель тега id или name _embedded[tags][0][id] int ID тега _embedded[tags][0][name] string Название тега https://www.amocrm.ru/developers/content/crm_platform/custom-fields#cf-fill-examples request_id string вернется в ответе без изменений :param deals: список сделок """ endpoint = '/api/v4/leads' r = self.s.post('%s%s' % (self.host, endpoint), json=deals, headers=self.headers) print(json_pretty_print(r.json())) return r.json()
def build_symbols_dict(obj: dict): """Построить словарь контрактов :param obj: полученные контракты (get_active_symbols) """ from apps.main_functions.catcher import json_pretty_print active_symbols = obj['active_symbols'] markets = {} for item in active_symbols: market = markets.get(item['market']) if not market: market = { 'market': item['market'], 'name': item['market_display_name'], 'submarkets': {}, } markets[item['market']] = market submarket = market['submarkets'].get(item['submarket']) if not submarket: submarket = { 'submarket': item['submarket'], 'name': item['submarket_display_name'], 'symbols': [], } market['submarkets'][item['submarket']] = submarket submarket['symbols'].append(item['symbol']) print(json_pretty_print(markets)) return markets
def test(request): """Апи-метод для получения ip-адреса""" method = request.GET if request.method == 'GET' else request.POST result = { 'ip': method.get('REMOTE_ADDR'), 'ip_forwarded': request.META.get('HTTP_X_FORWARDED_FOR'), } # на случай, если надо посмотреть тело json запроса if hasattr(request, 'body') and request.body: print(json_pretty_print(json.loads(request.body))) result = { 'apiVersion': '1', 'error': { 'code': 400, 'message': 'bad request', 'errors': [{ 'reason': 'requiredFieldMissing', 'message': 'pickup: required field pointOfServiceId missing', }] }, } return JsonResponse(result, safe=False, status=400) return JsonResponse(result, safe=False)
def handle(self, *args, **options): Address.objects.all().delete() Dealer.objects.all().delete() #load_dealers2file() with open(DEALERS_FILE, 'r', encoding='utf-8') as f: addresses = json.loads(f.read()) for adr in addresses: adr_info = ask_yandex_address_by_coords(adr['latitude'], adr['longitude']) details = parse_yandex_address(adr_info) print(json_pretty_print(details)) adr.update({ 'country': details.get('country'), 'city': details.get('city'), 'state': details.get('state'), 'county': details.get('county'), 'street': details.get('street'), 'subdistrict': details.get('subdistrict'), 'houseNumber': details.get('houseNumber'), 'postalCode': details.get('postalCode'), }) address = Address.objects.create(**{ k: v for k, v in adr.items() if not k in ('phone', ) }) dealer = Dealer.objects.create(**{ 'name': adr['addressLines'], 'phone': adr['phone'], 'address': address, })
def load_dealers(country): """Загрузка дилеров :param country: страна """ result = [] domain = 'https://api.sur-ron.com/web/store/en/list' params = { 'country': country, 'page': 1, 'size': 200, } r = requests.get(domain, params=params) resp = r.json() items = resp.get('data', {}).get('list', []) while items: print(json_pretty_print(params)) params['page'] += 1 result += [{ 'phone': item['contactPhone'], 'place': item.get('storeName') or item.get('contactName'), 'addressLines': item['address'], 'latitude': item['latitude'], 'longitude': item['longitude'], } for item in items] r = requests.get(domain, params=params) resp = r.json() items = resp.get('data', {}).get('list', []) return result
def handle(self, *args, **options): parser = xml.sax.make_parser() xml_handler = XMLHandler() parser.setContentHandler(xml_handler) parser.parse('/home/jocker/Documents/SEVA/1cv8_unloading.xml') #print(json_pretty_print(xml_handler.all_tags)) print(json_pretty_print(xml_handler.tags_tree))
def get_deal(self, deal_id: int): """Получить сделку""" endpoint = '/api/v4/leads/%s' % deal_id params = {} r = self.s.get('%s%s' % (self.host, endpoint), params=params, headers=self.headers) print(json_pretty_print(r.json())) return r.json()
def handle(self, *args, **options): """Получение данные по ИНН""" url = 'https://egrul.nalog.ru/' inn = '' if options.get('inn'): inn = options['inn'] if not inn: logger.info('inn not set') return print(json_pretty_print(get_info_by_inn(inn)))
def my_ip(request): """Апи-метод для получения ip-адреса""" method = request.GET if request.method == 'GET' else request.POST result = { 'method': request.method, 'ip': request.META.get('REMOTE_ADDR'), 'ip_forwarded': request.META.get('HTTP_X_FORWARDED_FOR'), } # на случай, если надо посмотреть тело json запроса if hasattr(request, 'body') and request.body: logger.info(json_pretty_print(json.loads(request.body))) return JsonResponse(result, safe=False)
def handle(self, *args, **options): """Выгрузка товаров sima-land.ru""" #Products.objects.all().delete() simaland = SimaLand() simaland.get_jwt() #cart = simaland.get_cart() #print(json_pretty_print(cart)) #print(simaland.add2cart(cart_id=cart['_cart']['cart_id'], items=[{'item_id': 8392, 'qty': 1}, ])) #simaland.get_categories() #started = time.time() #simaland.get_products() print(json_pretty_print(simaland.get_product(product_id=4119069)))
def handle(self, *args, **options): kwargs = {} token = options.get('token') if token: kwargs['token'] = token chat_id = options.get('chat_id') if chat_id: kwargs['chat_id'] = chat_id proxy = options.get('proxy') if proxy: kwargs['proxies'] = { 'http': proxy, 'https': proxy, } logger.info(kwargs) bot = TelegramBot(**kwargs) logger.info(json_pretty_print(bot.get_updates()))
def handle(self, *args, **options): params = { 'amount': 100, 'orderNumber': 'test_%s' % str(time.time()), 'returnUrl': 'http://*****:*****@masterme.ru', 'phone': '73952959223', } sber = SberPaymentProovider() register_order = sber.register_do(**params) print(json_pretty_print(register_order)) print(register_order['errorCode'], type(register_order['errorCode']))
def app2settings(app_name): """Добавляем новое приложение в settings.py :param app_name: новое приложение""" settings_path = os.path.join(settings.BASE_DIR, 'conf', 'settings.py') with open(settings_path, 'r') as f: content = f.read() rega_custom_apps = re.compile('# CUSTOM_APPS_START\nCUSTOM_APPS = (.+)\n# CUSTOM_APPS_END', re.I + re.U + re.DOTALL) custom_apps_match = rega_custom_apps.search(content) CUSTOM_APPS = json.loads(custom_apps_match.group(1)) CUSTOM_APPS.append('apps.%s' % (app_name, )) CUSTOM_APPS = list(set(CUSTOM_APPS)) new_custom_apps = """ # CUSTOM_APPS_START CUSTOM_APPS = %s # CUSTOM_APPS_END""" % (json_pretty_print(CUSTOM_APPS), ) content = rega_custom_apps.sub(new_custom_apps, content) with open(settings_path, 'w') as f: f.write(content)
def update_access_token(self): """Обновление access_token через refresh_token """ endpoint = '/oauth2/access_token' params = { 'client_id': self.client_id, 'client_secret': self.client_secret, 'grant_type': 'refresh_token', 'refresh_token': self.refresh_token, 'redirect_uri': self.redirect_uri, } r = self.s.post('%s%s' % (self.host, endpoint), data=params) resp = r.json() print(json_pretty_print(resp)) self.set_credentials(resp) with open_file(self.file, 'w+') as f: f.write(json.dumps(resp)) return resp
def create_contacts(self, contacts: list): """Добавление контактов name string Название контакта first_name string Имя контакта last_name string Фамилия контакта responsible_user_id int ID пользователя, ответственного за контакт created_by int ID пользователя, создавший контакт updated_by int ID пользователя, изменивший контакт created_at int Дата создания контакта, передается в Unix Timestamp updated_at int Дата изменения контакта, передается в Unix Timestamp custom_fields_values array Массив дополнительных полей request_id string Поле, которое вернется вам в ответе без изменений """ endpoint = '/api/v4/contacts' r = self.s.post('%s%s' % (self.host, endpoint), json=contacts, headers=self.headers) print(json_pretty_print(r.json())) return r.json()
def get_access_token(self): """Получение access_token и refresh_token Если 3 мес не пользоваться access_token, то он просрется access_token надо обновлять по refresh_token, поэтому надо хранить в базе их, потому что тоже просрать легко Далее делаем запросы к апи и добавляем к headers 'Authorization: Bearer ' . $access_token """ endpoint = '/oauth2/access_token' params = { 'client_id': self.client_id, 'client_secret': self.client_secret, 'grant_type': 'authorization_code', 'code': self.code, 'redirect_uri': self.redirect_uri, } r = self.s.post('%s%s' % (self.host, endpoint), data=params) print(json_pretty_print(r.json())) return r.json()
def link_deal2contact(self, deal_id: int, contact_id: int): """Привязать сделку к контакту to_entity_id int ID связанной сущности to_entity_type string Тип связанной сущности (leads, contacts) metadata object|null Метаданные связанной сущности metadata[catalog_id] int ID каталога metadata[quantity] int Количество прикрепленных элементов каталогов metadata[is_main] bool Является ли контакт главным metadata[updated_by] int ID пользователя, который прикрепил :param deal_id: id сделки :param contact_id: ид контакта """ endpoint = '/api/v4/leads/%s/link' % deal_id params = [{ 'to_entity_id': contact_id, 'to_entity_type': 'contacts', }] r = self.s.post('%s%s' % (self.host, endpoint), json=params, headers=self.headers) print(json_pretty_print(r.json())) return r.json()
def handle(self, *args, **options): kwargs = {} token = options.get('token') if token: kwargs['token'] = token chat_id = options.get('chat_id') if chat_id: kwargs['chat_id'] = chat_id proxy = options.get('proxy') if proxy: kwargs['proxies'] = { 'http': proxy, 'https': proxy, } logger.info(kwargs) bot = TelegramBot(**kwargs) test_msg = '%s - Тестовое сообщение' % (bot.get_emoji('clearSky'), ) if options.get('text'): test_msg = options['text'] logger.info( json_pretty_print(bot.send_message(test_msg, parse_mode='HTML')))
def get_event(link, date): """Подтаскиваем событие Подтаскиваем место Подтаскиваем сеанс date передается для RSeances""" url = '{}{}'.format(root_url, link) logger.info('get_event => {}'.format(url)) content = requests.get(url).text tree = html.fromstring(content) container = tree.xpath('.//*[@class="grid-inner"]')[0] tag = link.split('/')[-2] analogs = REvents.objects.filter(tag=tag) if analogs: analog = analogs[0] else: analog = REvents.objects.create(tag=tag) # /afisha/cinema/20190125/44696/ # Разбиваем по первой цифре года rgenre = RGenres.objects.get(tag=link.split('2')[0]) analog.rgenre = rgenre # -------------------- # Загрузка изображения # -------------------- if not analog.img: imgas = tree.xpath('.//link') for imga in imgas: if imga.attrib.get('rel') == 'image_src': href = imga.attrib.get('href') analog.upload_img(href) title = container.xpath('.//h1')[0].text.strip() analog.name = title seance = None place = None details = [] info = container.xpath( './/*[@class="cinema-list__labels cinema-list__labels_read"]')[0] for item in info: if item.tag.lower() == 'span': detail = item.xpath('.//b') if detail: if detail[0].text: if '+' in detail[0].text: analog.label = detail[0].text.strip() t = detail[0].xpath('.//time') if t: if t[0].text: seance = t[0].text.strip() else: if item.text: analog.genre = item.text.strip() # ------------------------- # Это ссылка на место, надо # его найти или добавить # ------------------------- elif item.tag.lower() == 'a': href = item.attrib.get('href') if not '/guide/' in href: continue tag = href.split("/")[-2] place_analogs = Places.objects.filter(tag=tag) if place_analogs: place = place_analogs[0] else: place = get_place(href, tag) if seance: hours, minutes = seance.split(':') RSeances.objects.create(place=place, event=analog, hours=hours, minutes=minutes, date=date) desc = '' description = container.xpath('.//*[@class="event-article"]/p') for item in description: if item.text: desc += '<p>{}</p>'.format(kill_html(item.text.strip())) analog.description = desc # ------------------------------- # На удивление, тут нет картинки, # ее надо дергать с листинга # ------------------------------- logger.info(json_pretty_print(object_fields(analog))) analog.save() if not seance: logger.error('---SEANCE NOT RECOGNIZED---') if not place: logger.error('---PLACE NOT RECOGNIZED---')
def get_place(link, tag): """Подтаскиваем место, если его нет""" url = '{}{}'.format(root_url, link) logger.info('get_place => {}'.format(url)) content = requests.get(url).text tree = html.fromstring(content) containers = tree.xpath('.//*[@class="grid-inner"]') if containers: container = containers[0] else: return None place_card = container.xpath('.//*[@class="place-card"]')[0] analogs = Places.objects.filter(tag=tag) if analogs: analog = analogs[0] else: analog = Places.objects.create(tag=tag) title = place_card.xpath('.//h1')[0].text.strip() analog.name = title imga = place_card.xpath('.//*[@class="place-card__image"]/img') if imga: imga = imga[0].attrib.get('src') analog.upload_img(imga) info = place_card.xpath('.//*[@class="place-card__info"]')[0] place_phones = [] for item in info: class_item = item.attrib.get('class') if 'column_tel' in class_item: phones = item.xpath('.//p') for phone in phones: if phone.text: place_phones.append(phone.text.strip()) elif 'column_pl' in class_item: details = item.xpath('.//p') for detail in details: worktime = detail.xpath('.//b') address = detail.xpath('.//a') if worktime: analog.worktime_str = worktime[0].text.strip() elif address: analog.address_str = address[0].attrib.get( 'data-map-address') elif 'column_right' in class_item: details = item.xpath('.//p/a') for item in details: href = item.attrib.get('href') if 'mailto' in href: analog.email_str = item.text.strip() else: analog.site_str = href if place_phones: analog.phone_str = ', '.join(place_phones) logger.info(json_pretty_print(object_fields(analog))) analog.save() return analog
def get_cinema_event(link, imga_link): """Подтаскиваем событие, если его нет""" url = '{}{}'.format(root_url, link) logger.info('get_cinema_event => {}'.format(url)) content = requests.get(url).text tree = html.fromstring(content) container = tree.xpath('.//*[@class="grid-inner"]')[0] tag = link.split('/')[-2] analogs = REvents.objects.filter(tag=tag) if analogs: analog = analogs[0] else: analog = REvents.objects.create(tag=tag) # /afisha/cinema/20190125/44696/ # Разбиваем по первой цифре года rgenre = RGenres.objects.get(tag=link.split('2')[0]) analog.rgenre = rgenre # -------------------- # Загрузка изображения # -------------------- if imga_link: analog.upload_img(imga_link) title = container.xpath('.//h1')[0].text.strip() analog.name = title details = [] info = container.xpath( './/*[@class="cinema-list__labels cinema-list__labels_read"]')[0] for item in info: if item.tag.lower() == 'span': detail = item.xpath('.//b') if detail: details.append(detail[0].text.strip()) else: details.append(item.text.strip()) if len(details) == 4: analog.duration = details[0] analog.label = details[1] analog.genre = details[2] analog.country = details[3] else: logger.error('--- INFO NOT RECOGNIZED ---') desc = '' description = container.xpath( './/*[@class="cinema-desc__item cinema-desc__item_text"]/p') for item in description: if item.text: desc += '<p>{}</p>'.format(kill_html(item.text.strip())) analog.description = desc trailer = container.xpath('.//*[@class="g-video"]/iframe') if trailer: src = trailer[0].attrib.get('src') trailer = html.tostring(trailer[0]) if '//www.youtube.com' in src: analog.trailer = trailer.decode('utf-8') actors = container.xpath( './/*[@class="cinema-desc__item cinema-desc__item_aside"]/dl') if actors: field = None values = [] for actor in actors[0]: if actor.tag.lower() == 'dt': if field and values: setattr(analog, field, ', '.join(values)) values = [] field = None if 'Режиссер' in actor.text: field = 'producer' else: field = 'actors' elif actor.tag.lower() == 'dd': values.append(actor.text.strip()) if field and values: setattr(analog, field, ', '.join(values)) # ------------------------------- # На удивление, тут нет картинки, # ее надо дергать с листинга # ------------------------------- logger.info(json_pretty_print(object_fields(analog))) analog.save() return analog
def handle(self, *args, **options): bot = TelegramBot() with open_file('misc/logo.png') as f: logger.info(json_pretty_print(bot.send_photo(f)))
def DefaultFeedback(request, **kwargs): """Контакты и форма обратной связи kwargs['fv']: fv => array дополнительной информации для письма ------------------------------------------------ Любое количество полей с его описанием принимаем из main.views.FeedBack kwargs['fields'] = [{"name":"value"}, ...] name - название input/select... value - описание что за поле соответственно, вытаскиваем из POST по name и описание будет value:request.POST['name'] ------------------------------------------------- kwargs['additional_emails'] = True => принимаем request.POST.get("additional_emails) kwargs['additional_emails_condition'] = "223.ru" => условие - в email должно быть это выражение ------------------------------------------------- kwargs['additional_conds'] - доп. валидация kwargs['additional_conds'] = [ {"name":"sms", "error":u"Неправильный смс-код", "value":"1234"}, ..., ] """ q_string = kwargs.get('q_string', {}) breadcrumbs = kwargs.get('breadcrumbs', []) result = {'errors': []} # ----------------------------------- # Принудительная попытка отправки, # даже если не все гладко - например, # не все поля заполнены # ----------------------------------- force_send = kwargs.get('force_send') == True do_not_send = kwargs.get('do_not_send') == True isError = None if not breadcrumbs: breadcrumbs.append({ 'name': 'Обратная связь', 'link': '/feedback/', }) if request.method == "GET": product = kwargs.get('product') q_string['recall'] = kwargs.get('recall') containers = {} context = {} template = kwargs.get('template', 'web/main_stat.html') page = SearchLink(q_string, request, containers) context['page'] = page context['q_string'] = q_string context['breadcrumbs'] = breadcrumbs context['containers'] = containers context['product'] = product return render(request, template, context) # ------------------- # Дополнительные поля # ------------------- fields = kwargs.get('fields', []) feedback_vars = feedback_form(request, q_string, fields=fields) for required_key in ('name', 'phone', 'msg'): if not required_key in feedback_vars: result['error'] = required_key isError = 1 # ------------------------------------ # Принудительная отправка даже # при незаполненных обязательных полях # ------------------------------------ if force_send: isError = None if 'error' in result: del result['error'] # ------------------------ # Проверка по доп условиям # ------------------------ additional_conds = kwargs.get('additional_conds', []) for acond in additional_conds: v = request.POST.get(acond['name']) if not v == acond['value']: result['errors'].append(acond['error']) result['error'] = acond['name'] isError = 1 if not isError: result['success'] = 1 title = kwargs.get('title') if title: feedback_vars['title'] = title fv = kwargs.get('fv', []) for item in fv: feedback_vars['result'] += item logger.info('\n[--- SENDING EMAIL ---]' + '\n[TITLE]:%s' % feedback_vars['title'] + '\n[MSG]: %s' % feedback_vars['result'] + '\n[SENDER]: %s' % feedback_vars['sender'] + '\n[EMAILS]: %s' % feedback_vars['emails'] + '\n[---------------------]') mail = EmailMessage(feedback_vars['title'], feedback_vars['result'], feedback_vars['sender'], feedback_vars['emails']) mail.content_subtype = 'html' if feedback_vars['file']: mail.attach(feedback_vars['file']['name'], feedback_vars['file']['content'], feedback_vars['file']['content_type']) if not do_not_send: try: mail.send() except Exception as e: result['error'] = str(e) else: logger.info(json_pretty_print(feedback_vars)) # --------------------------- # Не возвращаем HttpResponse # --------------------------- if kwargs.get('dummy'): return {'feedback_vars': feedback_vars, 'result': result} return JsonResponse(result, safe=False)
def handle(self, *args, **options): """Тестирование получения курса валют с центробанка""" date = None if options.get('date'): date = options['date'] print(json_pretty_print(get_currency_cbr(date)))
def demo_explain(): """Пример, как вывести параметры для тела документа, которые передаем в метод""" elements = get_elements() print(json_pretty_print(parse_elements(elements)))