Кстати вот шаттер отображает для клиентов наши портфели и вроде как кол-во страниц умноженное на кол-во работ на странице равно кол-ву работ в портфеле, однако при любой сортировки будут мелькать дубли и некоторые работы вообще не отобразятся. Это не злой умысел со сокрытием особо ценных шедевров что бы не сделать нас миллионерами, просто неграмотная организация доступа к базе.
Немного сложно сформулировал, поясню на примере.
У вас 10000 работ, это 100 страниц по 100 работ. Грузим каждую страницу, получаем 10000 номеров картинок, сортируем удаляя дубли, получаем например 9350 уникальных картинок, проделываем процедуру снова, добавляем 10000 к нашим 9350 и удаляем дубликаты, получаем 9420 и т.д. Не знаю сколько, возможно несколько десятков раз нужно проделать эту процедуру что бы получить свои 10000 уникальных картинок. Это же касается и каталог менеджера... Возможно в топперфомансом та же ситуация.
Оно и по 1000 у меня грузит без проблем. А у некоторых уже 200 запарывает. 100 вроде бы у всех работает. С дубликатами пока не заморачивался, причины их появления понятны. Распределенная система как-никак. А там обеспечить единомоментную целостность данных нереально.
Метод прохода по каждой страничке топперфоманса у Вас конечно странный, особенно для тех у кого много страниц там. В былые времена я на тамперманки делал скрипт BatchDeleter что бы не удалять каждую из 40 картинок в батче с подтверждением. Всё работало в фоне, очень удобно. Вот кусочек кода открывающий все картинки батча и подтверждающий удаление:
PHP код:
for (var n=1; n<Math.ceil(b/20)+1; n++) GM_xmlhttpRequest({method:'GET',url:a+'&pg='+n.toString(),onload:function(response){
var links = new DOMParser().parseFromString(response.responseText,"text/html").getElementsByTagName("a");
for(var i=0; i<links.length; i++){var lnk=links[i].getAttribute("href");
if ((lnk!==null)&&(lnk.indexOf('elete.mh')>0)) GM_xmlhttpRequest({method:"GET",url:'/'+lnk.replace('&type=photos','&confirm=1&type=photos')});}}
});
Спасибо, посмотрю. Дело в том, что я делал приложение с учетом некоторой возможной паранойи пользователей, поэтому оно не использует xmlhttpRequest-запросы, так как для этого нужно дополнительный пермишшн в экстеншене. И если выложить это расширение в Гугл по честному, а я со временем планировал это сделать, то Хром будет пищать что, мол, приложение может слать что угодно хрен знает куда. А это может испугать особо впечатлительных. Хождение по топ перформерсам это, конечно, адок, в каком-то плане, однако совершенно честный способ с точки зрения Хрома и не вызывает у него внутреннего протеста
Re: Расширение для Хрома Shutterstock Catalog Helper
Цитата:
Сообщение от vmenshov
поэтому оно не использует xmlhttpRequest-запросы, так как для этого нужно дополнительный пермишшн в экстеншене.
Нужно проверять касается ли это того же домена или только доступа к другим серверам.
Что касается паранойи, то хоть исходный код покажи - она не пройдёт, яву же тоже понимать нужно, а кто будет заморачиваться, либо поверят и примут, либо нет...
Re: Расширение для Хрома Shutterstock Catalog Helper
Цитата:
Сообщение от ToBad
Нужно проверять касается ли это того же домена или только доступа к другим серверам.
Что касается паранойи, то хоть исходный код покажи - она не пройдёт, яву же тоже понимать нужно, а кто будет заморачиваться, либо поверят и примут, либо нет...
Это да. Есть такой сайт, Stock Performer. Он работает через собственное хромовское расширение для сбора статистики.
А там:
Код:
port.onMessage.addListener(function(msg) {
// Incoming request. Fetch page.
try {
var xhr = new XMLHttpRequest();
xhr.open(msg.post ? "POST" : "GET",msg.url,true);
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
// We have a page. Return it.
port.postMessage({
statusCode: xhr.status,
statusText: xhr.statusText,
content: xhr.responseText
});
xhr = null;
}
};
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
for(var field in msg.headers)
xhr.setRequestHeader(field,msg.headers[field]);
xhr.overrideMimeType("text/plain; charset=x-user-defined");
xhr.send(msg.post ? msg.post : null);
} catch(exception) {
// No page found.
port.postMessage({
status: 404,
statusText: "Not Found",
content: ""
});
xhr = null;
}
});
Ну то есть посылаем в порт эстеншена ЛЮБОЙ урл и он ответит его содержимым. Секьюрность 80 lvl Если юзер залогинен где надо, то хоть почту читай, хоть на PayPal покупки совершай.
И ничего, 1600 человек поставили.
Последний раз редактировалось vmenshov, 22.08.2018 в 00:18.
Re: Расширение для Хрома Shutterstock Catalog Helper
Цитата:
Сообщение от ToBad
Во во, кому нужно - всё поймут и поставят, а кому попридираться, то повод всегда найдут и таким никогда не угодить...
Урл с инфой о картинке пригодится, что нибудь полезное нашлось помимо даты?
Кейворды могут пригодится и еще там какой-то загадочный legacyId есть. Интересно, что за штука.
Кстати, Шаттер при обычном поиске прям в коде страницы запихивает даты публикации всех найденных картинок. Но вот при поиске по портфолио - нет. Ну что за люди, а? Вот сложно им было везде пропихнуть?
Re: Расширение для Хрома Shutterstock Catalog Helper
Цитата:
Сообщение от vmenshov
еще там какой-то загадочный legacyId есть. Интересно, что за штука.
Я расскажу. Изначально как только мы заливаем картинку на сайт, ей назначается U-имя. Это как и постоянный номер, только с буквой U вначале. Кстати информацию по этой картинке можно получить по той же ссылке заменив P на U и указав тот изначальный номер. Там меньше информации, забраны ключевики из файла и описание если есть, а так же уже созданы часть превью для пендинга и в полях filename и thumbnail_url уже можно встретить этот legacyId будущий. Так же уже определено P-имя в поле id. После публикации работы, кода она идёт на модерацию к ней уже можно обращаться по P имени где более полная информация, а U запись в базе перестаёт существовать через время. Иногда очень быстро, а иногда висит очень долго.
В информации по P имени в поле upload_id это как раз наше прошлое U имя, вернее номер. Тут можно и попытаться посмотреть если запись ещё существует подставив в ту ссылочку и поменяв букву на U.
В общем очень у них странно это всё замучено.
Re: Расширение для Хрома Shutterstock Catalog Helper
vmenshov У меня к Вам вопрос. Я себе организовал всю работу сторонними программами которые пишу на delphi 10 для инета использую synapce. Что бы работать с сайтом не делая костылей с авторизацией и гугл капчей на консольных приложениях - просто использую необходимые куки.
Всего нужно знать две: sbsid и session.
Первую я отправляю себе на хостинг раз в сутки при открытии шаттера в броузере.
Скрипт для тамперманки выглядит так:
jQuery.noConflict();
jQuery(document).ready(function ($) {
var utc=new Date().toJSON().slice(0,10);
if (GM_getValue("lastsend","")!=utc){
GM_setValue("lastsend",utc);
GM_xmlhttpRequest({method:"GET",url:"http://*******/?id="+getCookie('sbsid')});}
});
Соответственно мой софт если нет авторизации со старыми куками - берёт их с сервера и использует для входа в учётную запись.
Вторую куку я в хроме из просмотра кода копипащу, хоть и не часто, но вручную в виду того, что это httponly кука.
Инфа из инета: Куки HTTPonly не доступны из JavaScript через свойства Document.cookie, и через XMLHttpRequest и Request API, что помогает избежать межсайтового скриптинга (XSS). Устанавливайте этот флаг для тех cookie, к которым не требуется обращаться через JavaScript.
Таким образом со скрипта тамперманки я получить и отправить такую куку не могу. Однако подозреваю, что с хром расширения это сделать очень просто. Опыта написания расширений не имел, но вот например знаю что тот же Cookie Inspector отображает такую куку без проблем.
Мой скрипт превратить в extension и добавить отправку куки session - сложно?
Re: Расширение для Хрома Shutterstock Catalog Helper
Цитата:
Сообщение от ToBad
Вот и поговорили...
Сорри, времени нет проверить. Однако я практически уверен, что никакого доступа к таким кукам не будет. Расширения они на том же джаваскрипте работают что и сами сайты.