Side Menu
分类目录
   

适用于为知笔记Windows客户端4.5版本的插件开发API文档

4.4 版本插件开发API文档见:http://www.wiz.cn/manual/plugin/

为知笔记从4.5版本开始,升级Chrome内核版本为49,并采用多进程模式。带来的一个影响就是大部分插件需要升级才可以在4.5下面使用。

由于采用多进程模式,插件将无法直接访问笔记渲染浏览器的DOM对象,取而代之的,是通过WizChromeBrowser这样一个对象,和浏览器进行交互,例如执行脚本并获得返回值。

一个例子:在插件代码中访问当前笔记的文字:
4.5之前的版本代码:

    var noteDoc = objApp.Window.CurrentDocumentHtmlDocument;    //HTML Document
    //4.5之前的版本,我们可以直接获得当前笔记所在浏览器的document对象,并获得body中的文字。
    alert(noteDoc.body.innerText);

4.5以及之后的版本代码:

    var objBrowser = objApp.Window.CurrentDocumentBrowserObject;
    //4.5以及之后的版本,无法获得笔记所在浏览器的对象,而是获得了一个WizChromeBrowser的对象
    //通过WizChromeBrowser提供的方法,我们可以要求笔记所在的浏览器,执行一段脚本,并将脚本的返回值返回给我们。
    //WizChromeBrowser和浏览器交互的时候,都是异步进行的,结果通过回调函数返回。
    objBrowser.ExecuteScript("document.body.innerText", function(text) {
        alert(text);
    });

从上面的例子可以看出插件如果要和笔记所在浏览器进行交互,则必须采用发送消息的形式来进行。

下面是WizChromeBrowser的定义:

interface IWizChromeBrowserObject : IDispatch{
    // 执行一个脚本,异步执行
    [id(9), helpstring("method ExecuteScript")] HRESULT ExecuteScript([in] BSTR bstrScript, [in] VARIANT callback);
    // 执行一个.js文件里的所有脚本,异步执行
    [id(10), helpstring("method ExecuteScriptFile")] HRESULT ExecuteScriptFile([in] BSTR scriptFileName, [in] VARIANT callback);
    // 执行一个函数,无参数,异步执行
    [id(11), helpstring("method ExecuteFunction0")] HRESULT ExecuteFunction0([in] BSTR functionName, [in] VARIANT callback);
    // 执行一个函数,输入参数有一个,异步执行
    [id(12), helpstring("method ExecuteFunction1")] HRESULT ExecuteFunction1([in] BSTR functionName, [in] VARIANT param1, [in] VARIANT callback);
    // 执行一个函数,输入参数有两个,异步执行
    [id(13), helpstring("method ExecuteFunction2")] HRESULT ExecuteFunction2([in] BSTR functionName, [in] VARIANT param1, [in] VARIANT param2, [in] VARIANT callback);
    // 执行一个函数,输入参数有三个,异步执行
    [id(14), helpstring("method ExecuteFunction3")] HRESULT ExecuteFunction3([in] BSTR functionName, [in] VARIANT param1, [in] VARIANT param2, [in] VARIANT param3, [in] VARIANT callback);
    // 执行一个函数,输入参数有四个, 异步执行
    [id(15), helpstring("method ExecuteFunction4")] HRESULT ExecuteFunction4([in] BSTR functionName, [in] VARIANT param1, [in] VARIANT param2, [in] VARIANT param3, [in] VARIANT param4, [in] VARIANT callback);
};

WizChromeBrowser是为知里面每一个Chrome浏览器所内置的一个对象,该对象可以在脚本中传递。对于笔记所在的浏览器,则可以通过为知的接口获得该对象(例如通过objApp.Window.CurrentDocumentBrowserObject获得当前笔记所在的浏览器对象)。

WizChromeBrowser的主要方法:

  • ExecuteScript:在WizChromeBrowser所属的浏览器内,执行一段脚本。结果通过callback返回。
  • ExecuteScriptFile:和ExecuteScript类似,只不过可以直接执行一个本地js文件里面的脚本。
  • ExecuteFunction等:在WizChromeBrowser所属浏览器内,执行一个函数。返回值通过callback返回。

在插件中更改笔记内容(加粗当前选中的文字):
4.5之前的版本代码:

var doc = objApp.Window.CurrentDocumentHtmlDocument;
doc.execCommand("bold", false);

4.5以及之后的版本代码:

objApp.Window.CurrentDocumentBrowserObject.ExecuteScript("document.execCommand('bold', false);", function(ret){});

获取笔记中特定的元素(大纲插件)
4.5之前的版本代码:

function getBookmarks(doc){
    if(!doc)
      return ;
    //
    var arrLinks = doc.anchors;
    for(var i = 0; i <arrLinks.length; i++){
        var elem = arraLinks[i];
        var elemName = elem.name;
        …
    }
}

4.5以及之后的版本代码:

