Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 3, 2018 14:22:00

Dykat
Зарегистрирован: 2018-07-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

последовательность действий

Здравствуйте.
Хочу узнать как можно сделать так, чтоб отправка в телеграмм была после перезаписывания файла.
При первом запуске скрипта все работает нормально: идет сверка парсинга с файлом, и если содержимое файла такое же как результат парсинга то ничего не отправляет. Однако после выхода нового объявления отправляется от 2 до 10 одинаковых сообщений в телеграм(я так понимаю изза того что не успивает перезаписать файл) после чего перестает отправлять и ждет нового сообщения. Потом повторяется то же самое:

     return result_list[1]# сдесь сохраняется результат парсинга
    
#отправка в телеграм с веб хуком   
@app.route('/',methods=['POST', 'GET'])
def index():
    while True:
        if request.method == 'POST':
            r = request.get_json()
            chat_id = r['message']['chat']['id']
            message = r['message']['text']
            
            file = open('new_id.txt','r')# открываем файл в режиме чтения
            asd = file.read()# сохраняем содержимое в переменную
            file.close()
            if mains() == asd:# если результат парсинга совпадает с содержимым файла
                None
            
            if mains() != asd: # если не совпадает      
                file = open('new_id.txt','w')# то перезаписывает файл 
                file.write(mains()) # с новым результатом парсинга
                file.close()
                send_message(chat_id, text = mains())# и отправляет в телеграм
Прошу подсказать, в чем ошибка и что нужно исправить , чтоб новое сообщение приходило только 1 раз

Отредактировано Dykat (Авг. 3, 2018 14:22:38)

Офлайн

#2 Авг. 4, 2018 00:39:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

последовательность действий

Сделай не два if'а, а один if с else веткой. И выложи полный код, иначе непонятно, какой эффект даёт mains() (при каждом вызове могут получаться разные результаты, даже в пределах секунды).



Отредактировано py.user.next (Авг. 4, 2018 00:40:42)

Офлайн

#3 Авг. 7, 2018 14:47:19

Dykat
Зарегистрирован: 2018-07-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

последовательность действий

py.user.next
Сделай не два if'а, а один if с else веткой. И выложи полный код, иначе непонятно, какой эффект даёт mains() (при каждом вызове могут получаться разные результаты, даже в пределах секунды).
 from flask import Flask
from flask import request
from flask import jsonify
import requests
import json
from datetime import datetime
from bs4 import BeautifulSoup
from time import sleep
from flask_sslify import SSLify
app = Flask(__name__)
sslify = SSLify(app)
URL = 'https://api.telegram.org/bot672241145:AAFPHlsPN8RHhyGBwZZbGvMI7vZUDts6agE/'
def write_json(data, filename='answer.json'):
    with open('answer.json','w') as f:
        json.dump(data,f,indent=2,ensure_ascii=False)
def send_message(chat_id,text='Подождите секунду'):
    url = URL + 'sendMessage'
    answer = {'chat_id': chat_id,'text': text}
    r = requests.post(url, json = answer)
    return r.json()
def get_html(urls):
    r = requests.get(urls)
    return r.text
def get_all_links(html):
     #блок который парсим
    soup = BeautifulSoup(html, 'lxml')
    divs = soup.find('div', class_='list_ads list_ads_type_line')
    divs = soup.find_all('div',class_='list_ads__info_container')
    links = []
    # теги, потом изменю или добавлю дополнения
    for div in divs:
        a = div.find('a').get('href')
        b = div.find('a').text.strip()        
        link = a # a.strip('.')  +'\n '        
        links.append(link)                
    return links
    
def mains():
    start = datetime.now()  # время
    urls = 'https://www.kufar.by/%D0%BC%D0%B8%D0%BD%D1%81%D0%BA_%D0%B3%D0%BE%D1%80%D0%BE%D0%B4/'
    all_links = get_all_links(get_html(urls)) 
    result_list = []
    for i in all_links:
        result_list.append (i)
    return result_list[1]# сдесь сохраняется результат парсинга
    
#отправка в телеграм с веб хуком   
@app.route('/',methods=['POST', 'GET'])
def index():
    while True:
        if request.method == 'POST':
            r = request.get_json()
            chat_id = r['message']['chat']['id']
            message = r['message']['text']   
            file = open('new_id.txt','r')# открываем файл в режиме чтения
            asd = file.read()# сохраняем содержимое в переменную
            file.close()
            if mains() != asd:# если результат парсинга совпадает с содержимым файла
                
                file = open('new_id.txt','w')# то перезаписывает файл
                file.write(mains()) # с новым результатом парсинг             
                file.close()
                
                send_message(chat_id, text = mains())# и отправляет в телеграм
            else:        
                None
                
                
             
    return mains()
#https://api.telegram.org/bot672241145:AAFPHlsPN8RHhyGBwZZbGvMI7vZUDts6agE/setWebhook?url=https://441717c9.ngrok.io
#https://api.telegram.org/bot672241145:AAFPHlsPN8RHhyGBwZZbGvMI7vZUDts6agE/setWebhook?url=https://dykat90.pythonanywhere.com/
if __name__ == '__main__':
    
    app.run()

Офлайн

#4 Авг. 8, 2018 01:21:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

последовательность действий

Попробуй исключить файл и проверить без него. То есть держи данные только в оперативной памяти. Вот это asd должно только из памяти браться.

Надо вообще понять, действительно ли в файле дело.



Отредактировано py.user.next (Авг. 8, 2018 01:21:44)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version