V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zzerd
V2EX  ›  推广

自已家的赣南脐橙开卖,给 v 友抽几箱

  •  
  •   zzerd · 31 天前 · 7145 次点击

    抽奖规则和去年一样取上证指数和最后指定日期最高楼。上一年的帖子/996196

    今年取 2024-11-22 上证指数收盘价作为随机数种子,有效抽奖用户为 2024-11-22 帖子回复最高楼层前的所有所有人

    去年的抽奖代码没有去重所有回复多个的用户中的概率高一点点,今年我用 ai 糊了一下。代码如下

    const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36';
    
    async function handleRequest(tid, num, seedParam, maxFloor) {
        if (!tid || isNaN(num)) {
            console.error('请提供有效的帖子 ID 和抽奖人数');
            return;
        }
        console.log(`Fetching OP for TID: ${tid}`);
        const op = await getOp(tid);
        console.log(`OP: ${op}`);
        console.log(`Fetching all users for TID: ${tid}`);
        const uniqueUserList = await getAllUser(tid, maxFloor);
        console.log(`Unique Users: ${uniqueUserList.join(', ')}`);
        const filteredUserList = uniqueUserList.filter(user => user !== op);
        console.log(`Filtered Users: ${filteredUserList.join(', ')}`);
        const userCount = filteredUserList.length;
        console.log(`User Count: ${userCount}`);
        const seed = seedParam !== null ? seedParam : userCount.toString();
        console.log(`Seed: ${seed}`);
        console.log(`Max Floor: ${maxFloor}`);
        const combinedSeed = `${seed}-${maxFloor}`;
        console.log(`Combined Seed: ${combinedSeed}`);
        const shuffledList = shuffle(filteredUserList, combinedSeed);
        console.log(`Shuffled Users: ${shuffledList.join(', ')}`);
        const result = `符合条件的用户共有 ${filteredUserList.length} 人
    抽奖结果:
    ${shuffledList.slice(0, num).join('\n')}`;
        console.log(result);
    }
    
    async function getOp(tid) {
        const url = `https://www.v2ex.com/amp/t/${tid}`;
        console.log(`Fetching OP URL: ${url}`);
        const response = await fetch(url, { headers: { 'User-Agent': UA } });
        if (!response.ok) {
            console.log(`Failed to fetch OP: ${response.status} ${response.statusText}`);
            return null;
        }
        const text = await response.text();
        const match = /<div class="topic_author">[\s\S]*?<amp-img[^>]+alt="([^"]+)"[\s\S]*?<\/div>/.exec(text);
        console.log(`OP Match: ${match ? match[1] : null}`);
        return match ? match[1].trim() : null;
    }
    
    async function getUserList(url, startIndex, endIndex) {
        console.log(`Fetching User List URL: ${url}`);
        const response = await fetch(url, { headers: { 'User-Agent': UA } });
        if (!response.ok) {
            console.log(`Failed to fetch User List: ${response.status} ${response.statusText}`);
            return [];
        }
        const text = await response.text();
        const replyItemRegex = /<div class="reply_item">([\s\S]*?)<\/div>/g;
        let replyItemMatch;
        const users = [];
        let currentIndex = startIndex || 0;
        while ((replyItemMatch = replyItemRegex.exec(text)) !== null) {
            if (endIndex !== undefined && currentIndex >= endIndex) {
                break;
            }
            const replyItem = replyItemMatch[1];
            const altRegex = /<amp-img[^>]+alt="([^"]+)"[^>]*>/g;
            const altMatch = altRegex.exec(replyItem);
            if (altMatch) {
                users.push(altMatch[1]);
            }
            currentIndex++;
        }
        console.log(`Matches: ${users.join(', ')}`);
        return users;
    }
    
    async function getAllPages(tid) {
        const url = `https://www.v2ex.com/amp/t/${tid}`;
        console.log(`Fetching All Pages URL: ${url}`);
        const response = await fetch(url, { headers: { 'User-Agent': UA } });
        if (!response.ok) {
            console.log(`Failed to fetch All Pages: ${response.status} ${response.statusText}`);
            return [];
        }
        const text = await response.text();
        const pageCountMatch = /\u5171 (\d+) \u9875/.exec(text);
        const pageCount = pageCountMatch ? parseInt(pageCountMatch[1], 10) : 1;
        console.log(`Page Count: ${pageCount}`);
        const pages = [];
        for (let i = 1; i <= pageCount; i++) {
            pages.push(`${url}/${i}`);
        }
        return pages;
    }
    
    async function getAllUser(tid, maxFloor) {
        const pages = await getAllPages(tid);
        console.log(`Pages: ${pages.join(', ')}`);
        let allUsers = [];
        let currentFloor = 0;
        for (let page of pages) {
            const startIndex = currentFloor;
            const endIndex = maxFloor !== undefined ? maxFloor : undefined;
            const users = await getUserList(page, startIndex, endIndex);
            allUsers = allUsers.concat(users);
            currentFloor += users.length;
            if (endIndex !== undefined && currentFloor >= endIndex) {
                break;
            }
        }
        const uniqueUsers = [];
        const seen = new Set();
        for (const user of allUsers) {
            if (!seen.has(user)) {
                uniqueUsers.push(user);
                seen.add(user);
            }
        }
        console.log(`Unique Users: ${uniqueUsers.join(', ')}`);
        return uniqueUsers;
    }
    
    function shuffle(array, seed) {
        const rng = lcg(seed);
        console.log(`Shuffling with Seed: ${seed}`);
        for (let i = array.length - 1; i > 0; i--) {
            const j = Math.floor(rng() * (i + 1));
            console.log(`Shuffling: i=${i}, j=${j}`);
            if (array[i] !== undefined && array[j] !== undefined) {
                [array[i], array[j]] = [array[j], array[i]];
            } else {
                console.log(`Error: array[i] or array[j] is undefined. i=${i}, j=${j}, array[i]=${array[i]}, array[j]=${array[j]}`);
            }
        }
        return array;
    }
    
    function lcg(seed) {
        let state = hashCode(seed);
        console.log(`LCG State: ${state}`);
        const a = 1664525;
        const c = 1013904223;
        const m = Math.pow(2, 32);
        return function() {
            state = (a * state + c) % m;
            console.log(`LCG Next: ${state / m}`);
            return state / m;
        }
    }
    
    function hashCode(str) {
        l
    ![]( https://i.v2ex.co/VlpwI4y5.jpeg)
    et hash = 0;
        for (let i = 0; i < str.length; i++) {
            const char = str.charCodeAt(i);
            hash = ((hash << 5) - hash) + char;
            hash |= 0;
        }
        return Math.abs(hash);
    }
    
    // Example usage:
    handleRequest('123456', 3, seed123, 10);
    这里的 '123456' 是帖子 ID ,3 是抽奖人数,'seed123' 是种子(可选),10 是最大楼层(可选)。
    在 V2EX 网站里用浏览器 consele 运行就可以
    

    为了方便 v 友进行类似抽奖我糊了一个 cloudflare work 来使用直接请求 https://v2ex.240801.xyz/?tid=12345&num=10&seed=12345&maxFloor=11(大佬别打,刚装上访问不了可能 cf 路由没设置好)这里的参数说明为 tid 为帖子 id num 为中奖人数 seed 为随机数种子 maxFloor 为最高楼层

    下面是橙子链接请大家按需购买

    ps 甜度不用担心,今年我们县的都甜。现摘现发没有清洗打腊,只要老家不下雨一般下单第二天就发货。室温 20 度以内还是很耐放的两三个星期没啥问题。有个卖橙子的微信群想加的加我微信 console.log(atob('enF3MjAwOA=='))拉群

    第 1 条附言  ·  30 天前

    今年的橙子我也还没吃上,这图都是前段时间家时机人拍的现在橙子应该黄一些了。

    为啥这次的代码块没有高亮。。。代码看起来多,是因为ai 写的取回复用户数没用v站的api,下面是去除相关爬虫代码后的代码:https://gist.github.com/zzerding/d80d25149a74c0dd96516d949e9e52b7

    cloudflare work我会改为api形式代码后续在上面的gist里更新

    晚上12点以后可根据规则自行开奖

    第 2 条附言  ·  30 天前

    统一回复一下:

    橙子大约9分甜一分酸,每个人的口感不一样可以进群问问去年的v友

    可以发顺丰。晚上熬夜开的团图片先错了,里面有顺丰的商品链接大约江西周边9省53r/5kg

    好了不摸鱼了领导催进度了

    第 3 条附言  ·  29 天前

    感谢大家的支持,因为是现摘发货一天也就发300斤,受天气影响22号下单的会在24或者25号发完,先下单的先发,介意的可以申请退款。

    抽奖

    使用node自行开奖

    看到515楼我知道这个正则表达式取用户非常不可靠(但是当前代码好像没有注入成功),所以改用v2ex api。 使用方式

    恭喜以下用户

    @AchieveHF @xwh @ruiy @kuzhan 可以回复联系方式或者带主页截图找我领奖

    544 条回复    2024-12-04 10:27:27 +08:00
    1  2  3  4  5  6  
    cs5791393
        301
    cs5791393  
       30 天前
    重在参与!
    zhaojiejoe
        302
    zhaojiejoe  
       30 天前
    分子
    xujunjie
        303
    xujunjie  
       30 天前
    支持
    570956418
        304
    570956418  
       30 天前
    参与一下
    cjlsky
        305
    cjlsky  
       30 天前
    回购的第二年
    robot2134
        306
    robot2134  
       30 天前 via Android
    +1
    defunct9
        307
    defunct9  
       30 天前
    分子
    dropdatabase
        308
    dropdatabase  
       30 天前
    1
    s609926202
        309
    s609926202  
       30 天前
    +1
    JerryV2
        310
    JerryV2  
       30 天前
    +1
    xier9213
        311
    xier9213  
       30 天前
    分母+1
    ecee
        312
    ecee  
       30 天前
    +1
    bomjack
        313
    bomjack  
       30 天前
    重在参与
    kzmdididi
        314
    kzmdididi  
       30 天前
    大麦
    vimfaith
        315
    vimfaith  
       30 天前
    重在参与!
    PeterPig
        316
    PeterPig  
       30 天前 via iPhone
    +1
    vimfaith
        317
    vimfaith  
       30 天前
    重在参与
    nellace
        318
    nellace  
       30 天前
    重在参与!
    cqq626432432
        319
    cqq626432432  
       30 天前
    重在参与!
    ma836323493
        320
    ma836323493  
       30 天前
    做个分子
    jaylengao
        321
    jaylengao  
       30 天前
    重在参与
    wxd21020
        322
    wxd21020  
       30 天前
    支持
    hnbcinfo
        323
    hnbcinfo  
       30 天前
    大家好,我是分母。重在掺和,拉低各位中奖率就是我的目标
    myxvhgiile
        324
    myxvhgiile  
       30 天前
    参与一下
    wangofjian
        325
    wangofjian  
       30 天前
    凑个分子
    ip7x12v5
        326
    ip7x12v5  
       30 天前
    试试
    seeyourface
        327
    seeyourface  
       30 天前
    参与一下
    qwas
        328
    qwas  
       30 天前
    橙不橙子不重要,看到队伍占个位
    meteor957
        329
    meteor957  
       30 天前
    分母+1
    markchen88
        330
    markchen88  
       30 天前
    参与
    raydied
        331
    raydied  
       30 天前
    分子分母都+1
    paullige
        332
    paullige  
       30 天前
    感谢
    keaidian
        333
    keaidian  
       30 天前
    幸运之子!
    lilicheng
        334
    lilicheng  
       30 天前
    那就让我尝尝吧
    jykid
        335
    jykid  
       30 天前
    那让我来试试
    SkYouth
        336
    SkYouth  
       30 天前
    重在参与。
    sdsd995
        337
    sdsd995  
       30 天前
    支持一下,参与试试
    rawburuser
        338
    rawburuser  
       30 天前
    重在参与
    aswqazx
        339
    aswqazx  
       30 天前
    +1
    alanoy
        340
    alanoy  
       30 天前
    重在参与!
    wanwan
        341
    wanwan  
       30 天前 via Android
    看看运气
    Mianmiss
        342
    Mianmiss  
       30 天前
    +1 重在参与
    Mianmiss
        343
    Mianmiss  
       30 天前
    参与下
    luo123qiu
        344
    luo123qiu  
       30 天前
    分母+1
    iamperiod331www
        345
    iamperiod331www  
       30 天前
    参与一下
    lin98
        346
    lin98  
       30 天前
    试试
    fantasy55
        347
    fantasy55  
       30 天前
    分子++
    kissing
        348
    kissing  
       30 天前
    支持一下!
    a33291
        349
    a33291  
       30 天前
    祝 op 大卖
    gongxuanzhang
        350
    gongxuanzhang  
       30 天前
    今年运气还可以
    walkeronway
        351
    walkeronway  
       30 天前
    支持支持
    boom520
        352
    boom520  
       30 天前
    上次买过,味道 ok 的
    xing666
        353
    xing666  
       30 天前
    重在参与
    Incarna
        354
    Incarna  
       30 天前
    支持,要是中了的话觉得好吃给家人买点
    wlliam19
        355
    wlliam19  
       30 天前
    想吃
    clieujv
        356
    clieujv  
       30 天前
    我相信我能中
    wujinglun
        357
    wujinglun  
       30 天前
    参与一下
    sumarker
        358
    sumarker  
       30 天前
    分子
    jark006
        359
    jark006  
       30 天前
    分母来了
    pegasusz
        360
    pegasusz  
       30 天前
    反正中不了,拉低下中奖率吧
    bluelotus0739
        361
    bluelotus0739  
       30 天前
    赣南脐橙真的很好吃!!!
    Jieyue
        362
    Jieyue  
       30 天前
    分子
    lianginx
        363
    lianginx  
       30 天前
    好家伙,第一次抽奖,我来试试
    qwereee
        364
    qwereee  
       30 天前
    +1
    qingshengwen
        365
    qingshengwen  
       30 天前
    分子+1
    BelovedOne
        366
    BelovedOne  
       30 天前
    重在参与!
    ae86
        367
    ae86  
       30 天前
    分母+1
    mrzhoudjq
        368
    mrzhoudjq  
       30 天前
    参与一下
    yxb9511
        369
    yxb9511  
       30 天前
    冲冲冲,每年都吃赣南脐橙
    purewhite0
        370
    purewhite0  
       30 天前
    参与一下
    mxT52CRuqR6o5
        371
    mxT52CRuqR6o5  
       30 天前
    分母
    waising
        372
    waising  
       30 天前
    分母
    zjzs
        373
    zjzs  
       30 天前
    分母来啦
    AmosWu
        374
    AmosWu  
       30 天前
    +1
    veyron888
        375
    veyron888  
       30 天前
    预祝大麦
    hallostr
        376
    hallostr  
       30 天前
    重在参与,爱吃脐橙
    lddtech
        377
    lddtech  
       30 天前
    分子
    jy02919061
        378
    jy02919061  
       30 天前 via Android
    来了啦啦啦啦啦了
    ZX16815
        379
    ZX16815  
       30 天前
    分子
    cubicoo
        380
    cubicoo  
       30 天前 via Android
    参与一下
    CaptainAmerica
        381
    CaptainAmerica  
       30 天前
    支持一下
    hahasong
        382
    hahasong  
       30 天前
    我来看看能不能吃上
    Rekkles
        383
    Rekkles  
       30 天前
    分子分母
    wulv
        384
    wulv  
       30 天前
    参与一下
    richamon
        385
    richamon  
       30 天前
    参与一下
    vaynecv
        386
    vaynecv  
       30 天前
    分子
    NilError
        387
    NilError  
       30 天前
    分母加一
    ddonano
        388
    ddonano  
       30 天前
    参与一下
    yuxi521
        389
    yuxi521  
       30 天前
    1111
    liuxiaojiu
        390
    liuxiaojiu  
       30 天前
    试一下
    zzerd
        391
    zzerd  
    OP
       30 天前
    @Feedmo https://gist.github.com/zzerding/d80d25149a74c0dd96516d949e9e52b7 看这兄弟,这有注释。晚上我有空用 V2EX api 重写 getAllUser
    yveJohn
        392
    yveJohn  
       30 天前
    重在参与
    lvxing888
        393
    lvxing888  
       30 天前
    支持一下
    luistrong
        394
    luistrong  
       30 天前
    分子
    voya
        395
    voya  
       30 天前
    生意兴隆
    Yafun
        396
    Yafun  
       30 天前
    重在参与!!
    zhijietalk
        397
    zhijietalk  
       30 天前
    试试
    zgsi
        398
    zgsi  
       30 天前
    代码一言难尽
    norcm
        399
    norcm  
       30 天前
    分子!~
    allendavis
        400
    allendavis  
       30 天前
    拉低概率?
    1  2  3  4  5  6  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 23:06 · PVG 07:06 · LAX 15:06 · JFK 18:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.