示例#1
0
 def main_link(self):
     year_from = Settings.get_solo().date_from or '1990'
     if isinstance(year_from, date):
         year_from = year_from.year
     year_to = Settings.get_solo().date_to or '2017'
     if isinstance(year_to, date):
         year_to = year_to.year
     return f'{self.link}/search' \
            f'?api_key={self.api_key}' \
            '&category_id=1' \
            f'&s_yers={year_from}' \
            f'&po_yers={year_to}' \
            '&price_ot=100' \
            '&price_do=10000' \
            '&currency=1' \
            '&abroad=2' \
            '&custom=1' \
            '&damage=2' \
            '&fuelRatesType=city' \
            '&marka_id=0' \
            '&model_id[0]=0' \
            '&engineVolumeFrom=' \
            '&engineVolumeTo=' \
            '&power_name=1' \
            '&countpage=100'
示例#2
0
def filter_parse(title, description, price, currency, city=''):
    for stop in StopWordList.objects.values_list('word', flat=True):
        if stop in title or stop in description or stop in city:
            return False

    if price and isinstance(price, str):
        price = int(price)

    if isinstance(price, int):
        if currency == '$':
            price_usd_from = Settings.get_solo().price_usd_from
            price_usd_to = Settings.get_solo().price_usd_to
            if price_usd_from and price < price_usd_from:
                return False
            if price_usd_to and price > price_usd_to:
                return False

        else:
            price_hrn_from = Settings.get_solo().price_hrn_from
            price_hrn_to = Settings.get_solo().price_hrn_to
            if price_hrn_from and price < price_hrn_from:
                return False
            if price_hrn_to and price > price_hrn_to:
                return False

    return True
示例#3
0
 def main_link(self):
     year_from = Settings.get_solo().date_from or '1990'
     if isinstance(year_from, datetime.date):
         year_from = year_from.year
     return f'https://www.olx.ua/transport/legkovye-avtomobili/' \
            'q-%D0%B4%D1%82%D0%BF/?' \
            'search[filter_float_price%3Afrom]=2500&' \
            'search[filter_float_price%3Ato]=525000&' \
            f'search[filter_float_motor_year%3Afrom]={year_from}'
示例#4
0
    def __init__(self, link=None, stream=False):
        if not link:
            link = self.main_link

        year_from = Settings.get_solo().date_from or '1990'
        if isinstance(year_from, datetime.date):
            year_from = year_from.year
        year_to = Settings.get_solo().date_to or ''
        if isinstance(year_to, datetime.date):
            year_to = year_to.year
        self.parameters['y1'] = year_from
        self.parameters['y2'] = year_to

        self.response = requests.get(link,
                                     params=self.parameters,
                                     headers=self.headers,
                                     stream=stream)

        self.parsed_body = html.fromstring(self.response.text)
示例#5
0
 def send(self, phone):
     enable_disable_sms = Settings.get_solo().enable_disable_sms
     if enable_disable_sms:
         if self.auth == 'Вы успешно авторизировались':
             if float(self.balance):
                 return self._result(phone)
             else:
                 self.error_message = f'Ваш баланс {self.balance}'
         elif self.auth == 'Неверный логин или пароль':
             self.error_message = 'Неверный логин или пароль'
     else:
         self.never_send = True
示例#6
0
    def __init__(self, page=1, link=None):

        self.parameter['start'] = page

        if not link:
            self.link = self.main_link
        else:
            self.link = link
            self.parameter = {
                'year[]': [1991, 2018],
            }

        year_from = Settings.get_solo().date_from or '1990'
        if isinstance(year_from, datetime.date):
            year_from = year_from.year
            self.parameter['year[]'][0] = year_from
        year_to = Settings.get_solo().date_to or '2017'
        if isinstance(year_to, datetime.date):
            year_to = year_to.year
            self.parameter['year[]'][1] = year_to
        self.response = requests.get(self.link, params=self.parameter, headers=self.headers)
        # print(self.response.content)
        self.parsed_body = html.fromstring(self.response.text)
