import requests                 #как минимум для get
import csv                      #для Записи в таблицы
import re                       #для выделения чисел из числа
import string                   #для удаление из строки символов
from fake_useragent import UserAgent #для эмитации живого браузера
from urllib import request      #для общей выгрузке в html файл - верхний абзац
from bs4 import BeautifulSoup   #парсит страницу
from selenium import webdriver                      #навигация по сайту
from selenium.webdriver.firefox.options import Options #чтобы убрать графический интерфейс
import time                              #чтобы можно было делать паузы
from PIL import Image                               #чтобы открыть картинку и вырезать часть (не нарушаем пунктуацию)
import pytesseract                                  #чтобы из картинки получить число (распознать цифры)
from selenium.common.exceptions import NoSuchElementException #для проверки а наличие кнопки телефона на странице

def telefon(link, self):                                  #self - переменная по которой ищестся кнопка с телефоном
    self111 = '//div[@class="item-phone-big-number js-item-phone-big-number"]//*'
    n = 3                                           #время засыпания между клацаниями по браузеру (зависит от быстродействия компьютера)
    opts = Options()                                #создает переменную отвечающую за параметры фаерфокса
    opts.headless = True                            #убирает графический интерфейс у фаерфркса
    driver = webdriver.Firefox(options=opts)        #открывает firefox
    driver.get(link)                                #вбиваем страницу которую откроет Firefox
    try:                                            #проверяем есть ли кнопка телефона на странице
        driver.find_element_by_xpath(self)
    except NoSuchElementException:
        print('0 - Ошибка - нет кнопки телефона !!!!!!!!!!!!!!!!!!!!!!!!!!!')
        text = '0'
        with open('error.txt', 'a') as errorfile:
            errorfile.write(time.ctime() + ' Ошибка - нет кнопки телефона\n' + page_link + '\n')
    else:                                           #если кнопка телефона есть, то нажимаем на нее
        button = driver.find_element_by_xpath(self) #ищем кнопку
        button.click()                                  #нажимаем на кнопку
        time.sleep(n)                                        #пауза для подгрузки окна
        driver.save_screenshot('avito_screen_tmp.png')  #сохраняем скриншот экрана в файл
        try:                                            #проверяем есть ли кнопка телефона на странице
            driver.find_element_by_xpath(self111)
        except NoSuchElementException:
            print('0 - Ошибка - на кнопке телефона нет телефона !!!!!!!!!!!!!!!!!!!!!!!!!!!')
            text = '0'
            with open('error.txt', 'a') as errorfile:
                errorfile.write(time.ctime() + ' Ошибка - на кнопке телефона нет телефона\n' + page_link + '\n')
        else:
            image = driver.find_element_by_xpath(self111)   #выдираем именно картинку телефона (единственный элемент из класса див)
            location = image.location                       #получаем координаты левой верхней точки на скриншоте - координаты словаря x и y
            size = image.size                               #штрина и высота картинки - координаты словаря width и height
            x = location['x']                               #выдергиваем данные из словаря координаты левого верхнего угла по отдельности
            y = location['y']
            width = size['width']                           #выдергиваем ширину и высоту из словаря
            height = size['height']
            image = Image.open('avito_screen_tmp.png')      #открываем скриншот экрана (не нарушаем пунктуацию)
            image.crop((x, y, x+width, y+height)).save('avito_tel.gif')                                                 #вырезаем картинку телефона и сохраняем ее в файл
            image = Image.open('avito_tel.gif')             #открывем картинку с цифрами
            text = pytesseract.image_to_string(image, lang='eng') #распознаем цифры и выводим их
            text = text.replace(' ', '')                    #удаляет пробелы из номера телефона
            text = text.replace('-', '')                    #удаляет тире из номера телефона
    finally:
        driver.close()                                  #закрывает фаерфокс
        driver.quit()                                   #закрывает геко драйвер
    return text

