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

求助 关于 PHP 中 curl 模拟浏览器提交 POST 请求 [帮忙解答送 CloudFlarePro 订阅]

  •  
  •   CloudRaft · 2020-11-26 05:22:37 +08:00 · 2342 次点击
    这是一个创建于 372 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情

    作为一个半路出家的伪程序员,看着 API 手册写一些简单的模块还是可以的,但是碰到这种没有 API 的情况就一脸懵逼了...没什么拿得出手的,愿意帮忙看看的就送 10 域名版 CloudFlarePro(Plesk)长期订阅,产品的具体介绍:https://docs.cloudraft.cn/webhosting/cdn/cloudflare/

    目前我在写这个 CloudFlare-Plesk 对接 Zkeys(ThinkPHP)的插件,原本逻辑和 WHMCS 的一样就是开通 pelsk 账户+开通套餐,然后用户需要登录到 plesk 设置 cf 的邮箱和域名。现在这些功能已经都实现了,在 Zkeys 中用户可以: [开通 Plesk 账户] -> [开通订阅] -> [添加 Plesk 域名] -> [生成单点登录链接]

    但是想更进一步:用户可以直接在 Zkey 系统中直接绑定 CloudFlare 的账户以及激活 CloudFlare 的域名服务。但是 plesk 的扩展插件是没有 API 的,需要 curl 去模拟用户的浏览器操作。光是添加 cookies 好像还不行,已经把浏览器请求的 header 全部加进去了还是不行...

    有兴趣尝试的可以给 10 域名版摸索摸索,如果能通过 curl (bash)完成绑定域名和添加域名的步骤则长期免费提供无限域名版以示感谢。

    需求

    已有客户 cookies/登陆链接,需要实现

    1. 绑定邮箱 4Kvg.png

    2. 激活 Pro 订阅 4Nt1.png

    领取、登录及配置

    1. https://my.cloudraft.cn 注册后(无需实名)绑定邮箱,注册时可以看到自己的会员 ID
    2. 访问https://my.cloudraft.cn/user/cfpro/registerPlesk 出现 result=true 表明开通 plesk 成功
    3. 本贴中回复会员 ID,我会尽快给开通 10 域名套餐(套餐不设有效期),希望大佬们帮帮忙,另外如果不是要帮忙解决问题的话就不要领取了,不设限制是相信各位。
    4. 访问https://my.cloudraft.cn/user/cfpro/getUserLogin 获取单点登录链接
    5. cloudflare 插件管理页:https://plesk-eu-6.cloudraft.cn:8443/modules/servershield/index.php 这里需要进行(1)绑定 cloudflare 账户(2)将域名的 Pro 订阅激活
    30 条回复    2020-11-26 23:41:30 +08:00
    wjhjd163
        1
    wjhjd163  
       2020-11-26 05:29:28 +08:00 via Android
    会员 ID 1100503
    感谢!
    ooh
        2
    ooh  
       2020-11-26 07:14:30 +08:00
    打开 Chrome 调试工具 复制 curl 请求 再找一个 PHP curl 例子照着抄
    zst
        3
    zst  
       2020-11-26 07:59:44 +08:00 via Android
    浏览器上面开发者工具里面 network 找到请求右键复制为 curl 然后用 https://curl.trillworks.com/ 这个网站转为 php 代码再改一下 cookies 应该可以了吧
    CloudRaft
        4
    CloudRaft  
    OP
       2020-11-26 08:03:40 +08:00
    @ooh 试过了,把浏览器中请求复制成 curl 然后改成 php,但是还是不行...另外看到除了主页面的请求外还有 xhr 和 ws,完全进入知识盲区...

    ```
    public function getUserLogin()
    {
    $userInfo = $this->checkZkeysStatus();
    $plesk_user = md5($userInfo['id'].$this->md5key);
    $params = "{ \"params\": [ \"--get-login-link\", \"-user\", \"".$plesk_user."\" ]}";
    $result = $this->_getRest('cli/admin/call',$params);
    return $result['stdout'];
    }

    protected function getUserCookies()
    {
    $login_url = $this->getUserLogin();
    $ch = curl_init();
    $plesk_cookie_jar = '/tmp/cfpro_cookie_'.$plesk_user.'.txt';
    header("Content-Type:text/html;charset=utf-8");
    curl_setopt($ch, CURLOPT_URL, $login_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $plesk_cookie_jar);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $plesk_cookie_jar);
    $result = curl_exec($ch);
    curl_close($ch);
    return $plesk_cookie_jar;
    }

    //就是这一步出问题了
    public function bindCF($cfemail,$cfpass)
    {
    $userInfo = $this->checkZkeysStatus();
    $zoneInfo = M('cloudflare')->find(['user_id' => $userInfo['id']]);
    $activate_url = '/modules/servershield/index.php/index/';
    $post = array('simple'=>1,'cfemail'=>$cfemail, 'cfpass'=>$cfpass);
    $plesk_cookie_jar = $this->getUserCookies();
    header("Content-Type: application/x-www-form-urlencoded");
    curl_setopt($ch, CURLOPT_URL, $activate_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    curl_setopt($ch, CURLOPT_COOKIEFILE, $plesk_cookie_jar);
    $result = curl_exec($ch);
    curl_close($ch);
    return json_decode($result, true);
    }
    ```
    CloudRaft
        5
    CloudRaft  
    OP
       2020-11-26 08:09:43 +08:00
    @zst 谢谢回复,这个已经试过了,您可以看看上面我的代码。同时工具里面还有 WS 和 XHR,可能也和请求有关
    ![4W8u.png]( https://iuimg.com/images/2020/11/25/4W8u.png)
    ![4Qrf.png]( https://iuimg.com/images/2020/11/25/4Qrf.png)
    boboliu
        6
    boboliu  
       2020-11-26 08:16:27 +08:00 via Android
    路过提俩思路:
    1. 直接无头大法好
    2. 可以考虑给 plesk 服务端抓包看看
    isukkaw
        7
    isukkaw  
       2020-11-26 08:24:22 +08:00 via Android   ❤️ 1
    在 V2EX 问如何倒卖 Cloudflare WAF Plus Plan 还行,真当 Cloudflare 销售不上 V2EX ?
    CloudRaft
        8
    CloudRaft  
    OP
       2020-11-26 08:25:27 +08:00 via iPhone
    @boboliu 我也想着实在搞不定的话就 headless chrome,但是想着又要多个容器,后续维护也挺麻烦的。
    话说没怎么接触过这方面,求问从 plesk 那边抓包和浏览器里看请求会有差别吗?
    CloudRaft
        9
    CloudRaft  
    OP
       2020-11-26 08:27:25 +08:00 via iPhone
    @isukkaw plesk 本来就是分销系统啊,servershield 也是我们正规采购的授权,这些进行销售没有任何问题吧?
    boboliu
        10
    boboliu  
       2020-11-26 08:30:23 +08:00 via Android
    @CloudRaft 主要是看你这请求都发到你 self host 的 plesk 服务器了,看起来还挺复杂的,这骨头明显要更硬

    从服务端上抓包的话多半是发到 plesk 和 /或 cf 的 api 请求,就有很大的几率更好啃
    donwa
        11
    donwa  
       2020-11-26 09:13:03 +08:00
    如果是 xhr 的话还好,如果你怀疑还和 ws 有关,php 不好处理,其实可以换个思路。

    看你截图域名都是自己的,没有跨站问题。

    用 iframe 包含提交页面,插入 js 脚本,模拟点击。(当然要确保没刷单问题)
    ChaiXingXing
        12
    ChaiXingXing  
       2020-11-26 10:03:38 +08:00
    可以用这个东西试试: https://incarnate.github.io/curl-to-php/
    sxbxjhwm
        13
    sxbxjhwm  
       2020-11-26 10:16:15 +08:00
    推荐我自己封装的 Curl 模块 https://github.com/jshensh/phpCurlClass,里边有一个 curl2php.html 可以直接将 curl 命令转成你需要的语句。Curl 命令的获取可以从 Chrome 浏览器开发者工具 --> Network 里抓取到,直接在需要模拟的连接上右键,选择 Copy --> Copy ad cURL (bash) 即可
    CloudRaft
        14
    CloudRaft  
    OP
       2020-11-26 15:46:21 +08:00 via iPhone
    @donwa 666 !这个好像可行!我这就去试试看,如果需要 CF 的订阅随时 @我~
    tms
        15
    tms  
       2020-11-26 17:03:37 +08:00
    五月份在你家买的 CloudFlarePlesk,还是旧的用户中心才能登陆,需要重新注册新版用户中心么。
    tms
        16
    tms  
       2020-11-26 17:18:06 +08:00
    我已经绑定过账号了,所以只能去 servershield 关了一下又开了一下,发现 firehose.us-west-2.amazonaws.com 的请求内容除了时间戳以外都是一样的。
    也没发现 ws,只有到 modules/servershield/servershield.php?simple=1 这个 POST 有用。
    开通域名只要 POST 这个 plesk_zone_name=域名&plesk_rec_name=记录名&act=zone_rec_set 过去就可以。
    tms
        17
    tms  
       2020-11-26 17:21:16 +08:00
    实测 ws 在激活操作的时候没有任何作用。绑定因为没有账号测不了。
    tms
        18
    tms  
       2020-11-26 17:27:40 +08:00
    实测激活有效
    tms
        19
    tms  
       2020-11-26 17:27:44 +08:00   ❤️ 1
    CloudRaft
        20
    CloudRaft  
    OP
       2020-11-26 17:54:08 +08:00
    @tms 感谢大佬!能提供下 my cloudraft cn 的会员 ID 吗?这边帮您开一个账户试试(并奉上无限域名版订阅),这个 post 我尝试用 postman 绑定 CF 的邮箱一直是失败的,大佬帮忙看看吧
    tms
        21
    tms  
       2020-11-26 17:57:59 +08:00
    我好像只有老版本的 cloudraft 账户,从旧的用户中心才能登陆,需要重新注册一个新版账户么。
    我试了一下激活和取消激活,都不需要 ws,
    也不需要管 firehose 的请求 ,这个是行为统计分析用的。
    CloudRaft
        22
    CloudRaft  
    OP
       2020-11-26 18:05:30 +08:00
    @tms 是需要新注册一个的,辛苦啦!
    tms
        23
    tms  
       2020-11-26 18:08:44 +08:00
    会员 ID:1101588
    CloudRaft
        24
    CloudRaft  
    OP
       2020-11-26 18:21:16 +08:00
    @tms 已开通无限域名版,麻烦看看 curl 绑定 CF 和激活
    tms
        25
    tms  
       2020-11-26 18:30:37 +08:00
    @CloudRaft 好的我看一下
    tms
        26
    tms  
       2020-11-26 18:42:51 +08:00
    我这里一下就成功了
    tms
        27
    tms  
       2020-11-26 18:42:55 +08:00
    CloudRaft
        28
    CloudRaft  
    OP
       2020-11-26 18:51:48 +08:00
    @tms 不知道大佬 postman 里面 header 除了 cookies 还有没有其他的?这个 token 我之前没加,我看看有没有办法获取,您有试过在 Linux 里直接 curl 吗?
    tms
        29
    tms  
       2020-11-26 19:10:05 +08:00
    我试了一下 linux 的 curl 和 php 都没问题。token 在页头上取。
    https://i.loli.net/2020/11/26/BzbNlDR5MEpkjgA.png
    CloudRaft
        30
    CloudRaft  
    OP
       2020-11-26 23:41:30 +08:00
    @tms 搞定了,主要问题是要加 token,再次感谢!
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2556 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:00 · PVG 19:00 · LAX 03:00 · JFK 06:00
    ♥ Do have faith in what you're doing.