示例#7
0
class SmsSender:
    # text = 'Готовы выкупить ваше авто, 90% рыночной стоимости, ' \
    #        'деньги в день обращения. 0672323060, 0932714661'
    text = Settings.get_solo().message_text

    def __init__(self):
        self.error_message = ''
        self.never_send = False
        self.msg_status = ''
        self.msg_id = ''
        self.client = Client('http://turbosms.in.ua/api/wsdl.html')
        self.auth = self.client.service.Auth(login='******',
                                             password='******')
        self.balance = self.get_balance()

    def send(self, phone):
        enable_disable_sms = Settings.get_solo().enable_disable_sms
        if enable_disable_sms:
            if self.auth == 'Вы успешно авторизировались':
                if float(self.balance):
                    return self._result(phone)
                else:
                    self.error_message = f'Ваш баланс {self.balance}'
            elif self.auth == 'Неверный логин или пароль':
                self.error_message = 'Неверный логин или пароль'
        else:
            self.never_send = True

    def _result(self, phone):
        result = self.client.service.SendSMS(sender='Top Vykup',
                                             destination=phone,
                                             text=self.text)
        if result[0] == 'Сообщения успешно отправлены':
            self.msg_status = self.get_msg_status(result[1])
            self.msg_id = result[1]
            return True
        else:
            self.error_message = result[0]

    def get_msg_status(self, sms_id):
        self.msg_status = self.client.service.GetMessageStatus(
            MessageId=sms_id)
        return self.msg_status

    def get_balance(self):
        return self.client.service.GetCreditBalance()
示例#8
0
    def start(self):
        print('Start Parse RST')
        sms = SmsSender()
        sms_enable = Settings.get_solo().enable_disable_sms
        email_enable = Settings.get_solo().enable_disable_email
        for i in range(1, 8):
            list_link_articles = Requester(i).get_link('//a[@class="rst-ocb-i-a"]/@href')
            for article_link in list_link_articles:
                print('Parse', article_link)
                page_article = Requester(link=article_link)

                id_article = self._get_id_article(page_article)

                if Collections.objects.filter(
                        id_donor__exact=id_article).exists():
                    continue

                date_article = self._get_date_article(page_article)
                if not date_article:
                    continue

                title = self._get_title(page_article)

                price, currency = self._get_price(page_article)

                name, phones = self._get_phone(page_article)
                dict_phones = {key: value for key, value in enumerate(phones)}

                description = self._get_description(page_article)

                city = self._get_location(page_article)

                if 'отсутствуют' in name:
                    continue

                if not filter_parse(title, description, price, currency, city):
                    continue

                collection = Collections.objects.create(
                    create_at=date_article,
                    donor=Donor.RST,
                    id_donor=id_article,
                    city=city,
                    title=title,
                    description=description,
                    link=article_link,
                    price=price,
                    currency=currency,
                    phones=dict_phones,
                    name=name,
                    never_send=False
                )

                if collection.sms_is_send:
                    continue

                if not email_enable:
                    self.send_email_to_admin(collection)

                if sms_enable:
                    collection.never_send = False
                    collection.save()
                    sms_status = sms.send(validate_sms_phone(collection))

                    if sms_status:
                        collection.sms_is_send = True
                        collection.save()
                        if email_enable:
                            self.send_email_to_admin(collection)
示例#9
0
    def start(self):
        print('Start Parse ICAR')
        sms = SmsSender()
        sms_enable = Settings.get_solo().enable_disable_sms
        email_enable = Settings.get_solo().enable_disable_email
        list_link = Requester().get_link(
            '//div[@class="car"]/div[@class="h"]/a/@href')
        for link_article in list_link:
            page = Requester(link=link_article)

            id_article = self._get_id_article(page)
            if not id_article:
                continue

            if Collections.objects.filter(id_donor__exact=id_article).exists():
                continue

            date_article = self._get_date_article(page)
            if not date_article:
                continue

            title = self._get_title(page)

            price, currency = self._get_price(page)

            name, phones = self._get_phone(page)
            dict_phones = {key: value for key, value in enumerate(phones)}

            description = self._get_description(page)

            city = self._get_location(page)

            if not filter_parse(title, description, price, currency, city):
                continue

            collection = Collections.objects.create(create_at=date_article,
                                                    donor=Donor.ICAR,
                                                    id_donor=id_article,
                                                    city=city,
                                                    title=title,
                                                    description=description,
                                                    link=link_article,
                                                    price=price,
                                                    currency=currency,
                                                    phones=dict_phones,
                                                    name=name,
                                                    never_send=False)

            if collection.sms_is_send:
                continue

            if not email_enable:
                self.send_email_to_admin(collection)

            if sms_enable:
                collection.never_send = False
                collection.save()
                sms_status = sms.send(validate_sms_phone(collection))

                if sms_status:
                    collection.sms_is_send = True
                    collection.save()
                    if email_enable:
                        self.send_email_to_admin(collection)
