Emoji字符画着玩

 🌤️
   ☁️☁️  ☁️
 ☁️    🕊️
🌧️            ☁️

            🏇

删除僵尸粉的自动化

在删除僵尸粉的自动化方面,做了一点微小的工作,免费分享一下。

准备过程有点复杂,既然是免费分享,服务支持是谈不上了,我只介绍大体如何设置,能看懂的应该就克服各种困难了,看不明白的也不能多解释了……

  1. 64位Windows点这里,32位Windows点这里,获得Python编程语言。确认勾选“Add Python 3.8 to PATH”,其他一切按默认设置安装。(约5分钟)
  2. 右击桌面左下角Windows图标,选“运行”,输入pip install selenium安装Selenium,这是用来遥控Chrome浏览器的Python模块。(约1分钟)
  3. 点这里获得Chrome浏览器并一切按默认设置安装(约5分钟,已有Chrome可跳过)。
  4. 点这里获得Chrome Driver,或者,假如你已经有Chrome,可以到这里下载一个版本匹配的Chrome Driver,把解压后的.exe文件放到一个可执行路径目录里,如:C:\Windows。(约2分钟)
  5. 点这里下载僵尸清除程序,解压后存到任何地方都可以(比如桌面)。右击解压后的spamfancleanse.py,Edit with IDLE,把下图所示的开头三行改成你真正的登录信息和用户信息(放心,源代码开放,信息安全经得起同行的严厉审视),Ctrl-S存盘,按F5运行。

对于首次使用、中途也无意外的用户来说,不疾不徐走完上述设置步骤大约需要15分钟。如果你的粉丝总数小于200,那么手工删除更加省时稳妥。

