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

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

  •  
  •   zzerd · 30 天前 · 7124 次点击

    抽奖规则和去年一样取上证指数和最后指定日期最高楼。上一年的帖子/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  
    puzzle9
        1
    puzzle9  
       30 天前
    尝试中奖 体会 v 友的开心
    chinafeng
        2
    chinafeng  
       30 天前
    做个分母
    YiCherish
        3
    YiCherish  
       30 天前 via iPhone
    支持
    WeaPoon
        4
    WeaPoon  
       30 天前
    分子试试~
    leo72638
        5
    leo72638  
       30 天前 via iPhone
    试试
    gugulaliqi
        6
    gugulaliqi  
       30 天前 via Android
    碰运气
    243205964
        7
    243205964  
       30 天前
    抽奖代吗越来越复杂了
    Ceylan
        8
    Ceylan  
       30 天前 via Android
    试试
    AppxLite
        9
    AppxLite  
       30 天前 via Android
    参与一下
    RobertLyu
        10
    RobertLyu  
       30 天前
    我来成为分子!
    zsedc
        11
    zsedc  
       30 天前 via iPhone
    分母
    moxxun
        12
    moxxun  
       30 天前 via iPhone
    试试
    d1456198
        13
    d1456198  
       30 天前
    ➕1
    youbaoer
        14
    youbaoer  
       30 天前 via Android
    分母+1
    Mrabbit
        15
    Mrabbit  
       30 天前
    重在参与,爱吃脐橙
    abcgoodwei
        16
    abcgoodwei  
       30 天前
    重在参与,爱吃脐橙
    c9c2ane
        17
    c9c2ane  
       30 天前
    有优惠吗
    monstericeer
        18
    monstericeer  
       30 天前
    +1 !
    ch20191
        19
    ch20191  
       30 天前
    我来组成弹幕~~~~~~~~~~~~~~欧皇爱我~~~~~~~~~~~~~
    dmdouo12
        20
    dmdouo12  
       30 天前
    +1
    junan
        21
    junan  
       30 天前
    没中过奖的来试试
    Woodrow
        22
    Woodrow  
       30 天前
    争做分子
    lee0508
        23
    lee0508  
       30 天前
    重在参与,爱吃脐橙
    dongzei
        24
    dongzei  
       30 天前
    我是分子
    gscsnm
        25
    gscsnm  
       30 天前
    我想当分子!
    tycyber
        26
    tycyber  
       30 天前
    参与一下。
    zsysmileing
        27
    zsysmileing  
       30 天前
    重在参与
    likai
        28
    likai  
       30 天前 via Android
    分母还是分子
    shadowsll
        29
    shadowsll  
       30 天前
    重在参与,看着不错
    hill001
        30
    hill001  
       30 天前 via Android
    参与一下
    daohanghao
        31
    daohanghao  
       30 天前
    老乡支持
    itiao
        32
    itiao  
       30 天前
    应当是我
    wxw752
        33
    wxw752  
       30 天前
    支持一下,每年要买好多箱
    hucw21750
        34
    hucw21750  
       30 天前
    跟了一单,祝好卖~
    iLmessi
        35
    iLmessi  
       30 天前
    凑个热闹
    superdong
        36
    superdong  
       30 天前
    预祝大麦
    farah9
        37
    farah9  
       30 天前 via iPhone
    +1
    BrookO
        38
    BrookO  
       30 天前
    支持一下
    VampireDemon
        39
    VampireDemon  
       30 天前
    万一抽到了呢
    liujavamail
        40
    liujavamail  
       30 天前
    支持一下
    Hidetodong
        41
    Hidetodong  
       30 天前
    试一下!!
    roma
        42
    roma  
       30 天前
    +1
    yanyue526
        43
    yanyue526  
       30 天前
    你就说甜不甜吧
    wlongs
        44
    wlongs  
       30 天前
    try
    dongyulin353
        45
    dongyulin353  
       30 天前
    支持一下
    ming7435
        46
    ming7435  
       30 天前
    你就说甜不甜吧
    thank001
        47
    thank001  
       30 天前
    重在参与
    godFree
        48
    godFree  
       30 天前
    分子 +1 +1
    zoyao
        49
    zoyao  
       30 天前
    参与下,还没在 v2 中过奖
    yaoliyc
        50
    yaoliyc  
       30 天前
    加一
    Emi1
        51
    Emi1  
       30 天前
    分母++
    hataki77
        52
    hataki77  
       30 天前
    重在参与,分子分母+1
    Vipcw95
        53
    Vipcw95  
       30 天前
    +1
    ppllss
        54
    ppllss  
       30 天前
    分子试试~
    fuchish112
        55
    fuchish112  
       30 天前
    分母
    xR13zp0h67njQr2S
        56
    xR13zp0h67njQr2S  
       30 天前
    做个分子
    lianleisuper66
        57
    lianleisuper66  
       30 天前
    试试😁
    hkiJava
        58
    hkiJava  
       30 天前
    试试就试试吧
    usboy
        59
    usboy  
       30 天前
    分子
    stormwindcity
        60
    stormwindcity  
       30 天前
    分母+1
    yryc
        61
    yryc  
       30 天前
    分子+1
    yl14786922106
        62
    yl14786922106  
       30 天前
    1
    d873139022
        63
    d873139022  
       30 天前
    参与一下
    smy14520
        64
    smy14520  
       30 天前
    分子分子++
    CooperZhuang
        65
    CooperZhuang  
       30 天前
    哈哈哈咱也参与一下,顺祝商祺
    Davy
        66
    Davy  
       30 天前
    分母
    hh7418695
        67
    hh7418695  
       30 天前
    做个分母
    imherer
        68
    imherer  
       30 天前
    支持
    amanisheir
        69
    amanisheir  
       30 天前
    华农的竹鼠中暑了,快去帮帮他
    oouz
        70
    oouz  
       30 天前
    参与
    banli
        71
    banli  
       30 天前
    +1
    ik
        72
    ik  
       30 天前 via iPhone
    分子分子
    kalthus
        73
    kalthus  
       30 天前
    分子
    BugFree
        74
    BugFree  
       30 天前
    试试
    Zxien
        75
    Zxien  
       30 天前
    分子!
    jjl19960910
        76
    jjl19960910  
       30 天前 via Android
    我来组成臀部
    tyhsun
        77
    tyhsun  
       30 天前
    支持支持
    dys0327
        78
    dys0327  
       30 天前
    分子
    happyxhw101
        79
    happyxhw101  
       30 天前
    我是大学生😤
    linchen514
        80
    linchen514  
       30 天前
    试试
    karlguo7
        81
    karlguo7  
       30 天前 via iPhone
    +1
    wukaige
        82
    wukaige  
       30 天前
    观世音菩萨保佑
    yrk20212021
        83
    yrk20212021  
       30 天前
    分子
    wupher
        84
    wupher  
       30 天前
    分子
    flashmamba
        85
    flashmamba  
       30 天前
    111
    particlec
        86
    particlec  
       30 天前
    我要吃橘子
    dany663399
        87
    dany663399  
       30 天前
    分子
    qw3rty
        88
    qw3rty  
       30 天前
    我来成为分子
    mkstring
        89
    mkstring  
       30 天前
    分母
    williamcheen
        90
    williamcheen  
       30 天前
    +1
    dai201617
        91
    dai201617  
       30 天前
    分子
    cxilife
        92
    cxilife  
       30 天前
    做个分母
    zii4914
        93
    zii4914  
       30 天前
    重在参与
    zacheryWu
        94
    zacheryWu  
       30 天前
    分子
    ssssssssssssssss
        95
    ssssssssssssssss  
       30 天前
    分母+1
    ruiy
        96
    ruiy  
       30 天前
    试试,,,
    zimonianhua
        97
    zimonianhua  
       30 天前 via Android
    分母+1
    scal
        98
    scal  
       30 天前
    我们这种爱媛、耙耙柑、沃柑。
    WalterHs
        99
    WalterHs  
       30 天前
    为啥用邮政快递啊,太慢了啊。
    intoext
        100
    intoext  
       30 天前
    重在参与!
    1  2  3  4  5  6  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2794 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:37 · PVG 22:37 · LAX 06:37 · JFK 09:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.