Яндекс.деньги расщедрились.
Кому нужно – забирайте
VSKLLM48YJWKUHST
ЗЫ Больше нет и не будет
Яндекс.деньги расщедрились.
Кому нужно – забирайте
VSKLLM48YJWKUHST
ЗЫ Больше нет и не будет
Итак, пока еще что-то помню, стоит рассказать о небольшом проекте по записи всех камер своего города во время выборов Президента России в 2012 году. Как всем известно, в декабре 2011 года Владимир Путин предложил оборудовать все избирательные участки страны веб-камерами, на что была выделена весьма большая сумма. Ростелеком, выигравший тендер, в короткие сроки смог реализовать данный проект и в день выборов обеспечить доступ к камер. Мне стало интересно реализовать систему, которая бы смогла записать видео с максимального количества камер.
Итак, перейдем к собственно технической части, благо она весьма примитивна: примерно каждые 15 секунд по определенному адресу обновлялся плейлист, в котором были перечислены ссылки на последние 4 чанка видео с камеры. Фактически вся задача сводилась к тому, чтобы своевременно обновлять кучу плейлистов и скачивать кучу чанков.
В исходнике веб-страницы был найден следующий кусочек кода:
var caches = ['188.254.112.50','188.254.112.51','188.254.112.52'];
var cache = caches[Math.round(Math.random() * (caches.length-1))];
var url = 'http://' + cache + '/master.m3u8?cid=' + uuid;
url это адрес того самого плейлиста.
cache – это адрес сервера, с которого можно было скачать чанк. На каждую камеру приходилось от 2 до 4 таких серверов.
uuid – это уникальный хеш камеры.
Все эти данные можно было получить простым запросом в Firebug вида CorePlayer.url. Вернется что-то вроде
http://188-254-112-53.webvybory2012.ru/master.m3u8?cid=db58e3e2-4a69-11e1-8a16-001999c762e1
После этого каждые 15 секунд мы качаем плейлист, выдираем оттуда ссылки на чанки и скачиваем и складываем их в папки. Единственным опасением была обещанная капча, для противодействия ей был заранее проплачен аккаунт на antigate.com, но капчи так и не появилось.
Код писался в сверхсжатые сроки, поэтому по прошествии времени даже у меня вызывает ужас отдельными элементами быдлокода, но дабы не искажать историю, выложу как было =)
import urllib
import os
from time import strftime, localtime, sleep
import socket
import threading
#Адрес сервера syslog, куда сыпалась вся статистика
syslog_server='127.0.0.1'
syslog_port=514
#Корневая папка, куда будем складировать чанки
directory='dumps'
#Массив с id камер, их хешами и списком серверов, откуда можно тянуть чанки
cams=[
['563-1', '3b0ae812-446b-11e1-bef9-f0def1c11a02', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['563-2', '3b101a6c-446b-11e1-bef9-f0def1c11a02', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['564-1', 'e8acb2b8-440a-11e1-b2a7-f0def1c0e5b4', ['188.254.112.34', '188.254.112.36', '188.254.112.35']],
['564-2', 'e8b1e6ca-440a-11e1-b2a7-f0def1c0e5b4', ['188.254.112.34', '188.254.112.36', '188.254.112.69']],
['565-1', '8796a3d8-472c-11e1-bd36-e89a8ffc5cfc', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['565-2', '87918394-472c-11e1-bd36-e89a8ffc5cfc', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['566-1', '9abc638a-472c-11e1-ac88-e89a8ffc5dc2', ['188.254.112.66', '188.254.112.67', '188.254.112.68', '188.254.112.68']],
['566-2', '9ac181f8-472c-11e1-ac88-e89a8ffc5dc2', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['567-1', 'e08d29e0-4479-11e1-b61e-f0def1c2234b', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['567-2', 'e087ff24-4479-11e1-b61e-f0def1c2234b', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['568-1', '9da63436-472c-11e1-b1f3-e89a8ffc5d76', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['568-2', '9da11906-472c-11e1-b1f3-e89a8ffc5d76', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['570-1', 'b7277f66-43dd-11e1-9520-f0def1c0f02c', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.50']],
['570-2', 'b7225608-43dd-11e1-9520-f0def1c0f02c', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.52']],
['571-1', '50370306-4529-11e1-a20b-047d7b4cabc6', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['571-2', '503c49ce-4529-11e1-a20b-047d7b4cabc6', ['188.254.112.82', '188.254.112.83', '188.254.112.84', '188.254.112.84']],
['572-1', '2c390f76-446b-11e1-9968-f0def1c08b1e', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['572-2', '2c3e422a-446b-11e1-9968-f0def1c08b1e', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['573-1', 'f3cb78d0-4475-11e1-a227-f0def1c0e409', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['573-2', 'f3c64d24-4475-11e1-a227-f0def1c0e409', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['574-1', '3e8f2cb4-446b-11e1-8d18-f0def1c119ae', ['188.254.112.66', '188.254.112.67', '188.254.112.68', '188.254.112.68']],
['574-2', '3e89f938-446b-11e1-8d18-f0def1c119ae', ['188.254.112.66', '188.254.112.67', '188.254.112.68', '188.254.112.68']],
['575-1', 'daf42c2c-446f-11e1-b332-f0def1c10a4b', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['575-2', 'daf99fea-446f-11e1-b332-f0def1c10a4b', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['576-1', '94b181aa-472c-11e1-b9b9-047d7b18c018', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['576-2', '94b6b152-472c-11e1-b9b9-047d7b18c018', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['577-1', 'e1fc53ec-440a-11e1-80c7-f0def1c0fcf1', ['188.254.112.50', '188.254.112.51', '188.254.112.52', '188.254.112.52']],
['577-2', 'e1f71efe-440a-11e1-80c7-f0def1c0fcf1', ['188.254.112.50', '188.254.112.51', '188.254.112.52']],
['578-1', '237803fa-4476-11e1-bf8b-f0def1c087bc', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['578-2', '237d305a-4476-11e1-bf8b-f0def1c087bc', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['579-1', '0b53a996-4476-11e1-8844-f0def1c0de54', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['579-2', '0b5911d8-4476-11e1-8844-f0def1c0de54', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['580-1', '90fcf6ae-43ec-11e1-badd-f0def1c0f702', ['188.254.116.2', '188.254.116.3', '188.254.116.4', '188.254.112.20']],
['580-2', '91021db4-43ec-11e1-badd-f0def1c0f702', ['188.254.116.2', '188.254.116.3', '188.254.116.4', '188.254.112.19']],
['581-1', '99ce635a-4471-11e1-8a4e-f0def1c29212', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['581-2', '99c8ff1e-4471-11e1-8a4e-f0def1c29212', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['582-1', 'd1148a7e-4471-11e1-99dd-f0def1c12c11', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['582-2', 'd119b648-4471-11e1-99dd-f0def1c12c11', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['583-1', '8fef7ee2-472c-11e1-892c-047d7b2d5d2e', ['188.254.112.18', '188.254.112.19', '188.254.112.20', '188.254.112.20']],
['583-2', '8fea35e0-472c-11e1-892c-047d7b2d5d2e', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['584-1', 'ee13424c-4475-11e1-abb2-f0def1c0e538', ['188.254.112.34', '188.254.112.36', '188.254.112.36']],
['584-2', 'ee18b04c-4475-11e1-abb2-f0def1c0e538', ['188.254.112.34', '188.254.112.36', '188.254.112.35']],
['585-1', '9071c42e-472c-11e1-9365-047d7b4cb8d5', ['188.254.112.34', '188.254.112.36', '188.254.112.36']],
['585-2', '9076ed28-472c-11e1-9365-047d7b4cb8d5', ['188.254.112.34', '188.254.112.36', '188.254.112.35']],
['586-1', '7b67ebca-448a-11e1-8ce4-f0def1c23229', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['586-2', '7b6d14f6-448a-11e1-8ce4-f0def1c23229', ['188.254.112.66', '188.254.112.67', '188.254.112.68', '188.254.112.68']],
['587-1', '4ae7a8da-4473-11e1-a441-f0def1c096b5', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['587-2', '4ae279f0-4473-11e1-a441-f0def1c096b5', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['589-1', 'b44861a2-43dd-11e1-a4d6-f0def1c0e094', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['589-2', 'b44d9a1e-43dd-11e1-a4d6-f0def1c0e094', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['590-1', 'dee269a2-4479-11e1-bc33-f0def1c11ff0', ['188.254.112.34', '188.254.112.36', '188.254.112.36']],
['590-2', 'dee7999a-4479-11e1-bc33-f0def1c11ff0', ['188.254.112.34', '188.254.112.36']],
['591-1', 'dcb435d4-446f-11e1-8051-f0def1c0f3b1', ['188.254.112.50', '188.254.112.51', '188.254.112.52']],
['591-2', 'dcb967ac-446f-11e1-8051-f0def1c0f3b1', ['188.254.112.50', '188.254.112.51', '188.254.112.52']],
['592-1', 'bc25adb2-43c9-11e1-9306-f0def1c0ea6d', ['188.254.112.18', '188.254.112.19', '188.254.112.20', '188.254.112.20']],
['592-2', 'bc2adee0-43c9-11e1-9306-f0def1c0ea6d', ['188.254.112.18', '188.254.112.19', '188.254.112.20', '188.254.112.20']],
['593-1', 'd242bb98-446f-11e1-a322-f0def1c0f8ff', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['593-2', 'd23d83c6-446f-11e1-a322-f0def1c0f8ff', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['594-1', '8704e56a-4489-11e1-a6bb-f0def1c0f4b6', ['188.254.112.50', '188.254.112.51', '188.254.112.52', '188.254.112.52']],
['594-2', '86ffc008-4489-11e1-a6bb-f0def1c0f4b6', ['188.254.112.50', '188.254.112.51', '188.254.112.52']],
['595-1', 'd18b9c20-43ab-11e1-8a66-f0def1c0f1d7', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['595-2', 'd1866e26-43ab-11e1-8a66-f0def1c0f1d7', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['596-1', '83d1ad2c-43b9-11e1-8c21-f0def1c10519', ['188.254.112.18', '188.254.112.19', '188.254.112.20', '188.254.112.20']],
['596-2', '83cc2e38-43b9-11e1-8c21-f0def1c10519', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['597-1', 'e24a98f6-446c-11e1-b203-f0def1c0e55d', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['597-2', 'e24561ba-446c-11e1-b203-f0def1c0e55d', ['188.254.112.18', '188.254.112.19', '188.254.112.20', '188.254.112.20']],
['598-1', '8bb110f2-472c-11e1-8d65-047d7b18bff0', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['598-2', '8bb63690-472c-11e1-8d65-047d7b18bff0', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['599-1', 'f094ee4e-4475-11e1-a466-f0def1c0fe3f', ['188.254.112.34', '188.254.112.36', '188.254.112.36']],
['599-2', 'f09a1c52-4475-11e1-a466-f0def1c0fe3f', ['188.254.112.34', '188.254.112.36', '188.254.112.35']],
['600-1', '7de4411a-4489-11e1-a3bd-f0def1c0fea8', ['188.254.112.34', '188.254.112.36', '188.254.112.35']],
['600-2', '7de9764e-4489-11e1-a3bd-f0def1c0fea8', ['188.254.112.34', '188.254.112.36', '188.254.112.36']],
['601-1', 'be2455dc-43dd-11e1-9f85-f0def1c0f08d', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['601-2', 'be1f212a-43dd-11e1-9f85-f0def1c0f08d', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['602-1', '5fc25d12-4415-11e1-a327-f0def1c0e521', ['188.254.112.66', '188.254.112.67', '188.254.112.68', '188.254.112.68']],
['602-2', '5fc7831e-4415-11e1-a327-f0def1c0e521', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['603-1', '583bc9bc-4473-11e1-a878-f0def1c09a5d', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['603-2', '5840f14e-4473-11e1-a878-f0def1c09a5d', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['604-1', 'deff1bba-446f-11e1-a309-f0def1c10b59', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['604-2', 'def9f536-446f-11e1-a309-f0def1c10b59', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['605-1', '9815c09a-4489-11e1-a0b9-f0def1c0ff60', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['605-2', '981ae7f0-4489-11e1-a0b9-f0def1c0ff60', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['606-1', 'ce51fa76-446f-11e1-bb85-f0def1c09684', ['188.254.112.34', '188.254.112.36', '188.254.112.35']],
['606-2', 'ce5727d0-446f-11e1-bb85-f0def1c09684', ['188.254.112.34', '188.254.112.36', '188.254.112.36']],
['607-1', 'e01c4778-446c-11e1-91e7-f0def1c0f5c9', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['607-2', 'e01702f4-446c-11e1-91e7-f0def1c0f5c9', ['188.254.112.18', '188.254.112.19', '188.254.112.20', '188.254.112.20']],
['608-1', '0048f59c-4476-11e1-a6bb-f0def1c0ff8b', ['188.254.112.66', '188.254.112.67', '188.254.112.68', '188.254.112.68']],
['608-2', '0043cf40-4476-11e1-a6bb-f0def1c0ff8b', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['609-1', 'd10c0810-446f-11e1-91ca-f0def1c0ea2b', ['188.254.112.50', '188.254.112.51', '188.254.112.52']],
['609-2', 'd1113114-446f-11e1-91ca-f0def1c0ea2b', ['188.254.112.50', '188.254.112.51', '188.254.112.52']],
['610-1', 'f26d5f72-4479-11e1-8a22-f0def1c122d1', ['188.254.112.18', '188.254.112.19', '188.254.112.20', '188.254.112.20']],
['610-2', 'f26830ba-4479-11e1-8a22-f0def1c122d1', ['188.254.112.18', '188.254.112.19', '188.254.112.20']],
['611-1', 'd86e78d2-453b-11e1-8c49-047d7b3e6407', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['611-2', 'd87398c6-453b-11e1-8c49-047d7b3e6407', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['612-1', 'bae2cba6-43c9-11e1-b466-f0def1c0e89f', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['612-2', 'bae7fa7c-43c9-11e1-b466-f0def1c0e89f', ['188.254.112.2', '188.254.112.3', '188.254.112.4', '188.254.112.4']],
['613-1', 'be06ff46-43c9-11e1-a4c6-f0def1c0fcba', ['188.254.112.34', '188.254.112.36', '188.254.112.36']],
['613-2', 'be0c354c-43c9-11e1-a4c6-f0def1c0fcba', ['188.254.112.34', '188.254.112.36', '188.254.112.36']],
['614-1', '4a2a114e-4473-11e1-9b09-f0def1c22294', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['614-2', '4a24ec8c-4473-11e1-9b09-f0def1c22294', ['188.254.112.2', '188.254.112.3', '188.254.112.4']],
['615-1', 'c9061418-43c9-11e1-8dd6-f0def1c0fc08', ['188.254.112.82', '188.254.112.83', '188.254.112.84']],
['615-2', 'c900e060-43c9-11e1-8dd6-f0def1c0fc08', ['188.254.112.82', '188.254.112.83', '188.254.112.84', '188.254.112.84']],
['616-1', 'dc0e228c-446c-11e1-bd8c-f0def1c0e8e2', ['188.254.112.50', '188.254.112.51', '188.254.112.52']],
['616-2', 'dc1351e4-446c-11e1-bd8c-f0def1c0e8e2', ['188.254.112.50', '188.254.112.51', '188.254.112.52']],
['617-1', 'b87b4c12-43c9-11e1-935e-f0def1c0ecca', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['617-2', 'b8762200-43c9-11e1-935e-f0def1c0ecca', ['188.254.112.66', '188.254.112.67', '188.254.112.68']],
['618-1', '8b7c6dac-4489-11e1-ac86-f0def1c22c70', ['188.254.112.34','188.254.112.35','188.254.112.36']],
['618-2', '8b819e44-4489-11e1-ac86-f0def1c22c70', ['188.254.112.34','188.254.112.35','188.254.112.36']]
]
#обозначения уровней для сислога
LEVEL = {
'emerg': 0, 'alert':1, 'crit': 2, 'err': 3,
'warning': 4, 'notice': 5, 'info': 6, 'debug': 7
}
#!!!!!!!!!!!!!!!!!!!!!!!!!!CorePlayer.url + '|'+d[1]
#процедурка, пишущая в сислог. Копирайты потеряны, сорри =(
def syslog(message, level=LEVEL['notice'], host=syslog_server, port=syslog_port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = '%s' % (level + 24, message)
sock.sendto(data, (host, port))
sock.close()
#Основная процедура
def cam_rip(num,hash,servers):
syslog('Recording cam %s at %s'%(hash, num), level=LEVEL['info'])
try:
os.mkdir('./%s/%s'%(directory,num))
except:
pass
#Запускаем бесконечный цикл
while 1:
try:
server=servers[0]
#Скачиваем текущий плейлист
page = urllib.urlopen("http://%s/variant.m3u8?cid=%s&var=orig"%(server,hash)).read()
#Если плейлист кошерен, выдираем ссылки на отдельные чанки и скачиваем их
if '/segment' in page:
for i in page.split('\n'):
if '/segment' in i:
filename=strftime("%d-%b-%H-%M-%S", localtime(int(i[-13:-3])))
f=open('./%s/%s/%s.ts'%(directory,num,filename),'wb')
# syslog('Chunk %s saved'%(filename), level=LEVEL['notice'])
f.write(urllib.urlopen("http://%s%s"%(server,i)).read())
f.close()
else:
#В противном случае ругаемся в сислог и делаем ротацию сервера
syslog('No signal!Rotating server on cam %s at %s'%(hash,num), level=LEVEL['err'])
servers.append(servers[0])
del servers[0]
sleep(60)
except Exception,e:
syslog('Error on cam %s: %s'%(hash,e), level=LEVEL['err'])
servers.append(servers[0])
del servers[0]
try:
os.mkdir(directory)
except:
pass
#Запускаем кучу потоков для каждой из камер
for i in cams:
threading.Thread(target=cam_rip, kwargs={"num": i[0],"hash": i[1],"servers": i[2]}).start()
sleep(1)
syslog('System started.', level=LEVEL['notice'])
Результатом работы в течение всего дня выборов стала папочка весом в 120 гигабайт, содержащая очень много 15-секундных файликов. Поскольку так смотреть их не очень удобно, было решено склеить их в большое 20-часовое видео и выложить в интернеты. Скачать их всех можно вот здесь
По многочисленным просьбам реализовал возможность указания требуемого сетевого интерфейса в строке запуска программы. Например, написав в командной строке softmvr.exe 2 вы запустите SoftMVR с выбранным сетевым интерфейсом №2.
В будущем также планируется реализовать таки сворачивание консольного окошка в трей (ага, мне оно тоже надоело) и возможность вручную указать тег влана.
Брать здесь
Продолжаем пытаться смотреть IPTV от Росинтела без капиталовложений =)
SoftMVR