GBF2Weibo 开发记

上周末和这周头上都一直在写那个 GBF 自动发 PO 到微博的工具(github),到目前为止也就实现了一半,后半部分自动发 PO 的功能因为新浪的限制,已经没办法做到以前 FaWave 那种形式的发送微博了。我的想法是绕路,通过在 weibo.com, 也就是网页版微博中插脚本,实现将文本插入到发送框,同时图片也插入进去,然后模拟点击发送按钮。上周日下午研究了一小时的微博首页,文本插入到发送框和模拟点击发送是能够做到的,但是就是不知道如何插入图片。在这里我又产生了一种绕路想法,就是模拟 Ctrl + C/V 的键盘操作来进行复制粘贴工作,然后,坑了。

写这玩意儿的过程中,因为需要自己获取当前的 RaidCode, 也就是那个八位参战码。GBF 页面加载完存在一个 “stage” object, 其中 .pJsnData.twitter.battle_id 就是我需要的码。那么就需要将这个码传递出来,而 Chrome 对于 Extension 是有非常严格的限制的,Extension 的 Content Script 和 Extension 本体是处于不同的沙盒之内的,所以就不能直接用 var raidCode = stage.pJsnData.twitter.battle_id 这种形式,而是要通过 Chrome 的 Message Passing API 来传递信息。苦学了好几天的消息传递都不能达到目的的时候,我想起来 Viramate 提供了外部获取数据的 API, 那我直接调用 API 来得到整理过的信息不是更方便吗?说是这么说,看了半天源码之后发现它没提供现成的 RaidCode 直接返回,发邮件询问作者之后得知,原来有提供战场数据的返回,但没有直接的 RaidCode 返回,不过已经能满足我的需求了。

其实作者在说明文档中有写这个 API, 但他写返回内容的时候写了”a bunch of shit”,所以我当时看文档的时候也就忽视掉了这个 API.

有了现成的数据源,我只需要将其解析就行了。随后遇到了一些奇奇怪怪的小问题,大部分都是新手常见问题,值得一提的是,JS 的执行时间点与其在页面里的加载位置有关系,比如说,放在<head>里的要比<body>中的早执行(表意可能有问题)。

文本生成成功了,那么就是 Boss 图片的问题了。这里又出现了新的问题,GBF 这么多 Boss, 我一个个去下图片写信息要花太多时间。于是想到 GBF RaidFinder 有提供 Boss 数据导出的 json, 那么我写一个从这个 json 中获取信息并自动下载图片的程序来自动化不就行了。请出我们的 Visual Studio 和 C#.

自动化程序的大体思路是这样的:读 json 产生对象数组 -> 数组排序去重 -> 将原数组数据根据自己需求导入自己定义的对象数组中 -> 读自己定义的对象数组中的图片 URL 并进行下载。

在写排序的时候发现自己把以前学过的排序算法都忘记了,使劲回忆了不少时间才写出了一个冒泡排序。然后是去重的问题,我并没有学习过去重算法,Google 之,众说纷纭,我选择了一个使用 List 的方案,最后以一句精简的 Lambda: if (list.Exists(x=>x.Name_EN==_mb.Name_EN) == false){ list.Add(_mb); }搞定之。现在想来原理很简单,一个条件判断——“如果 List 中不存在同名(对象属性)对象,则添加之。

对了,C# 中还有个设计就是对象数组申明之后需要进行每个数组元素的初始化即创建对象,不然会运行时报错。

感叹一句,C# 是真的方便实用,MS 已经几乎给好了你所有需要的轮子,你只需要将这些东西拼起来,自己写点胶水就可以了。对于一个 Windows 平台上的小工具来说,C# 是特别方便的。

大体上这整一套开始有实用的代码写入是周日下午,最后写完半成品是在周一晚上,第一次写一个“能用”的小玩意儿还是很开心的。

>>endl;