Форум сайта python.su
0
Здравствуйте.
Хочу узнать как можно сделать так, чтоб отправка в телеграмм была после перезаписывания файла.
При первом запуске скрипта все работает нормально: идет сверка парсинга с файлом, и если содержимое файла такое же как результат парсинга то ничего не отправляет. Однако после выхода нового объявления отправляется от 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())# и отправляет в телеграм
Отредактировано Dykat (Авг. 3, 2018 14:22:38)
Офлайн
857
Сделай не два if'а, а один if с else веткой. И выложи полный код, иначе непонятно, какой эффект даёт mains() (при каждом вызове могут получаться разные результаты, даже в пределах секунды).
Отредактировано py.user.next (Авг. 4, 2018 00:40:42)
Офлайн
0
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()
Офлайн
857
Попробуй исключить файл и проверить без него. То есть держи данные только в оперативной памяти. Вот это asd должно только из памяти браться.
Надо вообще понять, действительно ли в файле дело.
Отредактировано py.user.next (Авг. 8, 2018 01:21:44)
Офлайн