×

PasswordPump密码管理器

消耗积分:2 | 格式:zip | 大小:0.32 MB | 2022-12-28

旧念

分享资料个

描述

这是 PasswordPump,一种管理多达 254 个帐户凭据的 USB 设备。凭据(帐户名、用户名和密码)仅存储在设备本身上,存储在两个使用军用级加密 (AES-128) 的可移动 EEprom 芯片上。它们不存储在云中或者在您计算机上的文件中,他们更容易受到黑客攻击。凭据备份在设备本身上;也就是说,根据需要将加密凭证从主 EEprom 芯片移动到备份 EEprom。您可以从设备中移除 EEprom 芯片(可能保留第三或第四个备份)。通过旋转编码器(左侧)或通过键盘和串行终端输入凭据。设备本身大约为 1 1/8 x 2 3/4 英寸,或 29 x 71 毫米。目前它没有装在箱子里,但一旦箱子设计完成,它就应该是,也将会是。

特征

  • 在单个 25LC256 EEprom 芯片上存储多达 254 组凭证。
  • 凭据按字母顺序存储以便于定位。
  • 最多允许 10 次尝试输入主密码失败,然后会自动擦除芯片并恢复出厂设置。
  • 所有凭据均使用 AES-128 加密,主密码使用 SHA-256 进行哈希处理。
  • 所有加密帐户和散列主密码都经过加盐处理。
  • 该设备不容易受到标准密码攻击。
  • 外部 EEprom 上的备份已加密。
  • 所有凭据都可以转储到文本文件中以进行额外备份(例如,转储到存储在保险箱或保管箱中并加密的拇指驱动器)。
  • 支持通过键盘和串行终端或旋转编码器输入凭据。
  • 只需一个主密码(最多 14 个字符)即可访问您的所有凭据。
  • 闲置 1 小时后自动注销。
  • 可选的密码生成,31 个字符的随机字母、符号和数字,用于极强密码。
  • 将设备上的密码显示配置为打开或关闭。

您可以通过转动旋转编码器在菜单项中移动,顺时针向下移动列表,逆时针向上移动。帐户名称按字母顺序存储。要选择一个项目,您可以在旋转编码器上单击(短按)。要进行备份,请按住旋转编码器半秒以上(长按)。

操作要打开设备,您只需使用微型 USB Micro-B 插头转 USB-A 插头电缆将其插入 USB 端口/插座,这与您用于为 Android 手机充电的电缆相同。第一次插入时可能需要安装驱动程序。该驱动程序可在下面“源代码”部分引用的源代码存储库中下载。如果我把设备发给你,它到达时已经用程序闪过并且设置了锁定位。有关设置锁定位的更多信息,请参阅Atmel ATMega 32u4 的数据表第 28.1 节。因为这是一个开源项目,所以它并不重要。

设置锁定位有助于更好地保护散列主密码和源代码。

第一次打开设备电源时,您会看到:

主密码 2019 年 3 月 11 日(或最近一次编译的日期)

此时您需要输入您的主密码。尝试选择一个您会满意的主密码,因为如果您想更改它,您必须重置设备,这会清除您的所有凭据。之后只有一种方法可以通过键盘或旋转编码器将凭据输入设备。还要尝试选择一个可以更快地输入设备的密码。它应该是大写和小写字母的组合,带有数字,可能还有一两个符号。我喜欢选择几乎可以完全用左手输入的密码,我发现通过旋转编码器输入它们更容易。您应该选择一个强密码;字母、大小写、数字和特殊字符的组合,长度在 7 到 14 个字符之间。要输入字符,请转动旋转编码器直到字符出现,然后向下按旋转编码器(短按)以选择字符。如果你犯了错误,目前没有办法备份,所以要小心(或者自己增强代码,如果你可以挤进去!)。输入完整的主密码后,长按设备(按下旋转编码器超过 1/2 秒)。您刚刚输入了主密码,现在可以输入一组凭据了。输入完整的主密码后,长按设备(按下旋转编码器超过 1/2 秒)。您刚刚输入了主密码,现在可以输入一组凭据了。输入完整的主密码后,长按设备(按下旋转编码器超过 1/2 秒)。您刚刚输入了主密码,现在可以输入一组凭据了。

