Найти в Дзене
Oracle APEX

Новостное агентство подменяет ссылки на скандальные статьи

Обнаружено, что некое уважаемое новостное агентство подменяет ссылки на скандальные статьи в инструментах "поделиться". Мы решили проверить, сложно ли это.

Суть в следующем. Некое уважаемое новостное агентство публикует новости. Всё понятно. Некоторые новости скандальные. Можно предположить, что данное агентство получило рекомендацию тормозить обмен пользователей скандальными новостями; во всяком случае, с завидным постоянством при попытке использовать инструмент для передачи новости (sharing) замечено, что нейтральная новость проходит правильно, а вместо скандальной новости передается ссылка на какую-то из ближних нейтральных. Мы решили проверить, сложно ли сделать такой механизм.

Политика такая:

  • Если новость нейтральная, то пусть ей делятся сколько хотят.
  • Если новость скандальная, то постараемся воспрепятствовать обмену ей. Но лишь на некоторый период, чтоб потом "не поймали".

Действительно, если на все скандальные новости будет происходить постоянная подмена, то рано или поздно найдут, поймают, опозорят. А вот придержать на некоторое непродолжительное время, а потом автоматически поставить всё на место - это самое то.

Статьи новостного агентства лежат, естественно, в базе данных. Создадим минимальную - для эксперимента - таблицу новостей. В ней мы не будем создавать поле собственно текста новости, поскольку для эксперимента это не важно, но добавим дополнительное поле величины задержки для скандальной новости. Реальная замеченная задержка составляет десятки минут, но, чтоб не возиться с дробной арифметикой дат, положим все даты и задержки целочисленными, т.е. с точностью до суток.

Приступим. Создадим таблицу новостей:

create table news_tab(url varchar2(400), date_stamp date, title varchar2(400), delay number)
;

Наполним ее данными:

insert into news_tab values ('http://news.com/news1', sysdate - 7, 'Обычная новость 1', null);
insert into news_tab values ('http://news.com/news2', sysdate - 6, 'Обычная новость 2', null);
insert into news_tab values ('http://news.com/news3', sysdate - 5, 'Обычная новость 3', null);
insert into news_tab values ('http://news.com/news4', sysdate - 4, 'Обычная новость 4', null);
insert into news_tab values ('http://news.com/news5', sysdate - 3, 'Скандальная новость', 2);
insert into news_tab values ('http://news.com/news6', sysdate - 2, 'Обычная новость 6', null);
insert into news_tab values ('http://news.com/news7', sysdate - 1, 'Обычная новость 7', null);
insert into news_tab values ('http://news.com/news8', sysdate - 0, 'Обычная новость 8', null);

Прочитаем данные:

select * from news_tab
;

http://news.com/news1 29.10.21 Обычная новость 1
http://news.com/news2 30.10.21 Обычная новость 2
http://news.com/news3 31.10.21 Обычная новость 3
http://news.com/news4 01.11.21 Обычная новость 4
http://news.com/news5 02.11.21 Скандальная новость 2
http://news.com/news6 03.11.21 Обычная новость 6
http://news.com/news7 04.11.21 Обычная новость 7
http://news.com/news8 05.11.21 Обычная новость 8

- заметим, что у "Скандальной новости" от 02.11.21 установлена задержка в двое суток, а у обычных новостей это поле пусто. Не путаем с номером обычной новости - это разные поля, видно не очень хорошо.

А теперь начнем хитрить:

select date_stamp, title, url, delay
from news_tab nt
order by date_stamp
;

29.10.21 Обычная новость 1 http://news.com/news1
30.10.21 Обычная новость 2 http://news.com/news2
31.10.21 Обычная новость 3 http://news.com/news3
01.11.21 Обычная новость 4 http://news.com/news4
02.11.21 Скандальная новость http://news.com/news5 2
03.11.21 Обычная новость 6 http://news.com/news6
04.11.21 Обычная новость 7 http://news.com/news7
05.11.21 Обычная новость 8 http://news.com/news8

Выявим "особые новости", у которых установлена задержка:

select date_stamp, title, url, nvl2(delay, 'Надо хитрить', url) as shre_url
from news_tab nt
order by date_stamp
;

