想了想又有一个多月没写东西了呢 →

之前 Host 还管用的时候在 G+ 上面加了个图片分享社群,每天晚上会去看看图片什么的
不过后来由于某些你知道的原因,访问 G+ 变得比较困难,而挂代理的话速度会非常慢
于是就想写个程序挂在服务器上做个代理什么的


获取数据


Google+ 对于社群有个通知功能,可以自动将 Email 发送到邮箱。通过 @zyxwvu 一晚上写的 SMTP 服务器,将邮件推送给处理程序。Google 发过来的邮件还是挺全的,作者、内容、原文链接什么的都有。而且这样还可以做到同步更新。

1IOEB5$78RP3A}`EF4GVCJG

至于为什么不用 官方 Api …… 去查查 Google 的 Api 文档,这货只给了最基本的信息发布和获取。至于社群?提都没提。

_H{1DKX@W55SGAO$X}D)L24

在 stackoverflow 上面也有相关的文章,之前是可以直接把社群 ID 当作用户 ID 获取的,不过这条路后来被封死了。
相关的请求在 google 的 issue 上面也有,不过官方一直没增加。

数据处理


经过某个不知是多少的接口和不知是什么样的传输协议 …… 嗯,传送到后台的处理程序(使用 node 编写)
处理方面做的就有点简单粗暴了,直接判断是不是来自 @plus.google.com,如果是的话读取正文,用正则匹配。需要注意的是 Google 传的邮件正文有两部分,一个是 html 一个是纯文本。为了获取更丰富的内容要使用 html 格式的内容。

// 用来匹配一般的信息
var content1 = /<table.*?><tr><td.+<\/td><td.+?>.+?<strong>(.+?)<\/strong>.+?<div.+?>(.*?)<\/div>(.+)<a href="(.+?)".+?<\/a><\/td><\/tr><\/table>/;
// 用来匹配转发的信息
var content2 = /<table.*?><tr><td.+<\/td><td.+?>.+?<div.+?font-weight.+?>(.+?)\:<\/div><div.+?>(.*?)<\/div>(.+)<a href="(.+?)".+?<\/a><\/td><\/tr><\/table>/;
// 匹配图片
var img = /<img src="(.+?)".+?>/g;

邮件中的图片链接指向的是缩略图。为了获取到高质量的图片,我们需要得到原图的链接。可以说 Google 在图片处理方面做的还是比较厚道的,简单分析之后发现连接的格式是这样的

https://lh5.googleusercontent.com/[图片ID及其他的内容]/[图片尺寸]/[文件名]

基于用不到就不管的原则,我们只需要将最后的图片尺寸改成原图即可。而文件名部分,因为获取到的名称也不一定带扩展名,基本上就是一串无意义的数据,所以直接丢弃。
通过网站访问发现,原图的代码为 s0 ,所以重组之后的连接是这样的

https://lh5.googleusercontent.com/[图片ID及其他的内容]/s0/

将所有图片下载到服务器,然后存入数据库。

终端访问


访问方式选用了 https + express,直接将证书和私钥读取之后作为参数传入即可。

var sslDir = path.join(__dirname, 'ssl');
var options = {
  key:  fs.readFileSync(sslDir + '/ssl.key'),
  cert: fs.readFileSync(sslDir + '/ssl.crt')
};

https.createServer(options, app).listen(app.get('port'), function() {
  debug('Express server listening on port ' + app.get('port'));
});

其实作为自用的服务,直接使用自签名证书也可以。不过出于方便和多设备兼容考虑,这里还是弄了个免费的 SSL 证书。
这里要注意的是,现在市面上的免费 SSL 证书基本都是 StartCom 的,而他家用来签免费证书的中级证书在很多地方不受信任,再下级的证书颁发者也是这样。如果比较介意这一点的话,要把所有的上级证书合并在一个文件中,形成完整的证书链。

之后编写一套简单的登录和展示系统就可以上线使用了。至于地址 → 保密
P.S. 在写 UI 的时候发现 FF 在我的旧本子上对 border + border-radius: 50% 有渲染错误 …… 略微闹心