/* getBookmarks.js*/
(function(){
    var added = false;
    var arrLinks = document.anchors;
    var arrayBookmarkName = [];
    var jsonelem = [];
    //
    for (var i = 0; i < arrLinks.length; i++) {
        var elem = arrLinks[i];
       // 获取DOM节点的属性值
        var name = elem.name;
        if (name == null || name == "")
            continue;
        //
       …
        //
        arrayBookmarkName.push(name);
    }
    return arrayBookmarkName;
}());

/*Outline.html*/
var scriptFile = pluginPath + "getBookmarks.js";
objBrowser.ExecuteScriptFile(scriptFile, function(ret){
      if(ret && ret.length > 0){
             for(var i = 0; i < ret.length; i++){
                  var elemName = ret[i];  
                  …
             }
      }
});

注意事项:
不管是执行脚本的返回值,还是执行函数的参数,只能是以下几种类型:

  • 基本数据类型,包含数字,字符串,日期,布尔值,空值
  • 基本数据类型组成的数组
  • COM对象

对于DOM对象,例如HTML Document,Window对象,都不能直接作为参数或者返回值传递。例如下面的代码无法执行:

objApp.Window.CurrentDocumentBrowserObject.ExecuteScript("document.body", function(body) {
    alert(body.innerText);
});

因为document.body 不属于上面所允许的类型,因此无法作为返回值传递。
同样,js内部的JSON对象,也不能进行传递。下面的代码同样是非法的:

objApp.Window.CurrentDocumentBrowserObject.ExecuteScript("{'a':'a'}", function(obj) {
    alert(obj.a);
});

如果要传递一个JSON对象,可以将JSON序列化成字符串。在使用的时候再重新解析成一个JSON对象。
示例代码:

function pluginXXX_GetElemAttributes(elemid){
    var elem = document.getElementById(elemid);
    if(elem){
         var jsonelem = {
              "tagName": elem.tagName.toLowerCase(),
              "offsetTop": elem.offsetTop,
              "innerText": elem.innerText
         };
         var json = JSON.stringify(jsonelem);
         return json;
    }
    return null;
}
//将pluginXXX_GetElemAttributes函数注入到目标浏览器内
objBrowser.ExecuteScript(pluginXXX_GetElemAttributes.toString(), function(ret){
       //调用目标浏览器内注入的函数
      objBrowser.ExecuteFunction1("pluginXXX_GetElemAttributes", "test", function(ret){
             if(ret && ret.length > 0){
                  var att = JSON.parse(ret);
                  var tagName = att.tagName;
                  var offsetTop = att.offsetTop;
                  var innerText = att.innerText;
             }
      });
});

其他注意事项:

声明插件支持的版本

  • 在plugin.ini文件的[Common]区段下添加字段“SupportVersion”,此字段值大于等于2的情况下,4.5以及之后版本启动时会加载此插件。

部分接口改变,从传递document对象到传递WizChromeBrowser对象作为参数

  • 定义的一些Wiz笔记响应事件
function WizOnHtmlDocumentCompleteEx(objBrowser, objWizDocument) {
    eventsHtmlDocumentCompleteEx.dispatch2(objBrowser, objWizDocument);
}
function WizOnDocumentBeforeChange(objBrowser, objWizDocumentOld, objWizDocumentNew) {
    return eventsDocumentBeforeChange.dispatch3(objBrowser, objWizDocumentOld, objWizDocumentNew);
}
function WizOnDocumentAfterChange(objBrowser, objWizDocumentOld, objWizDocumentNew) {
    return eventsDocumentAfterChange.dispatch3(objBrowser, objWizDocumentOld, objWizDocumentNew);
}
function WizOnDocumentBeforeEdit(objBrowser, objWizDocument) {
    return eventsDocumentBeforeEdit.dispatch2(objBrowser, objWizDocument);
}
function WizOnDocumentAfterEdit(objBrowser, objWizDocument) {
    return eventsDocumentAfterEdit.dispatch2(objBrowser, objWizDocument);
}

eventsDocumentBeforeEdit 和 eventsDocumentAfterEdit 消息在Wiz 4.5.8以及之后版本中失效

  • IWizExplorerApp
HRESULT GetPluginAppPath([in] IDispatch* pBrowserObjDisp, [out, retval] BSTR* pVal); 
HRESULT GetPluginAppGUID ([in] IDispatch* pBrowserObjDisp, [out, retval] BSTR* pVal);
HRESULT GetHtmlDocumentPath([in] IDispatch* pBrowserObjDisp, [out, retval] BSTR* pVal);
// 以下三种方法均为异步执行
HRESULT PluginLocalizeHtmlDialog([in] IDispatch* pBrowserObjDisp);
HRESULT LocalizeHtmlDocument([in] BSTR bstrLanguageFileName, [in] IDispatch* pBrowserObjDisp);
//同LocalizeHtmlDocument方法,返回值通过callback返回
HRESULT LocalizeHtmlDocument2([in] BSTR bstrLanguageFileName, [in] IDispatch* pBrowserObjectDisp, [in] VARIANT callback);
//添加方法 SetNoteModifiedByPlugin, 插件修改笔记后调用此方法,作为修改标志
HRESULT SetNoteModifiedByPlugin();
//添加方法 IsCurrentDocumentEditing, 获取当前显示的笔记是否处于编辑状态
HRESULT IsCurrrentDocumentEditing([out, retval] VARIANT_BOOL* pVb);