def htmlfile(htmlname):                                 #записывает данные в хтмл файл
    avitohtml = open(htmlname, 'a', encoding = 'utf-8')
    avitohtml.write('
')
    avitohtml.write('Просм:')
    avitohtml.write(prosm1)         #пишем кол-во просмотров
    avitohtml.write(' 	')
    avitohtml.write('S = ')
    avitohtml.write(plosh2)        #пишем площадь
    avitohtml.write(' 	')
    avitohtml.write('Цена: ')
    avitohtml.write(price2)         #пишем цену
    avitohtml.write(' 	')
    avitohtml.write(ss)             #пишем ссылку
    avitohtml.write(' 	')
    avitohtml.write(adress22)       #пишем адрес
    avitohtml.write(' 	')
    avitohtml.write(tip2)           #пишем тип помещения
    avitohtml.write(' 	')
    avitohtml.write(time.ctime())   #пишем время
    avitohtml.write('
')
    avitohtml.close()

def dadress(soup, tag):                                         #выдираем текст с тага класс и проверяем что он есть с записью в файл ошибок
    try:
        adress = str(soup.find(class_=tag).text)
    except AttributeError:                                      #если нет адреса
        adress22 = '0'
        with open('error.txt', 'a') as errorfile:
            errorfile.write(time.ctime() + ' Ошибка - нет данных\n' + page_link + '\n' + tag + '\n')
        print('Ошибка - нет данных\n' + page_link + '\n' + tag)
    except Exception:                                           #если ошибка
        adress22 = '0'
        with open('error.txt', 'a') as errorfile:
            errorfile.write(time.ctime() + ' Ошибка - неизвестная ошибка\n' + page_link + '\n')
        print('Ошибка - неизвестная ошибка\n' + page_link + '\n' + tag)
    else:
        adress22 = adress.strip()                               #удаляем пробелы вначале и вконце
    finally:
        return adress22

myUrl = 'https://www.mytoys.ru/product/14861316' # присваиваю переменной урл

while 1:
    page = requests.get(myUrl)
    soup = BeautifulSoup(page.text, 'html.parser')
    links = soup.find_all(class_='sizes-block') #ищем все размеры которых нет
    ##выберает только ссылки для браузера из объяв
    print(links)
    for links1 in links:
        n = 0
        print(links1)
        time.sleep(3)
        #if 'itemprop' in str(links1) :                          #проверяет по атребуту ссылки, что это нужная ссылка
        #    href = 'https://www.avito.ru' + links1.get('href') #участвует в программе
        #else :
        #    print(links1.text)                                  #если в ссылка не того формата, то орываем цикл
        #    continue

        #with open(r"vitasuper.html", "r", encoding = 'utf-8') as file:
        #    for line in file: #проверяем наличие ссылки в файле
        #        if links1.get('href') in line :
        #            n = 1
        #            print(time.ctime())                                                 #в случае если элемент уже есть пишем время

    time.sleep(1800)


import os
import torch
from CLIP import clip
from PIL import Image
import csv
import matplotlib.pyplot as plt

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

def read_class_text_from_csv(csv_file, encoding='utf-8', line=0):
    with open(csv_file, 'r', encoding=encoding, errors='replace') as file:
        reader = csv.reader(file)
        class_text = [row[line] for row in reader]  # 读取每一行第二个元素
    return class_text

def extract_subseries_from_csv(csv_file, brand_name, encoding='utf-8'):
    with open(csv_file, 'r', encoding=encoding, errors='replace') as file:
        reader = csv.reader(file)
        next(reader)  # 跳过CSV文件的标题行
        subseries = [row[2].strip() for row in reader if row[1].strip() == brand_name]
    return subseries

def extract_category_from_csv(csv_file, brand_name, subseries, sa = 0, encoding='utf-8'):
    with open(csv_file, 'r', encoding=encoding, errors='replace') as file:
        reader = csv.reader(file)
        next(reader)  # 跳过CSV文件的标题行
        shoes_price = [row[sa].strip() for row in reader if row[1].strip() == brand_name and row[2].strip() == subseries]
    return shoes_price

def predict(image_file, class_text):
    image = preprocess(Image.open(image_file)).unsqueeze(0).to(device)
    text = clip.tokenize(class_text).to(device)

    with torch.no_grad():
        image_features = model.encode_image(image)
        text_features = model.encode_text(text)

        logits_per_image, logits_per_text = model(image, text)
        brand_probs = logits_per_image.softmax(dim=-1).cpu().numpy()

    return brand_probs

def predict_brand(image_file, class_text):
    brand_probs = predict(image_file, class_text)

    max_brand_prob = 0.0
    max_brand_index = -1
    for i, prob in enumerate(brand_probs[0]):
        if prob > max_brand_prob:
            max_brand_prob = prob
            max_brand_index = i

    if max_brand_index != -1:
        max_brand = class_text[max_brand_index]
        # print(f"Brand Prediction: {max_brand}: {max_brand_prob}")
        return max_brand, max_brand_prob

def predict_series(image_file, class_text, count):
    brand_probs = predict(image_file, class_text)

    max_brand_prob = 0.0
    max_brand_index = -1
    for i, prob in enumerate(brand_probs[0]):
        if prob > max_brand_prob:
            max_brand_prob = prob
            max_brand_index = i

    if max_brand_index != -1:
        max_brand = class_text[max_brand_index]
        # print(f"Brand Prediction{count}: {max_brand}: {max_brand_prob}")
        return max_brand, max_brand_prob


import sys
from transformers import GPT2Tokenizer, GPT2LMHeadModel
import torch
tokenizer = GPT2Tokenizer.from_pretrained("af1tang/personaGPT")
model = GPT2LMHeadModel.from_pretrained("af1tang/personaGPT")
if torch.cuda.is_available():
    model = model.cuda()

def flatten(l): return [item for sublist in l for item in sublist]

def to_data(x):
    if torch.cuda.is_available():
        x = x.cpu()
    return x.data.numpy()

def to_var(x):
    if not torch.is_tensor(x):
        x = torch.Tensor(x)
    if torch.cuda.is_available():
        x = x.cuda()
    return x

def display_dialog_history(dialog_hx):
    for j, line in enumerate(dialog_hx):
        msg = tokenizer.decode(line)
        if j % 2 == 0:
            print(">> User: " + msg)
        else:
            print("Bot: "+msg)
            print()

def generate_next(bot_input_ids, do_sample=True, top_k=10, top_p=.92,
                  max_length=1000, pad_token=tokenizer.eos_token_id):
    full_msg = model.generate(bot_input_ids, do_sample=True,
                              top_k=top_k, top_p=top_p,
                              max_length=max_length, pad_token_id=tokenizer.eos_token_id)
    msg = to_data(full_msg.detach()[0])[bot_input_ids.shape[-1]:]
    return msg

personas = [
    "I am a mature person.",
    "I am caring but get angry at injustices.",
    "I enjoy playing video games and birdwatching.",
]
personas = tokenizer.encode(
    ''.join(['<|p2|>'] + personas + ['<|sep|>'] + ['<|start|>']))

dialog = sys.argv[1:]

dialog_hx = []
for text in dialog:
    dialog_hx.append(tokenizer.encode(text + tokenizer.eos_token))

bot_input_ids = to_var([personas + flatten(dialog_hx)]).long()
encoded_msg = generate_next(bot_input_ids)
dialog_hx.append(encoded_msg)

msg = tokenizer.decode(encoded_msg, skip_special_tokens=True)
print(msg)
sys.stdout.flush()


# -*- coding: utf-8 -*-

import logging
from datetime import datetime, timedelta

from odoo import models, fields, api

_logger = logging.getLogger(__name__)

class LoanRecordAutovacuum(models.TransientModel):
    _name = 'loan.autovacuum'
    _description = "Loan - Delete old records"

    @api.model
    def autovacuum(self, days):
        """Delete all records older than ``days`` not in ['approved',]. This includes:

        Called from a cron.
        """
        days = (days > 0) and int(days) or 0
        deadline = datetime.now() - timedelta(days=days)
        data_models = (
            'loan.apply',
            'loan.loan',
            'loan.credit',
        )
        for data_model in data_models:
            records = self.env[data_model].search(
                [('create_date', '<=', fields.Datetime.to_string(deadline)),
                 ('state', 'not in', ['approved', 'refused'])])
            nb_records = len(records)
            # records.unlink()
            records.write({'active': False})
            _logger.info(
                u"AUTOVACUUM - %s '%s' records deactived",
                nb_records, data_model)
        return True

    @api.model
    def autovacuum_credit(self, days):
        """Delete all credit older than ``days`` in ['approved',]. This includes:

        Called from a cron.
        """
        days = (days > 0) and int(days) or 0
        deadline = datetime.now() - timedelta(days=days)
        data_models = (
            'loan.credit',
        )
        for data_model in data_models:
            records = self.env[data_model].search(
                [('create_date', '<=', fields.Datetime.to_string(deadline)),
                 ('state', 'in', ['approved', ]),
                 ('tag_ids.name', 'not in', ['本人', ])])
            nb_records = len(records)
            # records.unlink()
            records.write({'active': False})
            _logger.info(
                u"AUTOVACUUM - %s '%s' credits deactived",
                nb_records, data_model)
        return True