時計坂一刻館三号室

在 Firefox 中将 Thunderbird 设为默认 RSS 阅读器……

屈超(沙滩凉鞋) 发表于 2008 年 6月 3 日 7 时 42 分

Set ThunderBird as Default RSS Reader in Firefox

之前主要用 Google Reader ……
但在线工具毕竟是在线工具……
没有手感 -__- ……
在我还没下定决心用 Google Gear 之前……
我想到了用 ThunderBird ……

好歹自己也算是个 ThunderBird 的拥趸了……
不仅仅只是把它作为一个邮件终端……
还利用其强悍的 Filter 和 Tag 功能管理邮件列表、订阅新闻组……
然后配合 LightningGoogle Calendar 和 Treo 来实现 GTD ……
这次将其提拔为 RSS 阅读器实在是最近有点儿心痒……
想折腾折腾工作环境……

好吧……
入正题……
有人可能会问……
Firefox 不是允许选择线下 RSS 阅读软件么?」
是的……
的确可以……
但是你可以指定 ThunderBird 作为阅读器试试看……
点击 “Subscribe Now” 后除了呼出 ThunderBird 外并没有执行订阅操作……
自家人都不认自家人了……
像个什么话!

屡试屡爽之后……
我意识到这可能是个 Bug ……
二话不说上 Bugzilla 一搜……
果然就就是 Bug 350735 ……
不过前年的 Bug 至今还没解决还真是有点儿那啥……

继续搜索……
找到几种解决临时方案……
其中在 MozillaZine 论坛找到的方案应该是最通用的一种了……
作者 alta88 说是由于 Thunderbird 接受 Feed 的参数与 Firefox 发送的不符而造成的……
知道原因就好办了……
马上搜索 ThunderBird 源码……
在 components\newsblog.js 中找到了如下代码:
(Portable ThunderBird 位于 App\thunderbird\components\newsblog.js)

  1. /* nsICommandLineHandler */
  2. handle : function(cmdLine)
  3. {
  4. // we only care about "-mail someurl" where someurl is a feed: url
  5. // we also don't want to remove the parameter in case we don't end up handling it...
  6.  
  7. var mailPos = cmdLine.findFlag("mail", false);
  8. if (mailPos != -1 && cmdLine.length >= mailPos )
  9. {
  10. var uriStr = cmdLine.getArgument(mailPos + 1);
  11. if (/^feed:/i.test(uriStr))
  12. {
  13. var mailWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService()
  14. .QueryInterface(Components.interfaces.nsIWindowMediator).getMostRecentWindow("mail:3pane");
  15.  
  16. // if we don't have a 3 pane window visible already, then we can optimize and do nothing here,
  17. // that will let the default command line handler create a 3pane window for us using the feed
  18. // URL as an argument to that window when it gets constructed...so we only care about the
  19. // case where we want to re-use an existing 3 pane to subscribe to the feed url
  20. if (mailWindow)
  21. {
  22. cmdLine.handleFlagWithParam("mail", false); // eat up the arguments we are now handling
  23. cmdLine.preventDefault = true; // prevent the default cmd line handler from doing anything
  24.  
  25. var feedHandler = Components.classes["@mozilla.org/newsblog-feed-downloader;1"].getService(Components.interfaces.nsINewsBlogFeedDownloader);
  26. if (feedHandler)
  27. feedHandler.subscribeToFeed(uriStr, null, mailWindow.msgWindow);
  28. }
  29. }
  30. }
  31. },

显然可以看出……
ThunderBird 要求 Feed 作为 Mail 参数来传递……
具体格式为:

  1. thunderbird.exe -mail feed:URL

我在命令行下测试如下命令……

  1. thunderbird.exe -mail feed:http://www.quchao.com/feed/

果然成功地订阅成功……

问题找出来就好解决了……
两种方案……
让 Firefox 附上参数……
或让 ThunderBird 忽略参数……
显然添加参数比忽略参数要安全……
毕竟 ThunderBird 不只是 RSS 阅读器而已……
忽略掉参数怕会影响其它的服务哟……

那么就拿 Firefox 开刀吧……
看了 alta88 的解决方案……
他增加了两个 pref 变量用来保存参数和 Feed 协议……
很通用的方法……
但我个人觉得没有必要……
不如直接判断阅读器的文件名……
包含 Thunderbird 变添加参数后发送……
一来不必往 Pref 里添加并不常用的变量……(洁癖作祟?)
二来其它 RSS 阅读器没准就直接支持 Firefox 的方式……