一个例子:对话框类型插件本地化
4.5之前版本代码:

var iniPath = pluginPath +"plugin.ini";
LocalizeHtmlDocument(iniPath, document);  //同步执行

4.5以及之后的版本代码:

LocalizeHtmlDocument(iniPath, WizChromeBrowser);   //异步执行
  • IWizExplorerWindow
// 属性 CurrentDocumentHtmlDocument不再使用, 改为使用 CurrentDocumentBrowserObject, 获取当前正在显示的笔记所在浏览器的 WizChromeBrowser 类型对象
HRESULT CurrentDocumentBrowserObject([out, retval] IDispatch** pVal);
// 方法 ShowHtmlDialog 与 ShowHtmlDialog2 不再使用,改为使用 ShowHtmlDialogEx。
// vbModal 必为 false,vParam为传给对话框的参数,可通过方法 GetHtmlDialogParam 来获得。 此函数为异步调用,结果通过vCallBack返回。
HRESULT ShowHtmlDialogEx([in] VARIANT_BOOL vbModal, [in] BSTR bstrTitle, [in] BSTR bstrURL, [in] LONG nWidth, [in] LONG nHeight, [in] BSTR bstrExtOptions, [in] VARIANT vParam, [in] VARIANT vCallback);
HRESULT CloseHtmlDialog([in] IDispatch* pBrowserObjDisp, [in] VARIANT vRet);
HRESULT GetHtmlDialogParam([in] IDispatch* pBrowserObjDisp, [out, retval] VARIANT* pvParam);
HRESULT GetHtmlDialogHWND([in] IDispatch* pBrowserObjDisp, [out, retval] OLE_HANDLE* phHWND);
HRESULT SetDialogResult([in] IDispatch* pBrowserObjDisp, [in] VARIANT vRet);
HRESULT CloseSelectorWindow([in] IDispatch* pdispSelectorBrowserDisp);

一个例子:在对话框插件中打开另一个html页面(自定义快速搜索)
4.5以前版本代码:

/*add_quick_search.htm*/
…
var retString;
//填充 retString
…
//
objWindow.CloseHtmlDialog(document, retString);
…
/*customize_quick_searches.htm*/
…
// ret即为add_quick_search.htm中retString变量
var ret = objApp.Window.ShowHtmlDialog("", objApp.AppPath + "files\\customize_quick_searches\\add_quick_search.htm", 500, 500, "");
//
…

4.5以及之后版本代码:

/*add_quick_search.htm*/
…
var retString;
//填充 retString
…
//
objWindow.CloseHtmlDialog(WizChromeBrowser, retString);
…
/*customize_quick_searches.htm*/
…
// ret即为add_quick_search.htm中retString变量, ShowHtmlDialogEx 第一个参数必为false, 弹出非模态对话框
objApp.Window.ShowHtmlDialogEx(false, "", objApp.AppPath + "files\\customize_quick_searches\\add_quick_search.htm", 500, 500, "", null, function(ret){
      //
      if(ret && ret.length > 0){
      …
      }
});
//
…
  • IWizHtmlEditorApp
// 属性 EditorDocument不再使用, 改为使用 EdtorBrowserObject, 获取当前正在显示的笔记所在浏览器的 WizChromeBrowser 类型对象
HRESULT EditorBrowserObject([out, retval] IDispatch** pVal);
HRESULT LocalizeHtmlDocument([in] BSTR bstrLanguageFileName, [in] IDispatch* pBrowserObjectDisp);
HRESULT GetHtmlDocumentPath([in] IDispatch* pBrowserObjectDisp, [out, retval] BSTR* pVal);

双浏览器变单浏览器

  • 4.5以前版本,使用一个浏览器加载阅读状态下的笔记, external 对象即 WizExplorerApp 对象;使用另一个浏览器加载编辑状态下的笔记, external 对象为 IWizHtmlEditorApp 类型,所属文件 WizTools.idl。4.5以及之后版本,改为使用一个浏览器来加载阅读状态与编辑状态下的笔记,external 对象类型为 IWizHtmlEditorApp。

一个例子:阅读状态下,获取当前数据库的路径(为知助手)
4.5以前的版本代码:

var objDatabase = external.Database;
var databasePath = objDatabse.DatabasePath;

4.5以及之后的版本代码:

/* 注入脚本文件: KMContent.js*/
var objKMHelperApp;
var objKMHelperDatabse;
var objKMHelperPluginBrowser;
//
function KMInit(app, pluginBrowser) {
    if (!app || !pluginBrowser)
        return;
    //
    objKMHelperApp = app;
    objKMHelperDatabase = app.Database;
    var databasePath = objKMHelperDatabase.DatabasePath;
    //
    objKMHelperPluginBrowser = pluginBrowser;
    …
}