29.10.21 Обычная новость 1 http://news.com/news1 http://news.com/news1
30.10.21 Обычная новость 2 http://news.com/news2 http://news.com/news2
31.10.21 Обычная новость 3 http://news.com/news3 http://news.com/news3
01.11.21 Обычная новость 4 http://news.com/news4 http://news.com/news4
02.11.21 Скандальная новость http://news.com/news5
Надо хитрить

03.11.21 Обычная новость 6 http://news.com/news6 http://news.com/news6
04.11.21 Обычная новость 7 http://news.com/news7 http://news.com/news7
05.11.21 Обычная новость 8 http://news.com/news8 http://news.com/news8

Немного подумав, распишем это самое "надо хитрить" в соответствии с рекомендованной нам информационной политикой - "держать и не пущать" в течение значения delay:

select date_stamp, title, url
, nvl2(delay
, decode(sign(abs(to_date(:current_date) - date_stamp) - nvl(delay, 0)), -1,
(select min(url) from news_tab where delay is null and abs(date_stamp - nt.date_stamp) <= nt.delay)
, url), url) as share_url
from news_tab nt
where trunc(date_stamp) <= :current_date
order by date_stamp
;

Теперь очень внимательно. Скандальная новость опубликована 02.11.21. Соответственно, при :current_date < 02.11.21 ее еще нет. А 02.11.21 она должна появиться с подменой:

01.11.21:

29.10.21 Обычная новость 1 http://news.com/news1 http://news.com/news1
30.10.21 Обычная новость 2 http://news.com/news2 http://news.com/news2
31.10.21 Обычная новость 3 http://news.com/news3 http://news.com/news3
01.11.21 Обычная новость 4 http://news.com/news4 http://news.com/news4

- все новости спокойные и ничего странного нет, URL'ы публикации и "шэринга" одинаковые.

02.11.21:

29.10.21 Обычная новость 1 http://news.com/news1 http://news.com/news1
30.10.21 Обычная новость 2 http://news.com/news2 http://news.com/news2
31.10.21 Обычная новость 3 http://news.com/news3 http://news.com/news3
01.11.21 Обычная новость 4 http://news.com/news4 http://news.com/news4
02.11.21 Скандальная новость http://news.com/news5 http://news.com/news3

- о-опс! Прошла скандальная новость, и у нее URL "шэринга" указывает на другую новость, на обычную новость № 3!!

03.11.21:

29.10.21 Обычная новость 1 http://news.com/news1 http://news.com/news1
30.10.21 Обычная новость 2 http://news.com/news2 http://news.com/news2
31.10.21 Обычная новость 3 http://news.com/news3 http://news.com/news3
01.11.21 Обычная новость 4 http://news.com/news4 http://news.com/news4
02.11.21 Скандальная новость http://news.com/news5 http://news.com/news3
03.11.21 Обычная новость 6 http://news.com/news6 http://news.com/news6

- то же самое.

04.11.21:

29.10.21 Обычная новость 1 http://news.com/news1 http://news.com/news1
30.10.21 Обычная новость 2 http://news.com/news2 http://news.com/news2
31.10.21 Обычная новость 3 http://news.com/news3 http://news.com/news3
01.11.21 Обычная новость 4 http://news.com/news4 http://news.com/news4
02.11.21 Скандальная новость http://news.com/news5 http://news.com/news3
03.11.21 Обычная новость 6 http://news.com/news6 http://news.com/news6
04.11.21 Обычная новость 7 http://news.com/news7 http://news.com/news7

- то же самое.

05.11.21:

29.10.21 Обычная новость 1 http://news.com/news1 http://news.com/news1
30.10.21 Обычная новость 2 http://news.com/news2 http://news.com/news2
31.10.21 Обычная новость 3 http://news.com/news3 http://news.com/news3
01.11.21 Обычная новость 4 http://news.com/news4 http://news.com/news4
02.11.21 Скандальная новость http://news.com/news5 http://news.com/news5
03.11.21 Обычная новость 6 http://news.com/news6 http://news.com/news6
04.11.21 Обычная новость 7 http://news.com/news7 http://news.com/news7
05.11.21 Обычная новость 8 http://news.com/news8 http://news.com/news8

- вот и весь скандал закончился, задержка истекла и подставляется правильный URL. Как ничего и не было. Ищи ветра в поле!