EH Forwarder Bot:在Telegram上收发微信消息

EH Forwarder Bot (以下简称为EFB)是一个Telegram的消息转发机器人框架,目前已经实现的是双向收发微信消息。详细的信息和安装方法,请查阅 官方文档 或是 作者的Blog 。这里只讲一下优缺点。

EFB是Python 3程序,安装在服务器上(一般是VPS)之后,利用 ItChat 提供的网页版微信接口,接收和发送微信信息,同时作为Telegram Bot,向Telegram双向传递微信信息。也就是说,对于微信而言,EFB是一个网页版客户端,而对于Telegram而言,EFB是一个Bot。最终可以实现利用Teleram作为微信客户端收发微信信息。

优点

下面这些优点,有些来自EFB这种工作模式,有些是TG自身的优点。

  • 只要服务器足够稳定,并且手机微信登录状态没有变化,EFB可以一直在线,而与TG客户端是否在线无关。只在EFB第一次登录的时候需要扫码,之后没掉线,自然不用再扫。
  • 使用网页版微信,或者PC、Mac客户端时,最多只能登录一个客户端,加上手机微信,总共两个。用了EFB之后,对于微信而言,只有EFB这一个非手机客户端在线,而TG本身可以多平台多个客户端同时在线。
  • 手机版微信上的聊天记录是完整的,但是非手机版微信客户端上的聊天记录只有在线时那一部分,也无法在客户端之间同步。用了EFB,TG在所有平台上的聊天记录都是同步的,都是完整的。这样等于在全平台上同步、备份了所有聊天记录,包括聊天群的记录,以及公众号文章的标题和题图。
  • 好友撤回的消息,只要被EFB捕捉到了,就能正常看到。
  • 安装好之后,默认所有微信消息(包括群、公众号)会出现在同一个会话中,相当于是微信的时间线。这是个优点还是缺点,每个人的感觉是不一样的。同时,EFB提供了把某个好友或微信群的消息绑定到一个单独TG群组的功能。这样可以平衡一下。
  • TG客户端本身还有一些微信没有的功能。比如,可以集中管理聊天会话中出现的附件、图片、视频、音频等信息,非常方便。可以修改界面主题等。

缺点

缺点也不少,离完美还有很远。而且这些缺点主要是网页版微信的先天不足,或是TG的限制,EFW没有办法改善。

  • 网页版微信无法在聊天群里 @某人 ,EFW自然也不行。
  • 无法撤回消息。
  • 手机微信上的未读数不会自动减少。
  • 由于所有的消息在一个TG会话中,所以,发消息时,只能回复对方发来的消息。如果想主动发消息,需要先手动生成消息头,再回复这个消息头。不太方便,但是不容易发错对象。所以,对于经常联系的好友,还是绑定到单独一个群组比较方便。
  • TG的中文搜索功能非常差,只能搜索空格后的中文字。而且TG不支持导出聊天记录,也没办法导出之后再搜索。虽然有一些利用web客户端或者cli客户端导出聊天记录的做法,但是问题都比较多。所以,虽然TG保存了所有聊天记录,但是搜索不便,也出不来,可用性大大下降。

综上,对于我这种在微信中看的多、讲的少的人而言,EFB是一个不错的选项,虽然有缺陷,但是解决了核心问题,综合体验很不错。

l2tabuen-note

《An essential guide to LaTeX2e usage: Obsolete commands and packages》 是一份20多页的简短文档,介绍了常见的LaTeX错误用法和一些过时命令。 原文是德文,后来被翻译成英文、法文等 (暂无中文版)。一般的发行版中已经包含这份文档,可以使用如下命令打开。

texdoc l2tabuen

以下是不完整的概要,跳过了与德语以及外文字体有关的内容。

  • 不要使用 a4.sty 或者 a4wide.sty ,应该使用类包的 a4paper 选项。

  • 调整页边距时,应该使用 typearea.sty ,或 geometry.sty , 或 vmargin.sty ,不要使用 \oddsidemargin 之类的命令。

  • 如果对TeX不熟悉,不要修改 \hoffset\voffset 命令。

  • 不要直接修改LaTeX的类包文件,如 article.cls

  • 修改行距有三种方法:

    1. 使用 setspace.sty;
    2. 使用LaTeX命令 \linespread{<factor>};
    3. 重新定义 \baselinestretch.
  • 调整段首缩进长度时,不要使用绝对长度,如 mm , 应该使用与字体有关的相对长度,如 em 。 后者不会随着字体大小自动调整,是与依赖于当前使用的字体。 调整要使用LaTeX命令,以便保持良好的兼容性或重新定义。 不要使用 \parindent=1em ,应该使用 \setlength{\parindent}{1em}

  • 调整段落间距,不要使用

