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

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

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

    抽奖规则和去年一样取上证指数和最后指定日期最高楼。上一年的帖子/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  
    guzzhao
        401
    guzzhao  
       30 天前
    分子
    Arrowing
        402
    Arrowing  
       30 天前
    重在参与!
    HelloCCC
        403
    HelloCCC  
       30 天前
    重在参与
    xwh
        404
    xwh  
       30 天前
    支持
    phh
        405
    phh  
       30 天前
    分母加一 今天大 A 就是你弄崩的吧
    MilkyWayZZ
        406
    MilkyWayZZ  
       30 天前
    分母
    zhoujian1
        407
    zhoujian1  
       30 天前
    重在参与!
    yahon
        408
    yahon  
       30 天前
    试试
    terito11122
        409
    terito11122  
       30 天前
    分子~
    justinjsn
        410
    justinjsn  
       30 天前
    分母 +1
    ashtwo
        411
    ashtwo  
       30 天前
    分母
    coderljx
        412
    coderljx  
       30 天前
    重在参与
    byaiu
        413
    byaiu  
       30 天前
    分子!
    somin
        414
    somin  
       30 天前
    参与一下
    linzhai
        415
    linzhai  
       30 天前
    分母+1
    ImDESIGNER
        416
    ImDESIGNER  
       30 天前
    祝福
    chengiri
        417
    chengiri  
       30 天前
    +1
    alphafeng
        418
    alphafeng  
       30 天前
    分母+1
    5460
        419
    5460  
       30 天前
    来试试运气
    null113
        420
    null113  
       30 天前
    试试
    czhxn123456
        421
    czhxn123456  
       30 天前
    分子
    sleepybear1113
        422
    sleepybear1113  
       30 天前
    分母分母分母分母分母
    wowawesome
        423
    wowawesome  
       30 天前
    分子+1
    noahlias
        424
    noahlias  
       30 天前
    分一下
    xmt328
        425
    xmt328  
       30 天前
    看到了还是要参与下
    jojon
        426
    jojon  
       30 天前
    重在参与
    CodeSorcerer
        427
    CodeSorcerer  
       30 天前
    重在参与
    smilev587
        428
    smilev587  
       30 天前
    分母
    dreamingclj
        429
    dreamingclj  
       30 天前
    买了试试
    dezou
        430
    dezou  
       30 天前
    争做分子
    miss1123
        431
    miss1123  
       30 天前
    分母
    xlzhu
        432
    xlzhu  
       30 天前
    重在参与,顺祝商祺
    zeuss
        433
    zeuss  
       30 天前
    try try
    svanrj
        434
    svanrj  
       30 天前
    重在参与!
    karlxu
        435
    karlxu  
       30 天前
    做个分母
    qianghaha
        436
    qianghaha  
       30 天前
    分子试试~
    MMDeJeVS3GtMVLeu
        437
    MMDeJeVS3GtMVLeu  
       30 天前
    分子
    zc832097
        438
    zc832097  
       30 天前
    分子+1
    beihanggmj
        439
    beihanggmj  
       30 天前
    做个分母和分子
    Javen96
        440
    Javen96  
       30 天前
    分子试试~
    zidy111
        441
    zidy111  
       30 天前
    重在参与。
    zephyr94
        442
    zephyr94  
       30 天前
    +1
    JustinJie
        443
    JustinJie  
       30 天前 via iPhone
    来来来 分子分子
    antonlee
        444
    antonlee  
       30 天前
    参,祺
    ninggc
        445
    ninggc  
       30 天前
    参与下
    chen11
        446
    chen11  
       30 天前
    当个分母
    aogg
        447
    aogg  
       30 天前
    分母,分子多少个啊
    AokiNet
        448
    AokiNet  
       30 天前
    XHalso
        449
    XHalso  
       30 天前
    重在参与!
    Tune
        450
    Tune  
       30 天前 via iPhone
    来参与一下😁
    Kenyore
        451
    Kenyore  
       30 天前
    当个分母
    tooZero
        452
    tooZero  
       30 天前
    你是分母 我是分子 我们不一样
    youyang
        453
    youyang  
       30 天前
    大麦~
    LiGG
        454
    LiGG  
       30 天前
    支持
    aredhat200
        455
    aredhat200  
       30 天前 via iPhone
    分子!
    goleben
        456
    goleben  
       30 天前
    看着不错哦
    easyii
        457
    easyii  
       30 天前
    参与
    myleszzZ
        458
    myleszzZ  
       30 天前
    分子试试~
    shimmying
        459
    shimmying  
       30 天前
    重在参与!
    taygetus
        460
    taygetus  
       30 天前
    分母
    mkbnb2333
        461
    mkbnb2333  
       30 天前
    重在参与!
    b00ms33d
        462
    b00ms33d  
       30 天前
    想吃橙子。
    somkanel
        463
    somkanel  
       30 天前
    重在参与,支持一下!
    Vendettar
        464
    Vendettar  
       30 天前
    支持
    littlebrother
        465
    littlebrother  
       30 天前
    分子试试~
    Cyclince
        466
    Cyclince  
       30 天前 via Android
    试试
    864766428
        467
    864766428  
       30 天前 via iPhone
    万一呢
    ohuo
        468
    ohuo  
       30 天前
    分子
    zjsxwc
        469
    zjsxwc  
       30 天前
    做个分母
    miz123456
        470
    miz123456  
       30 天前
    重在参与!
    cheese
        471
    cheese  
       30 天前
    尝试中奖
    osdnfpn
        472
    osdnfpn  
       30 天前
    做个分母
    bigblackpig
        473
    bigblackpig  
       30 天前
    减少概率组
    zhjh0521
        474
    zhjh0521  
       30 天前
    做个分母
    zhangsx
        475
    zhangsx  
       30 天前
    试试,不过脐橙确实好吃
    lokya
        476
    lokya  
       30 天前
    参与一下
    lxh1983
        477
    lxh1983  
       30 天前
    争做分子
    lzs5240
        478
    lzs5240  
       30 天前
    重在参与 说不定呢
    bucketcheng
        479
    bucketcheng  
       30 天前
    dddd
    kuzhan
        480
    kuzhan  
       30 天前
    没中过奖
    brilliantsparrow
        481
    brilliantsparrow  
       30 天前
    中!!!
    cont
        482
    cont  
       30 天前
    +1
    m1ch3ng
        483
    m1ch3ng  
       30 天前
    我来当分母了
    titixlq
        484
    titixlq  
       30 天前
    分子+
    gtexpanse
        485
    gtexpanse  
       30 天前
    重在参与
    yushenglin
        486
    yushenglin  
       30 天前
    重在参与!
    Tiking
        487
    Tiking  
       30 天前
    做个分母
    fengci
        488
    fengci  
       30 天前
    尝试中奖 体会 v 友的开心
    coolrc
        489
    coolrc  
       30 天前 via Android
    1
    isaced
        490
    isaced  
       30 天前
    来吃橙子了~
    HappyAndSmile
        491
    HappyAndSmile  
       30 天前
    我也小小参与下吧
    hellojukay
        492
    hellojukay  
       30 天前
    中奖专用评论
    flyfire
        493
    flyfire  
       30 天前
    重在参与
    v3413
        494
    v3413  
       30 天前
    重在参与
    Mystery0
        495
    Mystery0  
       30 天前
    参与一下
    CodeGroup
        496
    CodeGroup  
       30 天前
    已下单
    notgoda
        497
    notgoda  
       30 天前 via iPhone
    jmliang
        498
    jmliang  
       30 天前
    试试
    JssDream
        499
    JssDream  
       30 天前
    分母+1
    Spute
        500
    Spute  
       30 天前
    👍江西老表
    1  2  3  4  5  6  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:51 · PVG 06:51 · LAX 14:51 · JFK 17:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.