javascript - 修改Google 'Add Bookmark' bookmarklet 存储书签无弹窗?

标签 javascript dom bookmarklet

书签具有以下代码:

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)})();

弹出窗口中有一个验证函数和一个随 secret 钥:
<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">

是否可以更改书签以便它自动提交表单以创建书签? - 单击书签会很棒,这样当前页面就会在后台添加书签,而无需通过弹出提交过程。

任何想法都非常感谢。

最佳答案

friend 让我创建这样的书签,我做到了,所以我将与其他人分享我的代码,他们最终在这里寻求现有的解决方案。
首先——上面提到的签名 value 是某种 key / token ,与用户登录的 Google 帐户相关联的签名(为了使用 Google 书签) - 它始终是相同的值(对于一个帐户)。您必须找到此值并将其复制粘贴到下面的书签中。只需查看这个不需要的弹出页面的来源并搜索/bookmarks/mark?sig= 或使用 bookmarklet that shows hidden fields .

我编写的第一个版本在新窗口(选项卡)中创建简单的表单(如弹出窗口中的表单)并提交。在那个窗口关闭之后。代码如下:

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();
 } 
})();

而不是 ___________ 您必须放置您的 签名 值(value)。
我可能应该整理代码,删除样式,一些其他属性和未使用的字段,在“添加书签”按钮上使用英文标题,删除 &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

- 再次替换 签名 值与之前找到的值,并可能将 Dodaj+zak%C5%82adk%C4%99 更改为添加书签或使用您的语言在谷歌界面中调用此按钮的任何内容。在下面的书签中,我还将 bkmk 变量(带有站点地址)移动到 URL 的末尾,以便更好地处理与符号和其他一些特殊字符。

这个 URL 可以在新窗口/标签中打开,然后立即关闭,它会添加谷歌书签 - 但要在没有任何弹出窗口的情况下实现这一点,新窗口/标签我们必须使用一些小技巧并添加例如图像 设置为此 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 修改。

在某些页面(例如: this one )上,Firefox 甚至不会尝试下载添加到文档正文中的图像(即使可见)。我没有找到它的原因。例如,它在 Opera 上运行良好。

如果您的浏览器缓存安全内容(图像),您可能还需要在 URL 中添加时间戳(gburl=.......... + '&myts=' + new Date().getTime();),在如果您想再次为已添加书签的页面添加书签。

不同的方法:创建用户脚本(对于带有 Greasemonkey 扩展的 Firefox 和 Chrome、Opera)应该很容易,它只是在弹出窗口中自动提交表单 - 而不是使用修改后的书签。

要在书签的工作完成后进行清理,可以从 DOM 中删除图像(在 *test_gbed()* 函数中)。

PS:我知道我可以优化和压缩我的书签的一些代码,但为了更好的可读性,我保留了它。

关于javascript - 修改Google 'Add Bookmark' bookmarklet 存储书签无弹窗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3162736/

相关文章:

javascript - 找不到模块 'jsonwebtoken' Node.js

javascript - 模拟 SO 标签编辑器

javascript - 通过JS函数改变Dom,更新URL

用于复杂 CSS 属性的 Javascript API

javascript - 使用书签传输数据的方法

javascript - 这个 Angular 代码有什么问题?

javascript - 我怎样才能只获得我悬停的特定 H3 而不是全部?

javascript - rxjs 内部原生 map 提前退出

javascript - 在 Javascript 中查找请求 URL

javascript - 在小书签中返回未定义 - 转发页面