我的修改方法如下:
找到 Firefox 的 components\FeedConverter.js 文件……
(Portable 版本位于 App\firefox\components\FeedConverter.js)
搜索:

  1. var ios =
  2. Cc["@mozilla.org/network/io-service;1"].
  3. getService(Ci.nsIIOService);
  4. var feedURI = ios.newURI(spec, null, null);
  5. if (feedURI.schemeIs("http")) {
  6. feedURI.scheme = "feed";
  7. spec = feedURI.spec;
  8. }
  9. else
  10. spec = "feed:" + spec;
  11.  
  12. var ss =
  13. Cc["@mozilla.org/browser/shell-service;1"].
  14. getService(Ci.nsIShellService);
  15. ss.openApplicationWithURI(clientApp, spec);

替换为:

  1. // Hacked by Chappell.Wat from http://QuChao.com @ 2008-6-3
  2. if (clientApp.persistentDescriptor.toLowerCase().indexOf('thunderbird') != -1) {
  3. var targetFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
  4. try {
  5. targetFile.initWithPath(clientApp.persistentDescriptor);
  6. }
  7. catch(e) {
  8. alert(e);
  9. return(false);
  10. }
  11. if (!targetFile.exists()) {
  12. alert('Client Does Not Exists.');
  13. return(false);
  14. }
  15. spec = 'feed:' + spec;
  16. var process = Cc['@mozilla.org/process/util;1'].getService(Ci.nsIProcess);
  17. process.init(targetFile);
  18. var arguments = ['-mail', spec];
  19. process.run(false, arguments, arguments.length,{});
  20. } else {
  21. var ios =
  22. Cc["@mozilla.org/network/io-service;1"].
  23. getService(Ci.nsIIOService);
  24. var feedURI = ios.newURI(spec, null, null);
  25. if (feedURI.schemeIs("http")) {
  26. feedURI.scheme = "feed";
  27. spec = feedURI.spec;
  28. }
  29. else
  30. spec = "feed:" + spec;
  31.  
  32. var ss =
  33. Cc["@mozilla.org/browser/shell-service;1"].
  34. getService(Ci.nsIShellService);
  35. ss.openApplicationWithURI(clientApp, spec);
  36. }

原理是判断阅读器文件名……
包含 “thunderbird” 便发送 -mail 参数……
至于为何要换 openApplicationWithURI 函数为 run ……
事出无奈……
openApplicationWithURI 似乎无法发送形如 -mail feed:URL 的参数……
且源码应该是被封在 browser.xpt 里……
不过使用效果一样就行了……

最后……
轮到测试时间了……
测试之前我建议还没有在 ThunderBird 里建立 RSS 账户的朋友去新建一个……
(File -> New -> Account… -> RSS News & Blogs)
我当初修改了好久均无法调用订阅动作……
看了代码才知道是没有 RSS 账户提供绑定……
(详见 components\newsblog.js 文件的 120-132 行 )

下面跟着我一起访问 feed:http//www.quchao.com/feed/
(要是觉得慢也可以自己随便找个源喔……)
浏览器会把你带到订阅界面……
在下拉菜单中选择 “Choose Application” 并定位于你的 ThunderBird ……
(如顶图)
接下来猛击 “Subscribe Now”……
不出意外 ThunderBird 应该被激活(或启动)来验证 Feed 地址……
如果验证无误……
这个 Feed 应该就乖乖躺在你的 RSS 账户里了……
如果没有它躺下……
您可以在本文后留下您遇到的问题……
我会尽力解答……

Use FolderPane Tools to change the order

题外话一:
如果你和我一样由于邮箱太多……
新建的 RSS 账户位于底部看不见的话……
我建议使用 FolderPane Tools 来调整账户的顺序……
(如上图)

题外话二:
如果你和我一样不习惯将 RSS 和 Mail 数据放在一起的话……
你可以看看这篇文章……
顺便说一下我的 RSS 账户 ID 是 11……
(现在你知道我到底在 ThunderBird 里放了多少东西了吧)
修改完后……
RSS、邮件和新闻组的数据放在不同的文件夹……
看着舒心……
用着也放心……

题外话三:
很早之前用过一个名为 RSS News Ticker 的软件……
相当好用……
但是该软件的更新是全局式的……
比如你设置 10 分钟更新一次……
那么不管 RSS 有没有显示完它都会“敬业”地进行更新……
我的想法是仅仅订阅一个源……
这个源包含所有我未读 RSS ……
是否能通过编写 Thunderbird 扩展来完成呢……
考虑ing……