\setlength{\parindent}{0pt}
\setlength{\parskip}{\baselineskip}

因为 \parskip 会改变列表环境、目录以及页眉中项目间的间距。 应该使用 parskip.sty 。如果已经使用KOMA-Script中的某一文档类,就不用再调用 parskip.sty 了。

  • 不要在LaTeX文档中使用 $$ ... $$ ,因为这是一个TeX命令, 它会改变段公式的竖直距离,而且 fleqn 选项也会失效。 应该使用 \[ ... \]
\begin{displaymath}
...
\end{displaymath}
  • 使用 \newcommand{\<name>}{...} 定义新命令,不要使用 \def\<name>{...} 。主要是因为 \def 不会检查是否已经有同名的命令。如果之前已经有同名的命令, 不会报错,直接覆盖。重新定义命令时,使用 \renewcommand{\<name>}{...}

  • 过时的改变字体命令已经不适用于新的NFSS字体选择框架, 很多时候无法实现预期的效果。应使用相应的局部命令(仅作用于命令的参数), 或是全局开关命令(其后所有字体都会改变)。过时的命令

    • {\bf ...}, \it, \rm, \sc, \sf, \sl, \tt

    相应的局部命令

    • \textbf{...}, \emph, \texit, \textmd, \textrm, \textsc, \textsf, \textsl, \texttt, \textup

    相应的全局开关命令

    • \bfseries, \em, \itshape, \mdseries, \rmfamily, \scshape, \sffamily, \slshape \ttfamily, \upshape
  • 分式不要用 a \over b, 应该用 \frac{a}{b}

  • 居中不要用 \centerline, 应该用 {\centering ...} 或者

\begin{center}
...
\end{center}
  • 用于插入图片的过时包 epsf.sty, psfig.sty, epsfig.sty 已被 graphics.stygraphicx.sty 代替
  • 用于调整行距的过时包 doublespace.sty 已经被 setspace.sty 代替
  • 用于设置页眉的过时包 fancyheadings.sty 已经被 fancyhdr.sty 代替
  • 不要用 \usepackage{caption}, 应该用 \usepackage{caption}[2004/07/16] 指定使用 caption.sty 的v3.x版
  • 图像、表格等浮动体居中时,建议使用 \centering, 而不是 \begin{center} ... \end{center}, 以避免产生额外的竖直距离。不要这样写:
\begin{figure}
\begin{center}
\includegraphics{bild}
\end{center}
\end{figure}

应该这样写:

\begin{figure}
\centering
\includegraphics{bild}
\end{figure}
  • 附录不再是一个环境,而是用一个命令开始。不要再写成:
\begin{appendix}
\section{Blub}
\end{appendix}

应该这样写:

\appendix
\section{Blub}
  • 对于数学公式,都应该使用 amsmath.sty 包。当使用 amsmath.sty 宏包时,不要再用 displaymath, 直接用 \[ ... \] 即可。 eqnarray, eqnarray* 等环境不支持,应该用 alignalign*.

vim缓存问题

如果遇到vim报错,比如,提示 unknown function vimwiki#lst#kbd_oO ,并且安装了 spf13-vim 套件,可以删除 ~/.vimviews 目录下的缓存文件试一试。

PS. 查了很久,折腾了半天才找到地方。

下载podcast节目

提醒:请注意podcast关于版权的说明。


最近发现一些podcast的内容不错,而且已经结束或者很长时间不再更新,就希望能批量下载下来,以后慢慢听。Mac OS下没有找到合适的软件,只能用不同的工具拼凑。记录备忘。

我的要求如下:

  1. 能够批量下载。
  2. 根据feed,按目录组织文件。
  3. 能够按照标题修改文件名。

前两个要求简单,一般podcast客户端都支持。第3个少见些,但是,有这个功能才方便移动文件,脱离客户端播放。