您可以通过转动旋转编码器在菜单项中移动,顺时针向下移动列表,逆时针向上移动。帐户名称按字母顺序存储。要选择一个项目,您可以在旋转编码器上单击(短按)。要进行备份,请按住旋转编码器半秒以上(长按)。

添加凭据要通过键盘添加一组凭据,您需要打开一个串行终端。最适合我的是 Arduino 串行终端。因此,如果您打开 Arduino IDE,请转到“工具”->“端口”并选择 Arduino/Genuino Micro 端口。然后选择工具->串行监视器(或 Ctl+Shift+M)。接下来,在您的 PasswordPump 上向下导航至 Keyboard OFF 并通过短按将其更改为 Keyboard ON。导航回到添加帐户并短按。你会看到的:

账户名 添加账户

短按一下,然后切换回 Arduino 串行终端并输入帐户名,然后按回车键。然后长按密码泵。您现在应该看到:

编辑用户名[您输入的账户名]

再次短按,切换回 Arduino 串行终端并输入用户名,然后按回车键。然后长按密码泵。您现在应该看到:

编辑密码[您输入的账户名]

再次短按,切换回 Arduino 串行终端并输入密码,然后按返回键。然后长按密码泵。你现在应该看到:

Indicate Style [您输入的账户名]

再次短按并使用旋转编码器指定 0 或 1。如果在提供用户名和密码时密码泵应在发送用户名之后发送密码之前发送回车,则指定 0。如果在提供用户名和密码时指定 1,密码泵应在发送用户名之后和发送密码之前发送一个选项卡。然后长按密码泵。您现在应该看到:

账户名[您输入的账户名]

再次长按,你会看到:

Find Account [您输入的账户名]

您已完成输入凭据。

请注意,您也可以仅使用旋转编码器输入凭据。键盘可以打开或关闭,没关系。只需使用旋转编码器以类似于输入主密码的方式输入凭据。

发送凭证导航到查找帐户并短按。使用旋转编码器滚动浏览您输入的凭据列表。找到与要发送到计算机的凭据相关联的帐户名后,将输入焦点放在提示您在计算机上输入凭据的窗口中的用户名文本框中。在密码泵上,您应该看到:

发送 User & Pass [您选择的账户名]

短按发送用户名、回车符或制表符(取决于样式设置),然后是密码。如果您选择了正确的样式,您现在应该已登录到您的帐户/应用程序。

如果您只想将密码发送到计算机,然后回车,请使用旋转编码器向下滚动一次,直到您看到:

发送密码 [您输入的账户名]

并短按发送密码和回车符。

同样,您可以仅发送用户名或帐户名。

编辑凭据要编辑一组现有凭据,首先要确定您是要通过键盘还是仅通过旋转编码器来编辑凭据。如果您要通过键盘编辑凭据,请按照切换键盘输入中的说明进行操作。然后使用“查找帐户”导航到您要编辑的帐户并短按。然后向下滚动到 Edit Creds 并短按。然后滚动到要编辑的属性;帐户名称、编辑用户名、编辑密码或指示样式。现在短按。使用键盘以添加凭据中描述的方式重新输入属性,或仅使用旋转编码器重新输入属性。然后长按保存更改。如果您要为帐户生成新密码,请按照生成密码中的说明进行操作。

删除凭据
确保您有最新的 EEprom 备份。导航到查找帐户并短按。使用旋转编码器选择要删除的帐户,然后短按。使用旋转编码器向下滚动到 Delete Acct 并短按。通过使用旋转编码器选择 Y 并短按,确认您希望删除帐户。该帐户现已消失,并且已从主 EEprom 芯片中删除。它还没有从备份 EEprom 中擦除,所以如果你不小心删除了一个帐户,并且你有一个最近的备份,你可以恢复备份并且该帐户将重新出现。导航至“查找帐户”并验证您的帐户是否已删除。如果您无法滚动浏览所有帐户,则说明出现了间歇性缺陷,并且管理所有帐户显示的链接列表已损坏。从 EEprom 恢复最新的备份。如果您在删除帐户后立即备份 EEprom,它也会从辅助 EEprom 中删除。