微量修改为 Lightning 默认添加 SMS 方式提醒……

屈超(沙滩凉鞋) 发表于 2008 年 1月 21 日 22 时 59 分

ThunderBird + Google Calendar = My GTD Tools

Lightning 其实是加装了行事历功能的 ThunderBird ……
大约等于 ThunderBird + SunBird ……
其实一直以来使用 ThunderBird 作为邮件和新闻组客户端……
这次之所以加装了 Lightning 扩展……
完全是因为想从 Treo 阵营中叛逃了……

目前在 Treo 上我使用 Agendus 作为日程管理工具……
然而 Agendus 太过于臃肿(而且不太稳定)……
而 Palm 内置的行事历等功能却过于简单……
思来想去我还是决定为叛逃 Palm 阵营做准备了……

最初是想直接 SunBird 的……
(因为最近也发现了其 Portable 版本……
不用担心用户资料夹的备份问题……)
后来想了想单单为了行事历就重新放一个程序在 Tray Bar 的确不太符合我的风格……
更何况我既然决定叛逃……
联系人当然也得大规模转移……
于是乎我给 ThunderBird 加装了 Lightning 扩展……
这样一来……
它就变成了一个足以满足我 GTD 需求的软件了……
(反正我也将其缩在 Tray Bar 随时检查邮件……)
而且合理地与 Firefox 分开……
却不至于使用 MozillaSeaMonkey 套件……
总而言之言而总之我很满意……

而随之后来的惊喜……
则是当我寻求 Treo 与 Google Calendar 的 Sync 方式时……
(我想把目前我手机上的行事历等信息转到 Google 日历上去……)
一不小心找到了 ThunderBird 的 Provider for Google Calendar 扩展……
通过这个扩展便可以实现 Lightning 和 Google Calendar 的资讯同步……
试用了下……
很好很强大……
这样一来我完全就实现了 Treo 650、ThunderBird 和 Google Calendar 的三方同步……
(当然联系人我还是通过 vCard 中转的……)
我想即使哪一天我叛逃了 Treo 加入了水果阵营……
三方同步的方案依然有效……
啥叫现代化作业……
这就是……

当然啦……
唯一令我不满意的还是从 ThunderBird 向 Google Calendar 同步时……
默认的 Reminder 是 Alert ……
表现在 Google Calendar 上是一个 JS 的 alert 而已……
问题是谁没事儿老挂在 Google 上……
再者说了……
要是我出门儿了呢……
您上哪儿 alert 我去……

这个问题是 Provider for Google Calendar 目前的功能限制……
我看了它的下代码……
作者应该是有能力(而且有迹象)解决这个限制的……
既然作者忙……
咱就勤快一回……
为其添加 SMS(手机简讯提醒)的默认方式提醒……
步骤如下:

步骤 001:买个手机……
步骤 002 - 步骤 253: (有关手机的使用…… 略……)
步骤 254:去 Google Calendar 绑定自己的手机号……
步骤 255:为 ThunderBird 安装 Provider for Google Calendar 扩展……
步骤 256:以 Google Calendar 为 Provider 在 ThunderBird 里添加一个行事类别……
步骤 257:找到该扩展的储存目录……
我的是 Portable 的……
因此在 Data\profile\extensions\{a62ef8ec-5fdc-40c2-873c-223b8a6925cc} 下……
传统版本请自行在系统盘中寻找……
步骤 258:打开 js\calGoogleUtils.js 进行修改……
搜索:

  1. entry.gd::when.gd::reminder += gdReminder;

在下方添加:

  1. // Hacked by Chappell.Wat @ QuChao.com on 1/21/2008
  2. gdReminder.@method = "sms";
  3. entry.gd::when.gd::reminder += gdReminder;

步骤 259:重启 ThunderBird 使其重新读取该设置……
步骤 260:完成……

大功告成……
仅用了 260 个步骤……
这样修改之后凡是设置了 Reminder 的事件……
默认均会提交 alert 和 SMS 两种提醒方式……
如果你有兴趣还可以加上 email 方式……
你甚至可以根据自己的情况使多种提醒“纷至沓来”……
具体的修改可以阅读 Google Calendar 的 API 文档……
由于每个人的要求不同……
我就不多置喙了……