其它信息:

  1. 删除粉丝是个无法回退的操作,请谨慎使用,作者对使用此免费程序带来的任何后果不承担责任。作者自己是从295,000删到4,400左右的,程序很有效,但很打击虚荣心。
  2. 这个程序并非黑进了渣浪的后台数据库,所有的浏览和删除都和正常的手动操作无异,看到的数据也并无不同。它只是接管了枯燥的翻页和点按鼠标的动作,不叫苦不嫌累而已。另外,“病来如山倒,病去如抽丝”,删除僵尸粉的过程是很“稳健”的,最快两秒一个,不能更快了,否则会被渣浪服务器拒绝访问。
  3. 程序运行时,Chrome受控换页翻屏、菜单弹出收起的各种动作很好看,但不要多看,谨防沉迷。
  4. 如果设置第1步骤未选择“Add Python 3.7 to PATH”,那么第2步骤会出现一闪即关的窗口,内容是抱怨找不到pip在哪里。正常的第2步要花一两分钟才能完成。
  5. 如果你的Chrome开着自动更新,那么就要让Chrome Driver的版本跟上,否则二者相差太多时,程序就打不开Chrome窗口了。当这种事情发生时,到这里来重做一下第4步即可(我一直保持着第4步的链接指向最新版本)。假如设置第4步中Google APIs的站点不好用,可以到其镜像站点获得Chrome Driver。
  6. 如果登录密码含有单引号( ’ ),那么在第5步骤设置密码时,要在密码的单引号之前加个反斜杠( \ ),写为 \’ 。
  7. 开发是在Windows上完成的,设置步骤也只提到Windows,但有使用者反馈:在iOS上程序也可顺利运行,只需下载iOS版的Python、Chrome及Chrome Driver即可。
  8. 随时可以关闭Chrome浏览器窗口中止程序,关闭时,监控小窗里会出现可忽略的错误信息。程序会随时把执行进度存到本地同目录的一个数据库里面,下次运行时会记得处理过谁,没处理过谁。数据库文件是本地同目录的spamfans-userid.db,由程序第一次运行时产生。
  9. 第一次运行时它会根据上面3行代码登录,以后再运行时,它就记得登录状态了(存在上条提到的数据库里)。如果它偶尔忘记,还会根据代码里的信息再填。
  10. 如果程序跑了一段时间后,想转移到另一台机器上运行,除了设置说明里提到的那些步骤外,还要把spamfans-userid.db文件一道拷过去,和spamfancleanse.py放到同一目录下。
  11. 程序运行时,尽量不要把鼠标在Chrome窗口上指来指去,不要把Chrome窗口最小化(用其它窗口遮蔽没事),以免干扰到它。业务十分繁忙的大V最好关闭转发和评论的小黄签提醒,它们可能会让页面元素失效,并使程序异常退出(如其发生,重新运行即可)。
  12. 不是每次运行都需要IDLE打开程序再按F5的,只要把登录信息设置好了,在Windows下双击spamfancleanse.py文件图标即可运行程序。在这种模式下,左击调试监控窗口会造成程序暂停,右击则会继续。
  13. 不建议在多台机器上同时跑这个程序,虽然不会造成误删,也确实能提高效率,但多台机器对粉丝的密集访问可能会被渣浪留意到。被留意到之后,渣浪可能会只让你看少数几页粉丝列表,看不到粉丝列表=不知道谁粉了自己=无法继续删除。
  14. 对“僵尸”的初步定义是发帖少于10,或者跟此人ID体现的注册年代不般配的(很早的ID,却发帖甚少,没有传播力)。程序还会对初筛过的ID一个个翻看主页,最近3个月没说过话的会被移除(原创或转发都算“说话”,而系统产生的生日祝福、会员升级或者抢红包都不算)。躲过一次巡视的并非永久安全了,程序还会根据其发博情况安排下次巡视。如果不想被判为僵尸粉,最重要的不是跑博主这里点赞或发“活粉报到”之类的评论,而是赶紧自己发博转博,提升自己在程序眼里的传播力。次年9月2日,加入了对“会说话的僵尸粉”的判断。这种帐户会隔三岔五地喃喃自语,发表空洞的人生感悟或者爱情宣言。
  15. 有时会在监控窗口里观察到程序针对某个ID反复输出UNSURE,这种问题通常是因为这个用户资料发博甚多,主页却空空如也(渣浪登记的微博数常常大于用户实际的发博数,要不说它渣呢),但程序不确定是服务器原因还是别的什么,所以不敢轻易下手删除。对于这样的用户,另开个浏览器手动删除即可,程序再来观察时会发现已被删除,就不再理它了。
  16. 12月16日,在程序里加了个改进:当逐页扫描撞上沙里淘金浓缩而成的活粉大军时,它会跳过这段漫长的扫描,这样可以节约很多时间。另外,在反复筛查时,又会有较低随机概率扫描活粉大军,确保没有僵尸混进来。
  17. 12月18日发现,渣浪偶然会误报用户数据,把活跃用户的关注、粉丝、发博数报得极低(最甚者以上三个数都是零),造成“这是僵尸粉”的误判。对此偶发问题的应对方法是:当重逢某ID,发现微博所报其发博数急降时,则判为误报,不予理会。对于首次见到的ID,若有此问题,则无法解决。好在这种问题发作频度极低,写好应对代码之后,24小时未重现。
  18. 次年8月17日,解决这个问题:假如一个粉丝(或者自己的小号),确知是个活人,却非常低调,只看不说,表现和僵尸一样,怎么办?两个办法:一是互粉,本程序不会碰互粉帐户。二是做一个文本文件.txt,每行写一个要特赦的用户的10位ID,然后把此文件拖拽到exempt-fans.py文件图标上去。在spamfancleanse.zip压缩包里有一个示例exempted-uid-example.txt。
  19. 次年9月4日,关掉了图片加载。纯文字的页面显示得更快更稳定(我怎么不早这样做呢)。9月11日,支持微博的所有四种语言界面。
  20. 结合《打僵尸大捷报告会》服用,能帮助理解这个程序的执行流程。

和注册机器人的战斗

帮朋友代管一个问答站点。这个站点常常被发垃圾广告的盯上,而且使用注册发帖机器人,潮水般地往上冲。最近一次大规模攻击出现在10月15日晚上到16日早晨,总共产生了43000多条垃圾。