/* 插件文件:KMHelper.js*/
function initEvents() {
/*
向Wiz注册一个事件,响应文档完成的消息。在Wiz内打开一个html文件的时候(例如阅读文档),如果Html文件打开完成,则调用这个方法。
*/
    eventsHtmlDocumentComplete.add(KMOnHtmlDocumentComplete);
    …
}
// 笔记加载完成, objBrowser 为当前显示的笔记所在浏览器的 WizChromeBrowser 对象
function KMOnHtmlDocumentComplete(objBrowser) {
    if (!objBrowser)
        return;
    //
    var pluginPath = objApp.GetPluginPathByScriptFileName("KMHelper.js");
    var contentScriptPath = pluginPath + "KMContent.js";
    //
    objBrowser.ExecuteScriptFile(contentScriptPath, function (ret) {
        // 执行注入脚本的 KMInit 方法, 将 WizExplorerApp, WizChromeBrowser 对象传到笔记所在浏览器中
        objBrowser.ExecuteFunction2("KMInit", objApp, WizChromeBrowser, function (ret) {
              …
        });
    });
}

笔记所在浏览器的 external 对象没有获取 IWizDatabase 对象的方法。从上例可看出,可调用注入脚本的函数,将 WizExplorerApp 对象传到笔记所在浏览器中,再获取数据库对象,由此也可以使用 WizExplorerApp 对象的其他方法。

上例中还将插件所在浏览器的 WizChromeBrowser 对象传到笔记所在浏览器中,这样可以通过此对象执行插件环境下的脚本。
一个例子: 鼠标移开后自动关闭目录设置界面(为知助手)

/*注入脚本文件 : KMContent.js*/
function KMOnSetAsContentClick() {      //点击设置目录图标,弹出目录设置界面
    // 设置目录逻辑
    …
    // 添加自动关闭窗口的计时器, objKMHelperPluginBrowser为插件所在浏览器的 WizChromeBrowser 对象
    objKMHelperPluginBrowser.ExecuteFunction1("KMAutoCloseContentWindow", true, null);
} 
function KMAutoCloseContentWindow() {
    //关闭目录设置窗口逻辑
    …
    //去除计时器, objKMHelperPluginBrowser为插件所在浏览器的 WizChromeBrowser 对象
    objKMHelperPluginBrowser.ExecuteFunction1("KMAutoCloseContentWindow", false, null);
}

/*插件文件: KMHelper.js*/
function KMAutoCloseContentWindow(isAddAfterRemove) {
    //
    objWindow.RemoveTimer("KMAutoCloseContentWindowTimer");
    if (isAddAfterRemove) {
        objWindow.AddTimer("KMAutoCloseContentWindowTimer", 1000);  //KMAutoCloseContentWindowTimer, 计时器回调函数名
    }
}
function KMAutoCloseContentWindowTimer() { 
    var objBrowser = objWindow.CurrentDocumentBrowserObject;
    if (!objBrowser)
        return;
    //
    objBrowser.ExecuteFunction0("KMAutoCloseContentWindow", null);
}

一个例子: 阅读状态下,插件对笔记的修改与保存(为知助手)
4.5以前版本代码:

this.colorword = function (doc, node, keyword, callback) {
        if (node.childNodes == undefined)
            return false;
        //
        if (node.id == "wizKMHighlighterSpan_t_t")
            return false;
        //
        for (var i = 0; i < node.childNodes.length; i++) {
            var childNode = node.childNodes[i];
            if (childNode.nodeType == 3) {
                //childNode is #text
               …
                //
                re = new RegExp('(' + keyword.word + ')', 'i');
                //
                var forkNode = doc.createElement("span");
                forkNode.id = "wizkm_highlight_tmp_span";
                forkNode.innerHTML = childNode.data.replace(re, '<div id="wizKMHighlighterSpan_t_t" style="background-color:' + keyword.bgColor + ';color:' + keyword.foreColor + '; cursor:pointer; border-bottom: 1px #00c dashed;">$1</div>');
                node.replaceChild(forkNode, childNode);
                //
                …
                //
               return true;
            } 
            …
        }
        return false;
    } 
    //
    …
    // 
   function KMSetDocumentModified(doc) {
        if (!doc)
              return;
        var body = doc.body;
        if (!body)
              return;
        //
        body.setAttribute(g_KMDocumentModifiedAttributeName, "1", 0);
   }
   …
   function KMIsDocumentModified(doc){
        if(!doc)
             return;
       //  
        var body = doc.body;
        if (!body)
              return;
        //   
        return body.getAttribute(g_KMDocumentModifiedAttributeName, 0) == "1";
   }
   function KMSaveDocument(objHtmlDocument, objWizDocument) {
       if (!objWizDocument)
           return;
       if (!KMIsDocumentModified(objHtmlDocument))
           return;
       //
    …
    }

4.5以及之后版本代码:

