wiebittetf.23.12.18

这两天本站经历了一次被嗨事件(撅望🤔可能是一周还是两周之前,我刚换新手机的时候,可以感觉到本站发表文章的速度变得肉眼可见的慢,不仅经常半分钟才能完成一次修改,甚至还能一不小心发表个文章上传三回啊三回副本(全恼🤔

但直到三天啊三天之前,在一次例行的半分钟更新中突然想看下本站浏览器打开是什么样,此时才发现主页居然被改成了某肏本twitter账号页,貌似还是个卖牙膏的😂好家伙,你事一个、一个一个一个一个肏本嗨阔啊啊啊啊啊(全恼🤔

此时令人哭笑不得的是,wp的android客户端仍然可以正常(迫真)更新文章,除了还是卡得批爆🤔登上vps一看,index.php果然被雷普得面目全非,根目录还插入了114514个🐴,甚至wp-includes之类的玩意都塞进去了一堆🐴(恼🤔

看时间戳貌似是上个月就被嗨力(某申必嗨阔甚至都懒得隐藏时间戳),理论上来说如果能在wp的各种目录里插大量🐴,那么wp-config.php它十成甚至九成也能搞到内容,进而wp的数据库也能被雷普🤔但貌似本站的数据库居然完全没被动过,不清楚是某申必嘿阔手下留情力,还是它只想挂一个一个一个一个反向代理php雷普首页就vans,说不定它批量嗨了114514个wp站然后打包卖给某申必嗨产广告商,用来给某申必肏本牙膏品牌打广告?🤔

无论如何,某肏本申必嗨阔的回合已经结束力,现在是我的回合,我需要让本站恢复正常(确信🤔现在wp-admin居然还能用,但出于某种申必原因,all in one migration插件完全没法用,也没法删除,而且我寻思就算它能用(比如我后面又删掉插件目录重装了一遍),那台只有512MB内存的垃圾vps能不能跑得动它可能是另外一个一个一个一个问题(全恼🤔

外加wp目录肯定被塞进去了不清楚多少个🐴,我就算用那款备份工具备份还原了,🐴估计还在那儿🤔所以我最终撅定将本站完全迁移到某个托管(迫真)式wp平台上,比如pikapod(确信🤔而迁移的方法,当然是先在pikapod上全新安装一个wp,装上当前用的主题和少量插件,然后直接将某vps上的本站数据库里面的所有表导出,再导入到pikapod的数据库里,全部替换掉它原来的表(确信🤔这样不仅文章和评论可以保留,甚至主题的各种配置(如果不涉及魔改php代码的话)也能保留(确信🤔

具体来说,mysqldump要是想将wp数据库里的emoji也顺利导出的话,需要设置特别的charset,比如:mysqldump --default-character-set=utf8mb4🤔pikapod那边倒是不需要多设置,它现在开放了phpMyAdmin直接操作数据库,这样就免得折腾什么申必wp插件力(确信🤔将数据库sql里面的create database字段删了,然后打包成gz后直接上传到它的导入页面,vans(确信🤔

接下来可能还剩下一个问题:pikapod的绑定自有域名功能如何和cloudflare同时使用?🤔我最后发现,它需要在cloudflare设置cname记录时,先暂时将那条cname记录便乘不走proxy,等待pikapod那边通过设置并完成证书签发后,再改回走proxy或者不改回(确信🤔当然原来那个pikapod二级域名还是可以用的,毕竟绑定的那个自有域名只不过是条cname记录而已(确信🤔

就这样,本站再次重新上线力🤔现在别的不好说,至少它打开和编辑的速度会快不少,毕竟pikapod使用了优越的web容器和数据库服务器分开的设计,再也不会出现每半天或者一天就连接不上数据库,或者诸如此类的故障(确信🤔那么下次它还会再次被嗨吗?我没法做任何保证,毕竟上次被嗨的原因我还在排查中,目前猜测是wp某个停用插件的问题,至少目前我检查的结果是我那vestacp的几十个站,只有wp那个站被塞了🐴,别的站还是那样(确信🤔某申必嗨阔貌似缺乏穿透vestacp跨站保护的能力,甚至它都不见得能突破cloudflare找到我的源站ip🤔当然也可以解释为它懒得做进一步雷普,比如提权什么的,但我已经懒得和某512MB垃圾vps撅斗114514回合力,此后那台vps将在备份数据后永久停用(吴慈悲🤔

chatgpt antics.23.01.25

今天试了下最近很火的chatgpot,让它将一段bash代码便乘javascript🤔

原始的bash代码是一段cgi-bin,用来在我这几天拖的kg0999或者gm23生成的maindb.txt里检索请求的postid,并将对应的guilded drive链接的内容返回给请求方:

#!/bin/bash

echo "Content-type: text/plain"
echo ""

postid="QUERY_STRING"
wget -c -N "https://lumine.thonk/maindb.txt"
guildedlink=`cat maindb.txt | grep "postid|" | cut -f3 -d'|'`
curl "$guildedlink"

exit 0

我在尝试将其cloudflare worker化,也就意味着我需要想办法用javascript来实现它那段grep并cut的东西,但我自己想了半天都想不出来(悲🤔扔进chatgpt里,让它将其便乘javascript,它返回了如下代码:

var http = require("http");

http.createServer(function (request, response) {

    response.writeHead(200, {'Content-Type': 'text/plain'});

    var postid = request.query.string;
    var download = require('download');

    download('https://lumine.thonk/maindb.txt', '.').then(function(){
        var fs = require('fs');
        var content = fs.readFileSync('maindb.txt').toString();
        var guildedlink = content.split("\n").filter(function(e){ return e.split("|")[0] == postid; })[0].split("|")[2];
        var guildedContent = download(guildedlink).then(function(data){
            response.end(data);
        });
    });

}).listen(8081);

console.log('Server running at http://127.0.0.1:8081/%27);

我直接惊呆了,这简直就是上述cgi-bin代码的完美再现(确信🤔它不仅准确地理解了我那段代码的意图,甚至连我原来代码里先保存成本地文件然后在本地文件里检索这个步骤都忠实地再现了,真的,我哭死(大嘘🤔

但这段代码最有用的部分其实是那段guildedlink = content.split("\n").filter(function(e){ return e.split("|")[0] == postid; })[0].split("|")[2],我算是懂了javascript里如何实现类似于bash里grep的玩意了:先用回车来对文件内容进行分割,将其便乘一个数组,然后用一个匿名函数来返回某一列(对数组元素进行二次分割)为指定内容的数组元素(也就是行🤔有意思的是我只是在grep的参数里加了一个|,它却能捕捉出我隐含的意思,就是postid一定是第一列,而且它的确如此(确信🤔这ai真にま高级🤔

我寻思如果原代码里grep的参数没有加|,即没有指定哪一列的话,它又会怎么写代码?🤔我就懒得再试一次了,八成是return e.includes(postid)(确信🤔

现在既然我知道怎么对maindb.txt进行检索了,那么cloudflare worker代码也不难写了,如下:

addEventListener("fetch", (event) => {
  event.respondWith(
    handleRequest(event).catch(
      (err) => new Response(err.stack, { status: 500 })
    )
  );
});

async function handleRequest(event) {
    const { request } = event;
    const { pathname } = new URL(request.url);
    const postid = pathname.split("/")[1].split(".")[0];
    console.log(postid);

    const response = await fetch("https://lumine.thonk/maindb.txt");

    if (bruh.ok){
        content = await response.text();
        guildedlink = content.split("\n").filter(function(e){ return e.split("|")[0] == postid; })[0].split("|")[2];
        return fetch(guildedlink);
    } else {
        return "wiebitte?";
    }

}

现在请求比如https://kg0999.wiebitte.workers.dev/$postid时,对应的guilded drive文件就会被返回🤔也许我应该移除响应里的content-disposition头,但我懒得折腾了,反正现在这坨玩意加进guildedbitte的参数里,能自动开始下就是了(确信🤔

顺便附带一个bash本地函数版本(塞进~/.bashrc里),用来在诸如cgi-bin的服务器或者cloudflare的玩意被墙时用:

alias guildedbitte='curl https://fuckeqing.pikapod.net/wp-content/guilded_extract_dir.v2.sh | bash /dev/stdin -mt '
function kg0999() {
    postid="1"
    wget -c -N "https://lumine.thonk/maindb.txt"
    guildedlink=`cat maindb.txt | grep "postid|" | cut -f3 -d'|'`
    guildedbitte "$guildedlink"
}

话说这个代码框貌似不太正常啊,bash变量的$都消失了(恼🤔反正到时候自行补上就vans了(确信🤔

thonkeqing

https://kg0999.wiebitte.workers.dev/

https://gm23.wiebitte.workers.dev/

,请(吴慈悲🤔用法非常简单,找到对应的postid,添加到上述链接的后面,然后直接扔进guildedbitte函数里面就vans了🤔其中gm23现在还在拖,所以某些早期postid如果获取不了什么链接的话,也没什么奇怪的,等吧🤔