因为只是代管,所以我并不能接触到后台代码和数据库,只能使用网页管理界面来清理垃圾。而这些网页界面又有点残疾,例如,删除垃圾问题时,虽然提供了多选勾框,却只能删除顶头一个。

汇总一下,手边能用的抵抗工具有:

  • 关闭新用户注册。
  • 删除垃圾用户的网页界面(每次只给删20个)。
  • 删除垃圾问题的网页界面(每次只给删1个)。

好在我还是个程序员,虽然并不穿格子装。当天下午,我用JavaScript写了个网页,把垃圾用户/问题的编号范围输入之后,点一下“清理用户”,它就会循环往复地按照原站点期望的格式生成form,并提交删除。按照每秒清理10个用户的速度,很快就干干净净了。

这个清理工具有点小花样:提交删除表格时,会在新窗口打开(否则退不回来,就没法循环执行),打开的新窗又要在5秒钟后关闭(否则任务一多,浏览器的窗口就密密麻麻了)。这样,浏览器不停地弹出新窗又关掉,忙得不亦乐乎的样子,煞是好看。

写好这个清理工具之后,把它往自己的网站上一丢,就可以放心地出去玩了。即使问答站点再遭攻击,我也可以从手机上远程清理了。执行清理代码的权限依赖于事先在问答站点上成功登录,所以也不担心链接泄露被网络爬虫乱点按钮。

接下来我又想:事后发现并清理,终究显得有点被动。当我忙着做图写东西时,还得随时盯着站点,就太分心了。JavaScript在读取外域网页时功能有限,所以我用PHP写了个新版本,能代刷网页,发现出事时,能自己清理。不过,本质上,这个工具就和注册机器人一样了,这大概就是传说中的“终于活成了自己讨厌的人的样子”。

自动防御工事的逻辑是:

  • 每隔一段时间,读取主页上的注册用户数目。
  • 如果突然出现不合常理的激增,则判定为注册机器人攻击。
  • 判定攻击后,首先关闭新用户注册功能,掐断垃圾源头。
  • 接下来,向站点提交表格,删除在此期间出现的所有新用户。
  • 静候半小时后,重新开放注册功能,但半分钟后回来检视一下,看看攻击是不是还在继续。
  • 如果攻击还在继续,再次关闭新用户注册,清理这半分钟产生的小垃圾,如此循环往复。

刚刚写好新工具,一个小机器人就吹着喇叭发动了祭旗式的攻击(上图的UNDER ATTACK指的就是它),攻击从当天傍晚6点持续到次日凌晨零点。刚才说过,每次检测出批量攻击时,程序会先关闭用户注册半小时,然后打开,半分钟后再杀回来重新看一眼。对面这个小机器人在这每次间隔半小时的半分钟缝隙里,急急忙忙地创建垃圾用户,几个小时过去,它用掉了将近一百个帐户编号,也算是相当执着了。

今天早晨出了个巧之又巧的小意外。在网页刚刚启动,进行30秒热身刷新时,放在本站的服务器突然跳表,时间戳从23:01:32跳回23:00:20,呛死了我的防御工事。

它的判断逻辑是“假如新注册的用户数乘以某比率,大于刚才流逝的秒数,则判断是注册机器人攻击。”而这里,虽然新注册用户为零,但“刚才流逝的秒数”是个负值……万幸的是,我从做JavaScript版时,就设了个保险杠,此杠以内的老用户无论如何不能碰。所以虽然代码走进了“删除某些用户”的那一块,却立刻被驳回了。

感谢这个服务器提供的意外test case,这部分代码已加固,不会再被弄死了。

后记:晚上在本站服务器上把玩这个程序时,跳表现象又出现了。不禁大感兴趣,细细研究一下这个现象的来源。它发作得如此频繁,使我无法相信有个系统管理员坐在那里没事调时钟。更像是有多台负载均衡服务器,它们的时钟不一致。