示例#10
0
    def parse_pages(self):
        sms = SmsSender()
        sms_enable = Settings.get_solo().enable_disable_sms
        email_enable = Settings.get_solo().enable_disable_email
        for article_url in self._get_list_article():

            page_article = Requester(article_url)

            stop_date, date_article = self._stop_date_article(page_article)

            if stop_date:
                break

            id_in_site = self._get_id_article(page_article)

            if Collections.objects.filter(id_donor__exact=id_in_site).exists():
                self.stop_parse += 1
                continue

            id_article = article_url.split('.')[-2].split('-')[-1]

            price, currency = self._get_price(page_article)

            phones = self._get_phone(page_article, id_article)
            dict_phones = {key: value for key, value in enumerate(phones)}

            name = self._get_name(page_article)

            description = self._get_description(page_article)

            title = self._get_title(page_article)

            city = self._get_location(page_article)

            if not filter_parse(title, description, price, currency, city):
                continue
            try:
                collection = Collections.objects.create(
                    create_at=date_article,
                    donor=Donor.OLX,
                    id_donor=id_in_site,
                    city=city,
                    title=title,
                    description=description,
                    link=article_url,
                    price=price,
                    currency=currency,
                    phones=dict_phones,
                    name=name,
                    never_send=False
                )
            except ValueError as e:
                print(str(e))
            else:
                if collection.sms_is_send:
                    continue

                if not email_enable:
                    self.send_email_to_admin(collection)

                if sms_enable:
                    collection.never_send = False
                    collection.save()
                    sms_status = sms.send(validate_sms_phone(collection))

                    if sms_status:
                        collection.sms_is_send = True
                        collection.save()
                        if email_enable:
                            self.send_email_to_admin(collection)
示例#11
0
    def start(self):
        print('Start Parse Ria')
        sms = SmsSender()
        sms_enable = Settings.get_solo().enable_disable_sms
        email_enable = Settings.get_solo().enable_disable_email
        ids = Requester(self.main_link).get_ids_article()
        collections = Collections.objects.filter(
            donor=Donor.AUTORIA).values_list('id_donor', flat=True)
        if ids:
            for id_article in ids:
                if id_article in collections:
                    continue

                data_article = Requester(
                    self.article_link(id_article)).get_json()

                all_author_articles = Requester(
                    self.author_link(data_article.get('userId')))
                if all_author_articles.response.status_code == 200:
                    if len(all_author_articles.get_json().get('result').get(
                            'search_result').get('ids')) > 1:
                        continue

                phones = [self._normailize_phone(data_article)]
                dict_phones = {key: value for key, value in enumerate(phones)}

                date_article = self._get_date_article(data_article)
                if isinstance(date_article, bool):
                    continue

                city = data_article.get('locationCityName', '')

                description = data_article.get('autoData', {}) \
                    .get('description', '')
                title = data_article.get('title', '')

                link = ''.join(
                    [self.link_site,
                     data_article.get('linkToView', '')])
                name = self._get_name(link)

                price = data_article.get('USD', '')

                if not filter_parse(title, description, price, '$', city):
                    continue

                collection = Collections.objects.create(
                    create_at=date_article,
                    donor=Donor.AUTORIA,
                    id_donor=id_article,
                    city=city,
                    title=title,
                    description=description,
                    link=link,
                    price=price,
                    currency='$',
                    phones=dict_phones,
                    name=name,
                    never_send=False)

                if collection.sms_is_send:
                    continue

                if not email_enable:
                    self.send_email_to_admin(collection)

                if sms_enable:
                    collection.never_send = False
                    collection.save()
                    sms_status = sms.send(validate_sms_phone(collection))

                    if sms_status:
                        collection.sms_is_send = True
                        collection.save()
                        if email_enable:
                            self.send_email_to_admin(collection)
示例#12
0
 def __init__(self):
     super().__init__()
     self.collections = Collections.objects.filter(
         sms_is_send=False, never_send=False).order_by('create_at')
     self.email_enable = Settings.get_solo().enable_disable_email