/*KMContent.js*/  
//注入脚本 
this.colorword = function (node, keyword, callback) {
        if (node.childNodes == undefined)
            return false;
        //
        if (node.id == "wizKMHighlighterSpan_t_t")
            return false;
        //
        for (var i = 0; i < node.childNodes.length; i++) {
            var childNode = node.childNodes[i];
            if (childNode.nodeType == 3) {
                //childNode is #text
               …
                //
                re = new RegExp('(' + keyword.word + ')', 'i');
                //
                var forkNode = document.createElement("span");
                forkNode.id = "wizkm_highlight_tmp_span";
                forkNode.innerHTML = childNode.data.replace(re, '<wiz_tmp_plugin_tag id="wizKMHighlighterSpan_t_t" style="background-color:' + keyword.bgColor + ';color:' + keyword.foreColor + '; cursor:pointer; border-bottom: 1px #00c dashed;">$1</wiz_tmp_plugin_tag>');
                node.replaceChild(forkNode, childNode);
                //
                …
                //
               return true;
            } 
            …
        }
        return false;
    } 
    //
    …
    //
    function KMSetDocumentModified(){
           objKMHelperApp.SetNoteModifiedByPlugin();
     }
     …
  • 4.5以前版本,在为知笔记默认编辑器下使用的插件,其保存操作是同步执行,各个插件按顺序对笔记进行保存。4.5以及之后版本,插件的保存操作是异步执行,各插件按顺序对笔记进行保存时,可能会丢失其他插件对笔记的修改。所以从4.5版本开始,保存操作由内部编辑器来完成, 插件修改笔记之后,只需调用 WizExplorerApp 对象的SetNoteModifiedByPlugin方法,设置修改标志即可。

注意: SetNoteModifiedByPlugin 方法应用于阅读状态下插件对笔记做出修改时进行标记。编辑状态下为知笔记编辑器会对DOM修改进行捕获,所以不需插件单独设置修改标记。

  • 插件在操作笔记时可能会添加一些临时DOM节点,需在保存时进行删除, 像上例中创建的高亮节点。插件可以使用为知笔记定义的自定义标签来创建此类节点,内部编辑器保存时会将此类节点删除。根据删除类型,定义了以下两种自定义标签:
  1. 保存时删除整个临时节点
    使用标签<wiz_tmp_tag></wiz_tmp_tag>创建临时节点的顶层节点,字节点不需要再使用此标签创建。
  2. 保存时删除整个临时节点,但保留节点文本
    使用标签<wiz_tmp_plugin_tag></wiz_tmp_plugin_tag>来创建临时节点的顶层节点,字节点不需要再使用此标签创建。

此上两种标签不可嵌套使用,否则会产生未知错误,只需用这两种标签创建相应的顶层节点即可。

笔记所在浏览器中, 避免全局脚本命名冲突

  • 所有的插件注入脚本都在笔记所在浏览器下执行,避免出现变量和函数名的命名冲突,从而导致发生不可预期的错误,建议对变量及函数的名称添加前缀或者后缀。

 

mac版升级后,找不到之前本地的笔记了怎么办?

若您之前安装是在AppStore商店进行的安装,升级时是从我们官网下载的DMG安装包,因为两种安装方式在本地的数据存储目录不同,所以安装新版后,无法读取到之前版本里未上传的那部分笔记,可以通过下面的方法试着找回。若升级前将之前从商店安装的为知笔记卸载了,无法找到AppStore下面的本地笔记存储目录,未上传的笔记将不能找回。
①先找到两个电脑里的本地文件夹:
AppStore版本使用了沙盒,文件存放在:  ~/Library/Containers/cn.wiz.wiznoteformac/Data/Documents
DMG版本没有沙盒,文件存放在个人目录下的 ~/.wiznote 目录中(隐藏文件夹,请先打开可显示隐藏文件夹的开关,再从路径中寻找)。
备注:~表示用户home目录, 例如/User/xiaoming  。
②将DMG版本对应的 ~/.wiznote 目录下的所有文件先剪切到其他地方,然后将AppStore版本对应的~/Library/Containers/cn.wiz.wiznoteformac/Data/Documents目录下的所有文件复制粘贴到 ~/.wiznote 目录下(注意不要复制反了)。然后开启为知笔记,应该能找到之前未上传的笔记。
2017年之后免费账号下新笔记和新编辑的笔记无法上传,找回笔记后可以购买VIP将笔记上传至云端。

Chrome 浏览器网页剪辑器

方法1:点击进入Chrome市场安装   

方法2:下载并手动安装   

Chrome网页剪辑器本地安装说明   

版本:4.0.10 (2019-01-15 更新)

更新日志

  • 修复登录后还需要重复登录的问题
  • 新增网络协议切换选项(由于公司管理制度被禁止 https 协议的用户可在选项中切换为 http)
  • 修复了插件无法登录的问题
  • 修复了添加标签时模糊查询的备选标签异常的问题
  • 优化了一些体验问题

安装说明

