Фриланс-проекты › Рассылка по telegram с помощью telethon (python)
Рассылка по telegram с помощью telethon (python)
Задача в кратком изложении:
Необходимо написать python-скрипт с использованием библиотеки telethon, который работает в режиме пользователя (не бот) для отправки текста по списку из телефонов и username. Список задач (текст и контактные данные) на отправку получает от сервера.
Задача - это объект, который в себя включает перечень адресатов и текст для рассылки.
При просмотре адресатами отправленных сообщений скрипт информирует сервер.
Полностью рабочая серверная часть предоставляется разработчику для тестирования.
От исполнителя требуется наличие опыта, соблюдение сроков, профессионализм.
Подробнее:
Сервер принимает только POST-запросы к api.php c параметрами:
api - название метода
params - ассоциативный массив параметров вызываемого метода
"Псевдо-карта" запроса (написал для наглядности в формате JSON):
{
api:"say"
params["author"]:"Mike"
params["message"]:"Hello"
}
Все значения возвращаются сервером в формате JSON в виде объекта
При ошибке выполнения сервер возвращает {resut: false, error:"описание ошибки"}.
Если ошибок нет, то возвращается объект с единственным свойством result.
Таким образом наличие свойства error указывает на ошибку выполнения.
В описательной части запросы(вызовы) я буду указывать так:
request(api, author, message)
то есть первый аргумент функции - это будет название метода,
а все последующие аргументы - это параметры метода
Что касается возвращаемых значений, то в ТЗ ниже указано значение свойства "result".
API для взаимодействия с сервером:
request("robot.task.list", robot_id)
- возвращает массив состоящий из названий задач
параметры:
robot_id - это константа, идентификатор скрипта (о нем будет позже)
пример возвращаемых значений:
[]
или
["task_dkshdfhdks", "f8f8f8f"]
request("robot.task.entities.list", robot_id, task_name)
- возвращает массив строк состоящий из телефонов и username (как с собачкой так и без нее).
параметры:
robot_id - идентификатор скрипта
task_name - название задачи
пример:
request("robot.task.entities.list", "robot_12345", "task_dkshdfhdks")
возвращает:
["+799......7766", "user939393", "380.....00", "alex20020000"]
request("robot.task.message.get", robot_id, task_name)
- возвращает текст сообщения для рассылки для указанного task_name.
параметры:
robot_id - идентификатор скрипта
task_name - название задачи
пример:
request("robot.task.message.get", "robot_12345", "task_dkshdfhdks")
возвращает:
"Hello!"
request("robot.task.messages.status.set", robot_id, task_name, status, entities)
- отправляет на сервер данные о просмотренных сообщениях адресатами по задаче task_name.
параметры:
robot_id - идентификатор скрипта
task_name - название задачи
status - статус сообщения
если status = 0, то сообщение не отправлено
если status = 1, то сообщение отправлено, но не просмотрено
если status = 2, то сообщение просмотрено
entities - через запятую адресаты, которым было доставлено сообщение
пример:
request("robot.task.messages.status.set", "robot_12345", "task_dkshdfhdks", "2", "799.....66,user939393")
возвращает:
true - метод успешно выполнен
false - ошибка добавления данных
request("robot.log", robot_id, task_name, message_text, message_type)
- отправляет на сервер текстовые данные, связанные с выполнением задачи task_name.
robot_id - идентификатор скрипта
task_name - название задачи
message_text - содержание лога
message_type - принимает значения error или success
возвращает:
true - метод успешно выполнен
false - ошибка добавления данных
Для тестирования, а именно создания задач и управления ими предлагается использовать такие методы:
request("robot.task.create", robot_id, task_message, entities)
- создает задачу
robot_id - идентификатор скрипта
task_message - текст рассылки
entities - через запятую адресаты, которым было доставлено сообщение
возвращает
имя задачи, т.н. task_name, который вы можете получить через "robot.task.list".
request("robot.task.delete", robot_id, task_name)
- удаляет задачу с именем task_name.
robot_id - идентификатор скрипта
task_message - текст рассылки
entities - через запятую адресаты, которым было доставлено сообщение
возвращает:
true - метод успешно выполнен
false - ошибка добавления данных
ТЗ:
Скрипт использует sqlite для хранения данных
В БД 2 таблицы: tasks и entities. Таблицу расширять вы можете по своему усмотрению.
tasks - это таблица, которая содержит актуальные для робота задачи
столбцы:
id (auto_increment), task_name (32-символьная строка), task_message
таблица с entities
id task_id (идентификатор задачи), entity (64 символьная строка), status (1 байт, 0-255)
если status = 0, то сообщение не отправлено
если status = 1, то сообщение отправлено, но не просмотрено
если status = 2, то сообщение просмотрено
До запуска скрипта необходимо создать файл config.ini с параметром robot_id="robot_12345" рядом со скриптом.
После запуска скрипта осуществляется проверка, существует ли config.ini, после чего скрипт считывает значение параметра robot_id.
Если файл не существует или отсутствует значение параметра, то необходимо вывести сообщение об ошибке и окончить работу скрипта.
Далее осуществляется авторизация от имени пользователя.
Если авторизация не пройдена, то скрипт завершает работу.
После авторизации
Шаг 1. Скрипт получает список актуальных задач ("robot.task.list").
После чего надо сравнить список задач, полученных от сервера с тем, что есть базе.
Если исчезло одно из ранее известных task_name, то необходимо удалить все entities, связанных с этой задачей
Если появилось новое имя, то нужно получить список entities "robot.task.entities.list", а также получить текст сообщения для рассылки "robot.task.message.get". Очевидно, что все пишем в БД. Для новых задач можно завести в tasks колонку status, в которой будет отражаться полностью ли отработана задача.
Если ничего не изменилось в перечне имен задач, то ничего не делаем.
Шаг 2
Если в entities есть ранее неизвестный номер телефона, то добавляем в контактную книгу telegram
Шаг 3
Отправка текста каждому идентификатору (entity)
Шаг 4
Через временной промежуток проверяет статусы отправленных сообщений на факт просмотра
Все изменения статусов необходимо объединить и отправить на сервер. В качестве решения этой задачи можно создать дополнительную колонку previous_status для таблицы entities. На этом шаге отправляют данные об отправленных, но просмотренных, а также отправленных и просмотренных. Если статус сообщения не изменился с момента последней проверки, то очевидно, что учитывать их не надо.
Шаг 5
После того как сообщение просмотрено, и данные об этом отправлены на сервер (получен ответ true от сервера), то эти entities из таблицы можно удалить.
Важно чтобы разработчик учитывал интервалы отправки сообщений, ловил ошибки, лимиты и т.п. Код должен работать стабильно, покрыт обработчиками ошибок, логи должны уходить на сервер.
Шаг 6
Переходим к следующему task_name при его наличии.
Шаг 7
Через временной промежуток проверяем поступление новых задач.
Шаги могут быть изменены (по согласованию со мной). Мне главное результат.
Пытался расписать как можно подробнее, надеюсь, что все понятно.
Сервер уже написан, от разработчика только клиент на Python.
-
ставка скрыта заказчиком
-
ставка скрыта заказчиком
-
Задайте ваш вопрос заказчику