另外……
为了实现手机端的同步……
我为我的 Treo 加装了 GooSync 的软件……
了完美转移联系人并实现生日提醒……
我给 ThunderBird 安装了 MoreFunctionsForAddressBookThunderBirthDay 扩展……
为了了解天气和农历情况……
我给 Google Calendar 订阅了 Weather & Lunar 表……
为了最大限度保证安全……
我给 Firefox 安装了 Google Services in HTTPS 用户脚本……
………………
总之……
我的 GTD 转移工程几乎快要完成了……
愿和其它同类用户进行交流……
今天就到这里……
睡觉……

=============================================

[080122]
关于绑定手机号……
我还要多说一句……
我本身整个系统和环境都是英文的……
所以去 Google 绑定时它只要求我确认地点即 China ……
并未对服务商进行要求……
而我本身则使用的移动的服务……
事实证明是可以收取短信通知的……
有心的朋友应该也注意到了……
Google 发过来的号码来竟是腾讯的……
难道预示着什么……
哈哈哈哈……
补一张图来说明一切……
Google Calendar SMS Notifier

SpeciLink Decoder/Encoder Extension 1.0 for Firefox 正式发布…

屈超(沙滩凉鞋) 发表于 2008 年 1月 9 日 6 时 45 分

SpeciLink Decoder/Encoder Extension 1.0 for Firefox - Icon
SpeciLink 以 Special Link 合成命名……
指以下三种“著名的”专用链接协议……

迅雷(Thunder)的 thunder://
快车(FlashGet)的 flashget://
旋风(QQDownload)的 qqdl://

SpeciLink Decoder/Encoder Extension 1.0 for Firefox - Addon Preview

目前版本 1.0 ……
支持将普通链接协议(file, ftp, http, mms, rstp 和 https)
与上述三种特殊链接进行多方转换……

SpeciLink Decoder/Encoder Extension 1.0 for Firefox - Context Menu Items

由于是初始版本我只自己翻译了如下四种语言包……

美式英语(en-US)、日本语(ja-JP)、简体中文(zh-CN)和繁体中文(zh-TW)

由于扩展的目的相当单纯……
因此基本支持所有平台的 Firefox ……
扩展中规定的是兼容 1.5 - 3.0 beta 3 ……
如果您发现您用不了……
给我留言吧……

装方法不再冗述……
下载了拖进 Firefox 即可……

使用方法“冗述”如下……
首先找到需要解密的资源链接……
本例中选择的是快车专用链接……
注意看状态栏……

SpeciLink Decoder/Encoder Extension 1.0 for Firefox - Guide step 1

在该链接上点击右键……
出现了 SpeciLink 选单……
出现了与快车相关的三个选项……
分别是解密和转换为其它两种专用连接……

SpeciLink Decoder/Encoder Extension 1.0 for Firefox - Guide step 2

选择第一项对其进行解密……
无声无息地完成了操作……
再次移到链接上……
发现链接已经被解密为普通的 http 链接……
注意看状态栏……

SpeciLink Decoder/Encoder Extension 1.0 for Firefox - Guide step 3

既然已经被转换为普通链接……
您就可以使用您喜欢的下载方式(工具)来下载它了……

SpeciLink Decoder/Encoder Extension 1.0 for Firefox - Guide step 4

今早已经提交到火狐官方了……
没想到这么久没去……
竟多了个 SandBox 系统……
看来本扩展想从 SandBox 转到 Public 还得耗上点儿时间……
那么直接在本日志提供下载吧……
注意日志尾部……

这是俺的第二款 Firefox 扩展……
花了一晚上……
初衷其实是想方便自己下载那些专用链资源……
因为自己使用的 Firefox + FlashGot + IDM 的组合……
如果你也和我一样有此烦恼……
(人数肯定不多…… -__-)
我相信它一定还是对你有一定帮助滴……

下一步……
准备直接调用 FlashGot 等下载管理器试试……
还有添加少量选项……
恩……
今天就到这儿了……
有意见请留言……

提供下载……

国外: http://www.QuChao.com/projects/specilink/specilink_1.0.xpi
国内: http://VIP.YYJoy.com/Chappell/specilink/specilink_1.0.xpi

播放器加载中……
读取中……
图书数据加载中……
读取中……
剧集数据加载中……
读取中……
专辑数据加载中……
读取中……
2008 Firefox+ Summit
歌曲数据加载中……
读取中……
通讯方式加载中……
读取中……
QR Code 加载中……
读取中……