Flower Password

花密 Flower Password - 可记忆的密码管理方案

  1. // ==UserScript==
  2. // @name Flower Password
  3. // @name:zh-CN 花密
  4. // @namespace https://gf.qytechs.cn/zh-CN/scripts/23026-flower-password
  5. // @version 0.5.2
  6. // @author 徐小花, Johnny Jian, xLsDg
  7. // @description 花密 Flower Password - 可记忆的密码管理方案
  8. // @homepageURL https://github.com/xlsdg/flower-password-user-script
  9. // @icon https://cdn.jsdelivr.net/gh/xlsdg/flower-password-user-script/icon.png
  10. // @supportURL https://github.com/xlsdg/flower-password-user-script/issues
  11. // @include http://*
  12. // @include https://*
  13. // @match http://*/*
  14. // @match https://*/*
  15. // @require https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js
  16. // @require https://cdn.jsdelivr.net/npm/fpcode/dist/flowerpassword.umd.js
  17. // @require https://cdn.jsdelivr.net/npm/punycode@1.4.1/punycode.min.js
  18. // @require https://cdn.jsdelivr.net/gh/gorhill/publicsuffixlist.js/publicsuffixlist.min.js
  19. // @resource FP_STYLE https://cdn.jsdelivr.net/gh/xlsdg/flower-password-user-script/fp.min.css
  20. // @resource PUBLIC_SUFFIX_LIST https://publicsuffix.org/list/public_suffix_list.dat
  21. // @run-at document-end
  22. // @grant GM_getResourceText
  23. // @grant GM_addStyle
  24. // @grant GM_setClipboard
  25. // @license MIT License
  26. // @encoding utf-8
  27. // ==/UserScript==
  28.  
  29. (function () {
  30. 'use strict';
  31.  
  32. var currentField = null;
  33.  
  34. function setupInputListeners() {
  35. function insideBox(e) {
  36. return e.parents('#flower-password-input').length > 0;
  37. }
  38.  
  39. var lstPublicSuffix = GM_getResourceText('PUBLIC_SUFFIX_LIST');
  40. publicSuffixList.parse(lstPublicSuffix, punycode.toASCII);
  41.  
  42. var hostname = location.hostname.toLowerCase();
  43. var domain = publicSuffixList.getDomain(hostname);
  44. var suffix = publicSuffixList.getPublicSuffix(hostname);
  45.  
  46. $(document).on('focus', 'input:password', function () {
  47. if (insideBox($(this))) {
  48. return;
  49. }
  50.  
  51. lazyInject();
  52.  
  53. if (currentField && currentField.get(0) != this) {
  54. $('#flower-password-password, #flower-password-key').val('');
  55. }
  56.  
  57. currentField = $(this);
  58.  
  59. var offset = currentField.offset();
  60. var height = currentField.outerHeight();
  61. $('#flower-password-input')
  62. .css({
  63. left: offset.left + 'px',
  64. top: offset.top + height + 'px',
  65. })
  66. .show();
  67.  
  68. var code = '';
  69. var key = domain.replace('.' + suffix, '') + code;
  70. $('#flower-password-key').val(key);
  71. });
  72.  
  73. $(document).on('focus', 'input:not(:password)', function () {
  74. if (insideBox($(this))) {
  75. return;
  76. }
  77. $('#flower-password-input').hide();
  78. });
  79. }
  80.  
  81. function isInjected() {
  82. return $('#flower-password-input').length > 0;
  83. }
  84.  
  85. function lazyInject() {
  86. if (isInjected()) {
  87. return;
  88. }
  89.  
  90. var style = GM_getResourceText('FP_STYLE');
  91. GM_addStyle(style);
  92.  
  93. var html =
  94. '<div id="flower-password-input" style="display: none;">' +
  95. '<span id="flower-password-close" title="关闭">关闭</span>' +
  96. '<h1>花密 Flower Password</h1>' +
  97. '<label for="flower-password-password">记忆密码</label><input id="flower-password-password" name="flower-password-password" type="password" value=""/>' +
  98. '<br/>' +
  99. '<label for="flower-password-key">区分代号</label><input id="flower-password-key" name="flower-password-key" type="text" value=""/>' +
  100. '<p id="flower-password-hint">· 记忆密码:可选择一个简单易记的密码,用于生成其他高强度密码。<br/>· 区分代号:用于区别不同用途密码的简短代号,如淘宝账号可用“taobao”或“tb”等。<br/>· 按Enter键或Esc键关闭本窗口。<br/>· 花密官网地址:<a href="https://flowerpassword.com/" target="_blank">https://flowerpassword.com/</a></p>' +
  101. '</div>';
  102. $('body').append(html);
  103.  
  104. var onChange = function () {
  105. var password = $('#flower-password-password').val();
  106. var key = $('#flower-password-key').val();
  107. var result = fpCode(password, key);
  108. if (result) {
  109. currentField.val(result);
  110. GM_setClipboard(result);
  111. }
  112. };
  113.  
  114. $('#flower-password-password, #flower-password-key')
  115. .change(onChange)
  116. .keyup(onChange)
  117. .keyup(function (e) {
  118. if (e.which === 13 || e.which === 27) {
  119. currentField.focus();
  120. $('#flower-password-input').hide();
  121. }
  122. });
  123.  
  124. $('#flower-password-close').click(function () {
  125. $('#flower-password-input').hide();
  126. });
  127. }
  128.  
  129. setupInputListeners();
  130. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址