如果能够访问 Chrome 扩展市场,搜索 「为知笔记」,点击安装,根据步骤操作即可。
本地安装

  1. 点击这里下载 chrome 扩展,解压缩
  2. 打开 Chrome 浏览器,点击右上角「菜单」-「设置」-「扩展程序」,或使用 Chrome 浏览器访问此地址:chrome://extensions/
  3. 将刚刚解压得到的 crx 文件,拖放到窗口,弹出提示要求「是否确认安装」,选择「是」

使用说明

安装了为知笔记网页剪辑器后,可以看到在工具栏或插件栏上出现为知笔记的图标。
点击该图标,出现对话框,如下图所示:

输入为知笔记账号和密码,即可进入剪辑界面。若无为知账号,可以“创建为知笔记账号”。
进入后可以看到如下图所示界面:

QQ20150923-1

  • 标题:默认为网页标题,可修改;
  • 文件夹:默认为『我的笔记』,可以展开修改;点击『刷新』可更新文件夹
  • 备注:给剪辑的网页正文下方添加备注信息;
  • 保存方式:『保存到本地』(Chrome 45 以上或 64位操作系统Chrome 不支持此功能),『保存到云端』无需安装客户端即可保存到自己的为知笔记中;
  • 保存整页处下拉菜单:有多种保存方式,如保存整页、保存文章、保存选择部分,保存URL等。

注意:

1.加载完扩展之后,已经打开的页面需要手动刷新一下才可以使用
2.chrome 45 以上版本停止对 NPAPI 支持,将无法把网页保存至本地
3.chrome 45 以下可使用『保存到本地』功能,首先确保安装最新版的为知笔记windows客户端,其次在某些高版本Chrome中,需要在浏览器地址栏输入chrome://plugins/,点击始终允许并重启浏览器


在Chrome 42版本中chrome://plugins/页面中可能没有wiz,需先启用NPAPI插件,打开chrome://flags/#enable-npapi 启用,再去查看chrome://plugins/页面。

npapi

 

 

关键词:Chrome 浏览器 插件 chrom

 

 

提示“密码错误”怎么办

你好,如果您近期发现用密码在网页版和其他端可以登录,却在某个端提示“密码错误”,请不要慌张。这是由于您在其他端上开启了新同步方式(每个端都必须使用最新版客户端)后,某些设备上还是旧版本,因无法继续使用给出的提示。请从官网下载最新版安装即可解决。各版本新版下载链接见:http://www.wiz.cn/download.html
给您造成的不便,非常抱歉。

微信活动福利名单 | 召唤获赠的小伙伴~

前天,我们向大家推荐了让 12 万人受益的战拖方法论:《战胜拖延症:跟高地清风学自我管理》音频课程,并发放了小福利。先公布获奖名单:

以上小伙伴,请在 5 月 23 日(下周二)前,与客服小知(微信号:wizxiaozhi)联系领取福利哟

从留言里能感受到,大家的确深受拖延症之害:

被拖延症爱上了的:

因为拖延耽误生娃这等大事的:

深刻反省后还是拖延了的:

一本书在身边带了 3 年一直拖延没读的:

还有分享战拖心得的小伙伴:

这位同学,你还是点击阅读原文吧,我只能帮你到这里了:

祝大家科学战拖成功!

没来得及参与的小伙伴,点击 这里,99 元购买 《战胜拖延症:跟高地清风学自我管理》

看完这 2 张图,你就知道为啥要开启为知笔记的全新同步方式了!

有人问:新同步方式到底好不好?

也有人问:新旧同步方式有什么区别?

 

那:

给两张图 + 几段文字

为你答疑解惑

 

我回答新同步「好,快,稳」

你不信!

你说我是官方说辞

那来看看

用了的小伙伴

怎么说

新同步_用户说1

我告诉你

新同步方式是增量同步,速度嗖嗖快

你不解的眼神告诉我「没听懂」

那来看看

我举的例子,拿出的数据

如:原笔记 10 M,编辑后达到 20 M

旧同步方式:需要上传/下载 20 M 的大小

新同步方式:只需上传/下载新增加的 10M 的大小

所需时间:同样网络情况下,新同步方式只需要旧同步方式的 10%—50% 的时间。

 

新同步_我们说2

小伙伴的反馈也看了

增量同步你也明白啦

接下来你需要做什么呢?

打开手机或电脑端的为知笔记

找到设置/选项 – 同步 – 手动开启「新的同步方式」

体验别人都说的「超快同步速度」

新同步-个端同步位置

最后,叨叨两句

如果你已经开启了新的同步方式

但发现有的设备上的为知笔记不能登录了

还提示密码错误

别急

到为知笔记的官网下载对应版本

覆盖安装即可。

产品更新 | 想要嗖嗖快的同步速度?方法在此

“只求嗖嗖的同步速度”

“想要精准的在线搜索”

“笔记太长,翻找想要的内容有点儿费事儿啊”

“手机上啥时候能取消已分享的笔记?查看历史版本呢?”

“主题啊,主题,我在呼唤你”

……

这些都是正在看文章的你提出的建议或疑问,我们都深深的记在了心里,默默的逐步完善。

因为我们知道,只有你们用的舒服痛快,我们才会真正的开心!

今天,全新的同步方式在所有的客户端上线了!

是的,你没有看错,手机,平板,电脑,网页同时上线新版本!

关于新的同步,更新前你一定要知道:

  • 新的同步方式采用增量同步,速度较之前的同步方式会快很多
  • 新的同步方式需要手动开启,操作步骤:「设置/选项 – 同步设置 – 开启新的同步方式 」
  • 所有客户端须更新到最新版本,一端开启了新的同步方式,其他客户端需要更新到最新版本,否则无法登录「比如:手机端开启了新的同步方式,电脑端只需要更新到最新版本,不需要重新开启」

为知笔记 windows 4.7.4 版本已上线

  • 支持全新的同步方式

    需要手动开启:点击右上角菜单 – 选项 – 同步 – 勾选「启用新的同步方式」

  • 修改笔记创建时间和编辑时间,可同步到服务器(小伙伴们可以补记日记啦)
  • 查看其他更新
  • 点击下载

为知笔记 Android 7.6.1 版本已更新

  • 全面改进同步速度,体验增量同步带来的快感

    需要手动开启新的同步方式: 设置-同步设置-勾选「开启新的同步方式」

  • 新增查看和恢复笔记的历史版本(VIP)

    阅读笔记时,点击右上角的更多,选择历史版本

  • 新增我的分享列表,可以取消分享(VIP)

    点击左侧边栏的头像,然后找到「我的分享」,查看或取消分享

  • 点击下载

为知笔记 iOS 7.6.1 版本已发布

  • 全面改进同步速度,体验增量同步带来的快感

    手动开启新的同步方式:设置 – 同步 – 勾选「开启新的同步方式」

  • 支持笔记内搜索啦

    阅读笔记 – 右下角更多 – 笔记内搜索

  • iPhone 端下载
  • iPad 端下载

为知笔记 Mac/Linux 2.5.3 版本已上线

  • 支持全新增量同步方式

    点击菜单 – 偏好设置 – 同步 – 勾选「启用新的同步方式」

  • 无网络状态下搜索,可匹配标题
  • Mac版下载
  • 注:Linux 需要自己编译,点击查看详细编译过程

为知笔记 Mac 端 Safari 剪辑器插件

拿出手机,打开电脑,更新最新版本吧!期待你的积极反馈!

近期版本预告

  • Windows 端、手机端会提供至少三种不同的颜色主题
  • 全端会提供康奈尔笔记模板
  • 手机端会支持语音速记「不仅可以语音转文字,还会保存音频」
  • 全面优化手机端编辑,会提供缩进、字体颜色、字体背景色、字号大小设置
  • 更多敬请期待

用 Mac 端 Safari 插件,一键存网页

用 Mac 的小伙伴,每天上网,通过 Safari 浏览器畅游网页,看到旅行攻略,同城活动,奇闻异事,以及专业知识,难免需要保存下来,方便日后查看。
 
因此我们专门针对 Safari 浏览器做了网页剪辑插件,只需轻轻一点,就可一键收藏有价值的网页到为知笔记,方便日后借鉴和学习。
 
下载并手动安装

 

现在,您只需要简单几步,就可以快速收藏 Safari 浏览器中的网页了。
1.

你需要知道的全新同步方式

恭喜你,你已经悄然发现为知笔记的全新同步方式了!欢迎体验!

在开始使用之前,你需要认认真真了解以下几点:

什么是新的同步方式?

新的同步方式给你的直观感受是笔记的上传和下载速度有明显提升,它使用的的是增量同步。

举例理解:一篇笔记包含多张图片,编辑时新插入一张,那么上传时只会上传新添加的图片,已经上传的不会重复上传。

如何使用新的同步方式?

你可以到 Windows,Mac,Android,或 iOS 上任意一台设备的为知笔记里,找到同步设置,然后开启选项「启用新的同步方式」。

注意: 一旦开启新的同步方式后,不能再退回到旧的同步方式。

一端开启新的同步方式,对其他客户端有什么影响?

只要在其中一个客户端的为知笔记里开启了新的同步方式,其他客户端的为知笔记必须更新到最新版本,否则其他客户端将无法登录,即无法正常使用。

如果你开启了新的同步方式,请确保各个客户端是最新版本,请核对你的为知笔记各个端是最新版

  • 为知笔记 Windows 4.7.1
  • 为知笔记 Android 7.6.0
  • 为知笔记 iOS 7.6.0
  • 为知笔记 Mac 2.5.0

暂时的三个问题你需要知道

以下三个问题是暂时问题,预计下周(最晚四月中旬)恢复正常:

4 月 2 日更新:新版中创建或修改的笔记可搜索

  • 测试版本暂时不能查看历史版本(历史版本照常生成,只是不能查看而已)
  • 新版本里创建或修改后的笔记暂时不能搜索,之前创建的笔记正常搜索
  • 网页版个人笔记暂时不能使用