除了iTunes,没有找到更好的免费软件。gPodder界面实在太差。Miro还不错,不过3年没有更新了,不支持中文目录和文件名。

最后用到的软件或者服务如下:

  1. http://www.podcrawler.com 可以搜索iTunes的Podcast目录,并且给出原始的RSS地址。

  2. 如果是要下载某一Feed的全部文件,可以用 podcastdl 。默认只下载mp3文件,如果是其他类型的音频文件,如m4a,可以修改源代码。

  3. 如果只下载最新的节目,可以用 upodder 。默认只下载最近30天的节目。说是可以通过参数指定天数,但是,无论是指定参数还是修改源代码,都不能下载全部节目(改了之后根本不下载)。

  4. 按照标题命名的功能只能自己写了。从Feed文件中提取标题和原始文件名,生成改名脚本。

    #!/usr/bin/env python
    # encoding: utf-8
    
    import os
    import sys
    import feedparser
    
    if __name__ == '__main__':
        os.chdir(os.path.abspath(os.path.dirname(__file__)))
    
    if len(sys.argv) < 2:
        print 'getname.py feedfilename outfilename'
        exit()
    elif len(sys.argv) == 2:
        feedname = sys.argv[1]
        outfilename = '%s.txt' % feedname
    else:
        feedname = sys.argv[1]
        outfilename = sys.argv[2]
    outfile = open(outfilename, 'w')
    d = feedparser.parse(feedname)
    for entry in d.entries:
        for l in entry['links']:
            if l['href'].endswith('mp3'):
                cmd = u'mv "%s" "%s.mp3"\n' % (l['href'].split('/')[-1], entry['title'])
                outfile.write(cmd.encode('utf8'))
    outfile.close()
    

另外,如果只知道某一podcast在iTunes的地址,可以用 itunes_podcast_rss 得到原始RSS地址。

使用latexmk自动编译LaTeX

说明,本文所述内容基于Mac OS X+TeXLive 2016。在Windows和Linux平台下可以实现同样的功能,但需要修改部分命令,请自行搜索。


latexmk 是LaTeX自动编译工具。 与make等通用工具相比,latexmk更灵活、更有针对性。使用latexmk,可以实现LaTeX文档自动编译,指定输出目录等功能。

latexmk的参数可以在命令行指定,也可以在配置文件中指定。个人推荐使用配置文件,这样可以避免命令过长,也方便与其他工具集成。配置文件可以放置在4个位置:

  1. 系统目录,如 /usr/local/lib/latexmk/LatexMk ,视系统设置而定。
  2. 个人根目录, $HOME/.latexmkrc
  3. 当前LaTeX主文件所在目录, .latexmkrclatexmkrc 均可。
  4. 任何其他位置,执行 latexmk 时由 -r 参数指定。

执行 latexmk 时,会依次在上述位置查询配置文件。建议使用第3种,即在当前LaTeX主文件所在目录放置一个 latexmkrc 文件。

latexmkrc 文件示例:

$pdf_mode = 1;
$pdflatex = "xelatex -file-line-error --shell-escape -src-specials -synctex=1 -interaction=nonstopmode %O %S;cp %D %R.pdf";
$recorder = 1;
#$pdf_previewer = "SumatraPDF -reuse-instance -inverse-search -a %O %S";
$pdf_previewer = "open -a %S";
#连续编译模式
$preview_continuous_mode = 1;
$pdf_update_method = 0;
$clean_ext = "synctex.gz acn acr alg aux bbl bcf blg brf fdb_latexmk glg glo gls idx ilg ind ist lof log lot out run.xml toc dvi";
$bibtex_use = 2;
$out_dir = "temp";
#指定生成PDF文件的文件名,可以与LaTeX主文件名不一致
#$jobname = "Book";

使用上述设置,编译:

latexmk main.tex

latexmk 会根据情况,自动执行多次编译。编译完成后不退出,处于等待状态,监视源文件。一旦有更新,会实时编译,并刷新PDF阅读器(要求阅读器支持,如skim)。编译生成的文件都会输出到$out_dir指定的目录。但是,将最终的PDF文件复制到当前目录(代码第2行最后的命令)。

使用

latexmk -c

可以清空临时文件。临时文件对应的扩展名由 $clean_ext 指定。

VIM用户可以配合 vimtex 一起使用。


参考链接: