CoderCastrov logo
CoderCastrov
Интернет вещей

Личный центр уведомлений

Личный центр уведомлений
просмотров
5 мин чтение
#Интернет вещей

Давным-давно один из моих друзей попросил меня проверить эту классную идею, которая представляла собой небольшое устройство отображения, которое "обновляет вас по всем важным для вас вещам". Каким-то образом идея не смогла привлечь финансирование и в конечном итоге была отменена.


Идея

Хотя мне не удалось создать аппаратную часть для такой идеи (не стесняйтесь связаться со мной, если у вас есть такой уровень навыков), но я попытался реализовать программную часть этой идеи. Я попытался создать централизованный центр, который предоставляет мне количество непрочитанных уведомлений на различных социальных платформах (WhatsApp, Skype, Facebook, Youtube). Центр будет предоставлять только количество непрочитанных уведомлений, а не непрочитанные сообщения, потому что идея заключается только в том, чтобы иметь краткое резюме вещей, а не подробный просмотр. Вам не нужно открывать телефон, чтобы проверить, не пропустили ли вы сообщение. Если вы заметили количество, всегда можно воспользоваться мобильным телефоном, чтобы посмотреть сообщение.


В настоящее время доступные варианты на рынке

Когда я пытался найти информацию в Google, я не нашел ни одной утилиты или приложения, которые бы могли выполнять эту задачу. Это стало еще одной причиной для создания такой утилиты. Первая идея, которая пришла мне в голову, заключалась в том, чтобы обратиться к веб-сервису, скажем, Facebook, и получить количество уведомлений. Аналогично, я бы обратился к веб-сервису WhatsApp и получил бы свое количество. К сожалению, для этих платформ такие сервисы не предоставляются (раньше у Facebook был такой сервис, но сейчас он прекращен). Slack очень хорошо предоставляет такие полезные веб-сервисы для себя, и я думаю, что другие социальные платформы должны серьезно обратить на это внимание. Кроме того, может быть очень трудно получить хорошее понимание веб-сервисов, предоставляемых каждой социальной медиа-платформой, и, кроме того, они могут быть платными или иметь некоторые ограничения на количество запросов в день.

Реализация

Когда ничего не подходит под руку, всегда есть возможность использовать парсинг веб-страниц. Да, и читая слово "парсинг", большинство из вас уже догадываются, что будет дальше в этой статье. Да, мы будем использовать фреймворк Selenium для Python, открывать параллельные экземпляры браузера для каждой социальной сети и выполнять парсинг. Чтобы добавить удобство, мы создадим микросервис на основе Flask, чтобы вы могли обратиться к сервису, и он вернет количество непрочитанных уведомлений для каждой социальной сети. Я лично выполнил реализацию на системе Windows, но вы можете попробовать, если то же самое работает на системах Linux или Raspberry (они могут не поддерживать инструменты автоматизации в режиме head).

from selenium import webdriver
import time
import threading
from flask import Flask, request, jsonify, make_response
  1. Создайте экземпляр драйвера для каждой социальной сети
fbDriver = webdriver.Chrome("chromedriver")
fbDriver.get("https://www.facebook.com/")
waDriver = webdriver.Chrome("chromedriver")
waDriver.get("https://web.whatsapp.com/")
ytDriver = webdriver.Chrome("chromedriver")
ytDriver.get("https://www.youtube.com/")
  1. Определите глобальные переменные, которые содержат количество уведомлений для каждой социальной сети. Зачем глобальные? Чтобы парсинг (установщик переменной) и микросервис Flask (получатель переменной для конечного пользователя) использовали одну и ту же переменную и не было расхождений в значениях.
fbNotifications=0   #для уведомлений Facebook
msgNotifications=0  #для уведомлений Messenger
waNotifications=0   #для уведомлений WhatsApp
ytNotifications=0   #для уведомлений YouTube
  1. Создайте обработчик для каждой социальной сети, где происходит настоящий парсинг. Обновите глобальную переменную внутри функции. Вот пример функции парсинга для Facebook:
def fbCountManager():
    global fbNotifications
    global msgNotifications
    while True:
        try:
            fbNotifications=fbDriver.find_element_by_id('notificationsCountValue')
            msgNotifications=fbDriver.find_element_by_id('mercurymessagesCountValue')
        except:
            fbNotifications=0
            msgNotifications=0

        fbDriver.refresh()
        time.sleep(20)

Мы хотим получить значения этих 2 значков из пользовательского интерфейса (первый значок дает количество уведомлений для Messenger, а второй - для уведомлений Facebook). Я не буду обсуждать, как я определил идентификаторы элементов, но вы можете ознакомиться с синтаксисом и учебниками Selenium, чтобы узнать больше об этом.

Вот похожая функция для WhatsApp:

def waCountManager():
    global waNotifications
    while True:
        try:
            waNotifications=0
            allMsgs=waDriver.find_elements_by_css_selector('.OUeyt')
            
            for msg in allMsgs: 
                waNotifications=waNotifications+int(msg.text) 
                
        except:
            
            waNotifications=0

        waDriver.refresh()
        time.sleep(20)

Обратите внимание, что мы не храним никакие учетные данные для какой-либо платформы в нашем коде Python из-за проблем безопасности. Поэтому вам придется выполнить вход в каждую платформу вручную один раз. Хотя этот процесс входа также можно автоматизировать с помощью Selenium, но я рекомендую не подвергать свои учетные данные риску в обычном скрипте.

  1. Вы можете аналогичным образом создать функции парсинга для каждой социальной сети. Затем вам нужно создать и запустить параллельные потоки для каждой платформы. Вот как это делается. Параметр target принимает функцию, которую должен вызывать этот поток.
fbThread = threading.Thread(target=fbCountManager)
fbThread.start()

waThread = threading.Thread(target=waCountManager)
waThread.start()

ytThread = threading.Thread(target=ytCountManager)
ytThread.start()
  1. Финальная часть - создание микросервиса на основе Flask, чтобы конечный пользователь (то есть ВЫ) обратился к сервису и получил суммированный ответ, содержащий количество уведомлений для каждой социальной сети. Мне очень нравится концепция микросервиса (пользователю не важно, как получаются эти данные, он просто обращается к сервису и получает результаты. Он счастлив)
app=Flask(__name__)

@app.route('/getcounts/', methods=['GET'])
def respond():
    response_body = {
            "fbNotifications":fbNotifications,
            "msgNotifications": msgNotifications,
            "waNotifications": waNotifications,
            "ytNotifications": ytNotifications
        }

    res = make_response(jsonify(response_body), 200)
    return res


@app.route('/')
def index():
    getCoronaCounts()
    return '<h1>Приложение уведомлений</h1>'

if __name__ == '__main__':
    # Параметр threaded позволяет использовать несколько экземпляров для поддержки доступа нескольких пользователей
    app.run(threaded=True, port=5000)

Обратите внимание, как мы используем глобальные переменные, которые мы определили ранее. Я знаю, что я мог бы сделать лучше и добавить некоторую безопасность или еще более интересные функции. Но цель была создать быстрое решение. Но теперь, когда вы знаете идею, у вас всегда есть возможность для улучшения.

  1. Все готово, давайте попробуем протестировать, какой ответ возвращает этот микросервис. Сервис работает на порту 5000, который мы определили в последней строке.
Ответ от конечной точки, основанной на Flask

Что дальше

Если вы завершили создание утилиты или хаба, у вас есть следующие идеи для использования этой утилиты (я сам ничего из этого не делал, поэтому буду рад, если вы поделитесь ими со мной)


Условия использования

Я хотел бы ясно указать, что эта утилита или хаб предназначены только для вашего личного использования. Как вы ясно видели, здесь нет дополнительной защиты, поэтому используйте ее очень осторожно. Также обратитесь к условиям использования сайта, с которого вы собираете данные, так как некоторые веб-сайты запрещают парсинг.