新的同步方式适用范围?

新的同步方式只针对个人笔记有效,群组笔记暂时使用原有的同步方式,后续会全部支持。

看到这里,相信你已经了解了基本注意事项,是不是想开始立刻体验呢,赶紧下载测试版本吧

测试版本下载链接:

iOS用户注意:先请从iOS 端开启新的同步方式,之后再使用其他端。所以先提供邮件,之后会收到邮件,直接根据提示下载更新,开启新的同步方式,iOS确认能用,再用其他客户端,否则会导致iOS暂时不能用:

Windows 端:点击下载

Mac 端:点击下载

Android 端:点击下载

iOS 端:iOS 设备的同学,需要提供一个有效的邮箱(不一定是苹果邮箱),发邮件给 yxl@wiz.cn, 很快就会接收到测试版本了,我们是通过 Testfight 来测试的。

发送反馈

你可以加到新的同步方式测试 qq 群 538648228 反馈,也可以发邮件给 support@wiz.cn ,也可以直接在软件里找到帮助与反馈,发送反馈。

编译为知笔记客户端

简介

为知笔记桌面客户端开源,采用C++(QT)编写,GPL协议。可以在Windows/macOS/Linux上面编译运行:

macOS

Windows

Linux (Ubuntu)

源代码仓库

https://github.com/WizTeam/WizQTClient
可以直接clone或者fork

一、开发环境准备

macOS

Qt

下载Qt 5.9.0 for OS X
https://download.qt.io/official_releases/qt/5.9/5.9.0/qt-opensource-mac-x64-5.9.0.dmg

xcode

从AppStore安装即可。

CMake

从CMake官网下载dmg版本,直接拖动到应用程序目录。运行CMake程序,点击菜单->Tools->How to Install For Command Line Use,按照提示,选择安装到/usr/local/bin文件夹。

运行 QtCreator,点击菜单 – 偏好设置 – 构建和运行 – CMake 中,点击「Add」,在「Name」中输入:cmake,在「Path」中输入:/Applications/CMake.app/Contents/bin/cmake(注意:Path 所填写的路径取决于 CMake 的安装路径)。填写完毕后,点击「OK」

Windows

Qt

下载Qt 5.9.0

https://download.qt.io/official_releases/qt/5.9/5.9.0/qt-opensource-windows-x86-5.9.0.exe

Visual Studio 2013

也可以安装Express版本。需要包含Visual C++。

CMake for Window

安装后需要把CMake安装路径添加到系统路径里面。

Git

安装git 客户端,可以直接安装github桌面客户端,或者其他git客户端。

Debugging Tools for Windows

如果要在Windows下面调试QT程序,需要额外安装Debugging Tools for Windows(没有被包含在Visual Studio里面)。下载地址:
https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit

Linux (Ubuntu)

Qt

安装 5.9.0 for Linux
https://download.qt.io/official_releases/qt/5.9/5.9.0/qt-opensource-linux-x64-5.9.0.run
下载下来的安装文件,更改权限为可执行,然后执行安装程序。不要用管理员权限安装,直接安装到home目录即可,例如~/Qt5.9.0

Git

  1. sudo apt-get install git

编译工具

  1. sudo apt-get install build-essential

CMake

  1. sudo apt-get install cmake

zlib

  1. sudo apt-get install zlib1g-dev

二、Clone为知笔记源代码

可以直接clone。然后切换到分支v2.5.8或者更新的分支。也可以直接使用master分支(通常代码不是最新的)

对于Mac/Linux,可以在终端中运行:

  1. cd ~
  2. mkdir WizTeam
  3. cd WizTeam
  4. git clone https://github.com/WizTeam/WizQTClient.git
  5. cd WizQTClient
  6. git checkout v2.5.8

对于Windows,可以试用客户端clone,也可以使用命令行。

注意

  1. 如果要在windows下面编译,必须选择v2.4.4或者更新的分支,之前的版本不支持Windows。
  2. 如果参与了新同步方式内测,需要选择 2.5.0-beta 或以上分支,推荐 2.5.8 分支

三、编译源代码

运行QtCreator,选择打开~/WizTeam/WizQTClient/CMakeLists.txt这个文件

注:通常QtCreator在安装路径下面的Tools/QtCreator/bin这个文件夹里面

如果出现运行CMake对话框,在参数中,输入下面的参数:(如果不设置参数,则会按照Release方式编译)。

  1. -DCMAKE_BUILD_TYPE=Debug

点击安装Run CMake,此时将会开始配置工程。等待1分钟左右后,如果没有错误,Done按钮将可以点击。点击Done(Finish)按钮。

如果没有出现 CMake 对话框,在QtCreator左侧导航栏,点击左下角Project构建按钮,选择 Build Debug->Run WizNote,然后点击左下角Build按钮,就可以开始编译WizNote源代码了。

几分钟后,就可以开始调试或者运行为知笔记客户端了。

若出现错误:No CMAKE_CXX_COMPILER could be found.