Изменить закладку Google «Добавить закладку» для сохранения закладки без всплывающего окна? - PullRequest
1 голос
/ 02 июля 2010

Букмарклет имеет следующий код:

javascript:(function(){var%20a=window,b=document,c=encodeURIComponent,d=a.open("http://www.google.com/bookmarks/mark?op=edit&output=popup&bkmk="+c(b.location)+"&title="+c(b.title),"bkmk_popup","left="+((a.screenX||a.screenLeft)+10)+",top="+((a.screenY||a.screenTop)+10)+",height=420px,width=550px,resizable=1,alwaysRaised=1");a.setTimeout(function(){d.focus()},300)})();

Во всплывающем окне есть функция проверки и случайный ключ:

<input type=submit name=btnA style="font-weight:bold" onclick="return _validate_add_bkmk(document.add_bkmk_form) && addp('btnA')"value="Add bookmark">

Вот функция addp:

<script>function addp(p) {document.add_bkmk_form.action = document.add_bkmk_form.action + "&" + p;return true;}</script>

Форма во всплывающем окне содержит случайное значение с именем 'sig', которое является частью действия отправки всплывающей формы:

<form name="add_bkmk_form" action="/bookmarks/mark?sig=2bbEz24YrH7rmG2yhwYeLQ&hl=en" method=post target="_self">

Можно ли изменить букмарклет, чтобы он автоматически отправлялформа для создания букмарклета?- было бы здорово щелкнуть букмарклет, чтобы текущая страница была добавлена ​​в закладки в фоновом режиме, не выполняя процедуру отправки всплывающего окна.

Любые идеи очень ценятся.

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Друг попросил меня создать такой букмарклет, и я сделал это, поэтому я поделюсь своим кодом с другими, которые в конечном итоге ищут здесь существующее решение.Прежде всего - упомянутое выше значение sig - это некий ключ / токен, подпись, связанная с учетной записью Google, в которую входит пользователь (для использования Google Bookmarks), - и это всегда одно и то же значение (для одногоучетная запись).Вы должны найти это значение и скопировать его в закладки ниже.Просто просмотрите источник этой нежелательной всплывающей страницы и найдите / bookmarks / mark? Sig = или используйте bookmarklet, который показывает скрытые поля .

Первая версия, которую я написал, создает простую форму (например, всплывающую) в новом окне (вкладке) и отправляет ее.После этого окно закрыто.Вот код:

javascript:(function(){
 var dloc = document.location;
 var dtitle = document.title;
 var code = '<html><head>
  <script src="https://www.google.com/bookmarks/history.js"></script></head><body>
  <script language="javascript">function addp(p) {document.add_bkmk_form.action = document.add_bkmk_form.action + "&" + p; return true;}</script>
  <form name="add_bkmk_form" action="https://www.google.com/bookmarks/mark?sig=_______________________&hl=pl" method=post target="_self">
  <input name=title type=text style="width:100%" id=bkmk_n value="' + dtitle + '">
  <input type="text" dir="ltr" style="width:100%" name="bkmk" id=bkmk_u value="' + dloc + '">
  <input name=labels autocomplete=off type=text style="width:100%" id=bkmk_label_1 value="">
  <input type="hidden" id="rbkmk_label_1" value=""><br>
  <textarea rows=4 style="width:100%" name=annotation style="font-size:smaller"></textarea>
  <input type=hidden name=sig value="_______________________">
  <input type=hidden name=prev value="/mark">
  <input type=submit name=btnA style="font-weight:bold" onclick="return _validate_add_bkmk(document.add_bkmk_form) && addp(\"btnA\")" value="Dodaj zakładkę">
  </form>
  <script language="javascript">document.getElementsByName("btnA")[0].click();</script>
  </body></html>';
 wnd=window.open("","wnd");
 with(wnd){
   document.write(code);
   document.close();
 } 
})();

Вместо _ __ _ __ _ __ _ _ Вы должны указать значение sig .Я, вероятно, должен привести в порядок код, удалить стиль, некоторые другие атрибуты и неиспользуемые поля, использовать английскую надпись на кнопке «Добавить закладку», удалить суффикс & hl = pl и т. Д. И, возможно, скопировать только те функции из Google history.js , которые используются, но не имеют времени для этого.

Лицу, который запросил этот букмарклет, не понравилось его поведение - то есть, что он открывает новую вкладку / окно дляна мгновение, а затем (авто) закрывает его, но для этого тоже есть решение.

К счастью, форму Google можно также отправить, используя метод GET (вместо POST), поэтому все действия по добавлению закладки можно выполнить, открывURL, подобный приведенному ниже:

https://www.google.com/bookmarks/mark?title=STACKOVERFLOW&bkmk=http%3A%2F%2Fstackoverflow.com%2F&labels=&annotation=&sig=___________________________&prev=%2Fmark&btnA=Dodaj+zak%C5%82adk%C4%99

- снова замените значение sig на найденное ранее и, возможно, измените Dodaj + zak% C5% 82adk% C4% 99 к Добавьте закладку или как там эта кнопка вызывается в интерфейсе Google, используя ваш язык.В букмарклетах ниже я также переместу переменную bkmk (с адресом сайта) в конец URL-адреса для лучшей обработки амперсандов и некоторых других специальных символов.

Этот URL-адрес можно открыть в новом окне /вкладка, а затем сразу же закрывается, и он добавит закладку Google - но для достижения этого без каких-либо всплывающих окон, новых окон / вкладок мы должны использовать небольшую хитрость и добавить, например, изображение с src , установленным на этот URL-адрес - как этосделано в коде ниже:

javascript:(function(){
  var gburl = 'https://www.google.com/bookmarks/mark?labels=&annotation=&sig=_____________&prev=%2Fmark&btnA=Add+bookmark&title=' +encodeURIComponent(document.title)+'&bkmk=' +encodeURIComponent(document.location);
  var f=window.frames;
  if(f.length>0 && Object.prototype.toString.call(document.body)==='[object HTMLFrameSetElement]'){
    f[0].document.body.innerHTML+='<img src="'+gburl+'" style="visibility:hidden" />';
  }
  else
  {
    document.body.innerHTML+='<img src="'+gburl+'" style="visibility:hidden" />';
  }
})();

Изображение добавляется в конце документа (или в конце первого кадра, если страница использует набор фреймов).Он настроен как невидимый, поэтому не должен ничего портить.

Удивительно, если бы все работало нормально, Google выдает изображение назад (звездочка) - как будто оно было подготовлено специально для моего букмарклета :-) Так что мы можем использовать его для проверкиесли все прошло правильно, проверив, например, ширину или высоту изображения, равную 15 пикселей.Тест выполняется через 1500 мс после добавления изображения (с использованием setTimeout () ), поскольку браузер должен сначала загрузить изображение и установить его свойства.При более медленном соединении вам может потребоваться увеличить это значение, а при более быстром вы можете уменьшить его.Во время разработки этого букмарклета в Firefox 3.6, Opera, IE и Chrome у меня было несколько версий без тайм-аута, используя условия, такие как: ! (Typeof image.width === 'undefined') , а в некоторых случаях> 0, в некоторых ≥ 0 или просто == 15 - но почти в каждом браузере приходилось проверять разные вещи ... Версия с тайм-аутом кажется наиболее универсальной.Итак, мой окончательный код:

javascript:(function(){
  var gburl = 'https://www.google.com/bookmarks/mark?labels=&annotation=&sig=_____________&prev=%2Fmark&btnA=Add+bookmark&title=' +encodeURIComponent(document.title)+'&bkmk=' +encodeURIComponent(document.location);
  var f=window.frames;
  var gbimg=document.createElement('img');
  var using_frames=false;
  gbimg.src=gburl;
  gbimg.style.visibility='hidden'; 
  gbimg.id='gb_niepowtarzalnyID_2'; 

  function test_gbed(frames)
  {
    if(frames)
    {
      if(!window.frames[0].document.getElementById("gb_niepowtarzalnyID_2") || window.frames[0].document.getElementById("gb_niepowtarzalnyID_2").width!=15)
      {
        alert("Warning!!! - page probably hasn't been bookmarked (frames)");
      }
    }  
    else
    {
      if(!document.getElementById("gb_niepowtarzalnyID_2") || document.getElementById("gb_niepowtarzalnyID_2").width!=15)
      {
        alert("Warning!!! - page probably hasn't been bookmarked (no frames)");
      }
    }
  }

  if(f.length>0 && Object.prototype.toString.call(document.body)==='[object HTMLFrameSetElement]')
  {
    using_frames=true;
    /* f[0].document.body.innerHTML+='<img id="gb_niepowtarzalnyID_2" src="'+gburl+'" style="visibility:hidden" />'; */
    f[0].document.body.appendChild(gbimg);
  }
  else 
  {
    /* document.body.innerHTML+='<img id="gb_niepowtarzalnyID_2" src="'+gburl+'" style="visibility:hidden" />'; */
    document.body.appendChild(gbimg);
  }
  setTimeout(function(){test_gbed(using_frames)}, 1500);
})();

Некоторые заключительные мысли, идеи, примечания:

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

Я полностью протестировал его только в Firefox, на других упомянутыхвыше браузеров я проверял это поверхностно.

В последнем букмарклете я заменил быстрые (но некрасивые) модификации innerHTML на более элегантный способ создания узла изображения и добавления его в тело документа.

На некоторых страницах (например: эта * ) Firefox даже не пытается загрузить изображение, добавленное в тело документа (даже если оно видно). Я не нашел причину этого. И, например, он прекрасно работает в Opera.

Если ваш браузер кэширует защищенный контент (изображения), вам также может понадобиться добавить метку времени к URL-адресу ( gburl = .......... + '& myts =' + new Date (). GetTime (); ), если вы хотите снова сделать закладку на уже добавленной странице.

Другой подход: должно быть очень легко создать usercript (для Firefox с расширением Greasemonkey и для Chrome, Opera), который просто автоматически отправляет форму во всплывающем окне - вместо использования модифицированного букмарклета.

Для очистки после выполнения работы букмарклета можно удалить изображение из DOM (в функции * test_gbed () *).

PS: я знаю, что могу немного оптимизировать и сжать код моих закладок, но я оставил его таким образом для лучшей читаемости.

0 голосов
/ 08 марта 2011

Я собираюсь сказать нет.Поскольку страница с токеном в нем (предположительно) находится в другом домене, чем та страница, на которой находится пользователь (то есть контекст, в котором работает букмарклет), межсайтовые ограничения не позволят букмарклету удалить токен изстраницы.

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

(Если букмарклеты каким-то образом освобождены от ограничений XSS, этоможет быть возможно.)

...