写了个小网页,每5秒输出一次系统时间,在完美世界里,应该获得一条单调上升的直线。然而我实际得到的,是剧烈颠簸的数据。使用Excel画出来就更加一目了然,共有三条直线,说明至少有三台负载均衡,其中两台差异不那么大,而第三台慢了许多。如果拿中间一条线做参照的话,最上面的时钟快了23秒,最下面的则慢了108秒。

金色记忆

山竹的假寐

台风“山竹”跨越吕宋岛前后

山竹横跨吕宋岛之后,台风眼走着走着就没了?

都是假象,“一闭,一睁,一天过去了。” 合眼打个盹,脚一趟到海面,又来了精神。

动图由来自日本向日葵8号卫星的82幅图片合成。

文成公主是哪位度母的化身?

一直在中文网站上看到:藏胞认为,文成公主是绿度母化身,尺尊公主是白度母化身。查看松赞干布左衽服装时,忽然想认真核实一下这个认知。

查询英文站点的结果,白绿相反:尺尊公主绿,文成公主白。

英文维基上的尺尊公主词条

注重考据的英文维基百科也没有指明这个说法的来源。藏文资料搜不到,看不懂(这是主要原因!),还是从图片中寻找线索吧。

曾在2011年国博唐卡展上拍到《释迦牟尼佛迎请入藏图》唐卡,左上角颂子出现了“文成公主”字样,右上方云气(从公主手中宝瓶所生)所托主尊则是白度母。​

释迦牟尼迎请入藏图

《佛陀迎请入藏图》左上方偈颂

公主头顶云气里的白度母

所以,多数中文网站上的内容(很多是互相抄袭)说反了?

为了更好地核实右边所坐公主是文成而非尺尊,再多看一些细节。​

公主和松赞干布相对而坐,她座下的官员身着汉式服装。虽然官帽长帽翅是宋朝样式的,也不该有帽正,还不伦不类地挂了一串佛珠,还是能看出浓郁的汉式气息。和左侧(松赞干布一侧)群众的白头巾对比,汉族气息更浓郁。

左侧藏式和右侧汉式服装的对比

更有说服力的一个细节是公主座侧的珊瑚树瓷瓶,上面是八仙纹样。来自尼泊尔的尺尊公主一定不会有这样的瓷瓶。但我必须要说:八仙纹样出现在珊瑚树瓶上,跟公主座下的宋式官帽一样,也是个时空交错的bug——如同《封神榜》里的姜后泣而言曰:“古人云:‘粉骨碎身俱不惧,只留清白在人间。’”

公主座侧瓷瓶上的八仙纹样

所以,画面中的这位公主,从形象到文字说明,都可以确认是文成公主。其头顶云气里的形象说明,至少作画者认为白度母​是文成公主的本尊。

​自己的功课做得差不多了,就可以拿起电话,直接​打给藏族朋友了。他说:甲姆萨(文成公主的藏文称呼)是白度母,巴姆萨(尺尊公主的藏文称呼)是绿度母。

顺便说说,唐卡中的文成公主,也是入乡随俗的左衽呢。

左衽的松赞干布

松赞干布,图片来源布达拉宫

清代·铜鎏金松赞干布及二妃像(题图),扎什伦布寺藏,首都博物馆《天路文华》所见。松赞干布被认为是观音菩萨的化身,造像规范头巾中藏阿弥陀佛像。二妃是文成公主和尺尊公主,分别被认为是绿度母和白度母的化身。刚刚留意到他们的衣服左衽,查了一下布达拉宫造像(右)和敦煌壁画赞普像(下),果然都是左衽。

和而不同——四川木雕

日偏食

在成都,今天日偏食的可见时间是18:46到19:27。本来想科学一下,每两分钟拍一帧做动画,结果刚刚拍了六帧,就来了一片几十分钟也散不去的浓云……放弃科学转文艺。太阳沉到云中之前的倒数第二张,离成都的食甚只差6分钟,而且画面里出现了飞机!挺好,不遗憾。

考古成都