生成密码
在尝试将密码更改为新生成的密码之前,请通读所有这些说明。PasswordPump 最强大的功能是它能够生成随机的 31 个字符的密码并记住它们。这些密码极难猜测,并且不易受到暴力破解帐户的攻击。在执行此操作之前,您应该确保您拥有所有凭据的当前备份。要为帐户生成密码,只需通过“查找帐户”找到该帐户,然后通过短按帐户名称来选择凭据。在您计算机上的应用程序中,导航到更改密码功能并将输入焦点放在旧密码文本框中。在 PasswordPump 上导航到发送密码(不是发送密码 )并短按。在您计算机上的应用程序中,通过按 键将输入焦点放在新密码文本框中。在 PasswordPump 中向下滚动到 Edit Creds 并短按,然后向下滚动到 Gen Password 并短按。这会将密码更改为随机生成的 31 个字符系列。现在长按一次,导航到发送密码(不发送密码 )并短按。如果您需要确认新密码,请将输入焦点放在计算机上应用程序中的该文本框上,然后再次短按。通过按返回键或以其他方式单击相应的按钮来确认您的密码更改。您现在在帐户上有一个随机的 31 个字符的密码,并且该密码存在的唯一位置是在您的 PasswordPump 上的加密 EEprom 芯片上。此时它' 备份到 EEprom 和备份到文件是个好主意,并确保您可以通过某种方式从该帐户丢失的密码中恢复。警告:如果因为不接受旧密码而尝试更改密码失败,请注意您刚刚用新生成的密码覆盖了旧密码。要恢复旧密码,您需要从 EEprom 恢复备份并重试,或者转到拇指驱动器上的加密备份文件以获取该帐户的当前密码,或者使用任何机制从该帐户恢复密码可通过应用程序或网站向您提供。提前考虑并小心谨慎,以免将自己锁在帐户之外!如果因为不接受旧密码而尝试更改密码失败,请注意您刚刚用新生成的密码覆盖了旧密码。要恢复旧密码,您需要从 EEprom 恢复备份并重试,或者转到拇指驱动器上的加密备份文件以获取该帐户的当前密码,或者使用任何机制从该帐户恢复密码可通过应用程序或网站向您提供。提前考虑并小心谨慎,以免将自己锁在帐户之外!如果因为不接受旧密码而尝试更改密码失败,请注意您刚刚用新生成的密码覆盖了旧密码。要恢复旧密码,您需要从 EEprom 恢复备份并重试,或者转到拇指驱动器上的加密备份文件以获取该帐户的当前密码,或者使用任何机制从该帐户恢复密码可通过应用程序或网站向您提供。提前考虑并小心谨慎,以免将自己锁在帐户之外!或转到拇指驱动器上的加密备份文件以获取该帐户的当前密码,或使用您可以通过应用程序或网站使用的任何机制从帐户中恢复密码。提前考虑并小心谨慎,以免将自己锁在帐户之外!或转到拇指驱动器上的加密备份文件以获取该帐户的当前密码,或使用您可以通过应用程序或网站使用的任何机制从帐户中恢复密码。提前考虑并小心谨慎,以免将自己锁在帐户之外!

注销当您想要注销设备时,使用旋转编码器导航至注销并短按。RGB LED 从绿色变为蓝色。您现在已注销,必须再次输入主密码才能使用该设备。如果您离开计算机去喝咖啡,最好锁定计算机并注销 PasswordPump。

切换键盘输入导航至键盘开/关。短按以切换设置。当键盘打开时,您可以使用添加凭据中描述的过程通过键盘输入凭据。不输入凭据时,请将键盘设置为关闭。设备关机时不会保存此设置,默认为键盘关闭。

显示/隐藏密码使用旋转编码器导航到 Show Psswrd ON/OFF。短按以切换设置。当您注销并关闭设备电源时,此设置将被保存。

备份到 EEprom在密码泵上使用旋转编码器导航到备份 EEprom。短按一下,然后通过使用旋转编码器选择 Y 并短按确认您要从主 EEprom 备份到辅助 EEprom。进行备份时 RGB 将为黄色,然后变回绿色。

备份到文件
在 PasswordPump 上,使用旋转编码器导航到备份到文件。在您的计算机上打开一个文本编辑器(一个没有自动完成功能的编辑器),notepad.exe 效果最好,并将输入焦点放在文本编辑器中。我个人使用 UltraEdit,因为它内置了加密功能。然后短按“备份到文件”。主 EEprom 芯片的内容(存储在 PasswordPump 中的所有凭据)被转储到文本编辑器中。操作完成后,RGB LED 变为紫色,然后变为绿色。最好通过使用 WinZip 或类似软件使用密码将其压缩来加密此文件,并将其存储在拇指驱动器上,然后您可以将其存储在保险箱或保管箱中。从您的计算机中删除原始文件并清空垃圾箱。通过定期执行此操作使此文件保持最新。

从 EEprom 恢复备份如果您决定要恢复 EEprom 备份(或者,换句话说,让辅助 EEprom 的内容覆盖主 ​​EEprom 的内容),然后导航到 PasswordPump 上的恢复备份。短按并通过旋转编码器选择 Y 并短按确认操作。RGB LED 将变为黄色,直到操作完成,然后变回绿色。

执行恢复出厂设置
您想要清除主 EEprom 上的所有加密凭据并将设备恢复出厂设置。在 PasswordPump 上,使用旋转编码器一直向下导航至重置。短按。通过使用旋转编码器选择 Y 并短按,确认您要将设备恢复出厂设置并清除所有凭据和主密码。当设备恢复出厂设置时,RGB 将先慢后快地闪烁蓝色和红色,然后变为蓝色。此时您可以输入新的主密码。请注意,恢复出厂设置不会清除存储在备份 EEprom 上的凭据。如果您使用相同的主密码,您将能够恢复备份并查看凭据。如果您还想清除备份 EEprom,请在输入新的主密码后选择备份 EEprom,

RGB 颜色和含义绿色 - 登录蓝色 - 未登录红色 - 登录尝试失败/错误备份或初始化 EEprom紫色 - 发送信用黄色 备份到 EEprom快速闪烁 红色/蓝色 - 初始化外部 EEprom慢速闪烁 红色/蓝色 - 初始化内部EEprom
 

如果您要编译源代码,则需要在您的 Arduino IDE 中安装以下库:

源代码
源代码可在此处找到它有大量的在线文档,所以我不打算在这里逐行进行。

本产品尚未经过专业的质量测试,您可能会失去您的证书。您已获得源代码,以便您可以更正您发现的任何缺陷。也就是说,我已经使用该设备几个月没有发生任何事故,并且我将所有凭据存储在上面,其中许多凭据使用生成的密码功能,所以如果我丢失了设备和我的备份我我需要重置我的帐户,因为此时我绝对无法知道密码是什么。我还按照我上面的建议维护备份。几个月来我一直在使用该设备,没有发生任何事故,我将所有凭据存储在上面,其中许多凭据使用生成的密码功能,因此如果我丢失了设备和我的备份,我将需要重置我的帐户,因为此时我绝对无法知道密码是什么。我还按照我上面的建议维护备份。几个月来我一直在使用该设备,没有发生任何事故,我将所有凭据存储在上面,其中许多凭据使用生成的密码功能,因此如果我丢失了设备和我的备份,我将需要重置我的帐户,因为此时我绝对无法知道密码是什么。我还按照我上面的建议维护备份。

重要披露:使用提供的加密库,我努力使用 AES128 加密存储在外部 25LC256 EEprom 上的所有凭据(并使用 SHA256 散列存储在内部 EEprom 上的主密码)。我已经对散列的主密码和每组凭据进行了加盐处理。这个项目是我第一次使用加密,没有正式的代码审查,所以我可能做错了,标准免责声明(买家注意)适用于这种情况。我已经使用 PC 和 CH340 24/25 系列 EEprom闪存 BIOS USB 编程器检查了外部 EEprom 芯片的内容(在存储多组凭据之后)所有的用户名、账户名和密码都是加密的。然而,我痛苦地意识到加密是一件很容易出错的事情,因此请谨慎行事。如果您精通此领域,我将不胜感激代码审查和一些建设性的反馈(请直接与我联系)。

该草图目前使用了 97% 的程序存储区域和 66% 的动态内存。这使得在不更换现有功能的情况下向产品添加新功能变得极其困难。我想添加几个新功能,但由于内存限制我不能添加。例如,在完全不活动 1 小时后,设备超时,您将退出。我想使该时间段可配置(例如,如果您愿意,可以将其设置为 2 小时),但我实在没有足够的空间来添加该功能。我认为一个小时可能是一个很好的折衷方案,在使用我身边的设备时,我会定期将旋转编码器向任何方向转动一两下,以将自动注销时间提前一个小时。

烧录程序我正在使用外部编程器将程序烧录到设备上。即从 Arduino IDE 我选择 Sketch-->Upload Using Programmer 将程序发送到 ATmega32u4/Arduino Pro Micro。我这样做的部分原因是它覆盖了引导加载程序,我想覆盖引导加载程序因为这样做我在设备上有更多空间用于程序。我不认为如果引导加载程序存在,该程序将不适合 Pro Micro,但我没有测试过这个。我也不认为由于其他原因,设备将在存在引导加载程序的情况下正常工作。因此,我使用 Pololu USB AVR Programmer
为了这。在使用外部编程器编程时,我仍然需要通过 USB 电缆为设备供电。如果您通过自己采购零件或使用套件构建设备,如果您希望能够加载新的,请确保在将 Arduino Pro Micro 焊接到 PCB 板上后不要剪断插头引脚固件。如果您剪下与 PCB 板齐平的插头引脚,将无法对设备进行重新编程;您需要将 VDD、GND、RST、MOSI、MISO 和 SCK 从外部编程器连接到 Arduino Pro Micro 以烧写程序。可以在此处找到执行此操作的说明 请放心,我对锁定位的初始设置不会阻止您重新刷写程序。如果你想在重新刷新程序后重置锁定位,你可以这样做。对我来说,最简单的方法是使用 Atmel Studio 和我的 USB AVRISP XPII。但是您真的不需要设置锁定位,因为无论如何,现在每个人都可以使用源代码。设置锁定位的唯一好处是可以更安全地存储散列主密码。存储在内部 EEprom 中的主密码使用 SHA-256 进行哈希处理。

许可Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License

本程序和设备的分发是希望它们有用,但不提供任何保证;甚至没有针对特定用途的适销性或适用性的默示保证。

已知缺陷(也有未知缺陷!)

  • 当 \e 嵌入帐户名(或用户名或密码)时,它被解释为 ESC 字符,输入到达时为空。例如 INSIGHTORADB\entmetrics。只有通过键盘而不是编码器输入时才会出现问题
  • 有时,删除帐户会破坏管理凭据显示顺序的双向链表。发生这种情况时,用户需要从 EEprom 恢复以取回丢失的凭据。
  • 从 Find 或 Add acct 返回后,DisplayLine2 需要被清空。
  • 当通过键盘输入一个 29 个字符长的帐户名时,没有输入任何内容。
  • 10 次登录尝试失败后自动初始化提示用户确认操作。
  • 在 EVENT_SINGLE_CLICK 的 switch 语句中,case 语句没有按顺序排列。当它们有序时,它无法正确评估。
  • 母微型 USB 连接非常脆弱。

未来
我目前受到 ATmega32u4 32k 中可用闪存数量的限制。程序占用了所有空间。如果我有更多空间,我可以添加其他功能。特别是,我对编写可以在与 PasswordPump 干净接口的计算机上运行的 GUI 感兴趣。使用 Arduino 串行终端添加凭据充其量是笨拙的,但我认为需要更多内存才能纠正这种情况。我还想有更多的 EEprom 空间,以便 64 字节可用于用户名、密码和帐户名。此外,我认为使用 AES-256 进行加密会更好。可能满足所有这些要求的设备是带有 ATSAMD51 的 Adafruit ItsyBitsy M4 Express以下是该网站的一些广告功能:

  • 以 120 MHz 运行的 Cortex M4 处理器
  • 512KB 闪存(比 ATmega32u4 大 16 倍)
  • 1.4" 长 x 0.7" 宽(比 Pro Micro 小)
  • 2MB 的 SPI 闪存(与两个 25LC256 芯片的 64k 相比)
  • 本机硬件 I2C 和串行(与 SSD1306 显示器接口)
  • 内置 AES 加密引擎,256 位(用于替换加密库)
  • 每个操作系统都支持本机 USB(像键盘一样发送凭据)
  • 可以与 Arduino IDE 一起使用
  • 内置 RGB DotStar LED(用于替换 PasswordPump 上的 RGB)
  • 复位按钮
  • USB 供电

不利的一面是,我用于 PasswordPump v1 的一些库不能与 ItsyBitsy 一起使用;特别是键盘库以及 SSD1306 的库都是一个问题。可以抛弃其他库,并且可以更轻松地编写代码以适应相关功能。最大的骗局是 ItsyBitsy 的价格,14.95 美元,这将使生产 PasswordPump 的成本增加三倍。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'PasswordPump密码管理器',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);