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

2020-11-26 05:22:37 +08:00
 CloudRaft

前情

作为一个半路出家的伪程序员,看着 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. 绑定邮箱

  2. 激活 Pro 订阅

领取、登录及配置

  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 订阅激活
3063 次点击
所在节点    PHP
30 条回复
wjhjd163
2020-11-26 05:29:28 +08:00
会员 ID 1100503
感谢!
ooh
2020-11-26 07:14:30 +08:00
打开 Chrome 调试工具 复制 curl 请求 再找一个 PHP curl 例子照着抄
zst
2020-11-26 07:59:44 +08:00
浏览器上面开发者工具里面 network 找到请求右键复制为 curl 然后用 https://curl.trillworks.com/ 这个网站转为 php 代码再改一下 cookies 应该可以了吧
CloudRaft
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
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
2020-11-26 08:16:27 +08:00
路过提俩思路:
1. 直接无头大法好
2. 可以考虑给 plesk 服务端抓包看看
isukkaw
2020-11-26 08:24:22 +08:00
在 V2EX 问如何倒卖 Cloudflare WAF Plus Plan 还行,真当 Cloudflare 销售不上 V2EX ?
CloudRaft
2020-11-26 08:25:27 +08:00
@boboliu 我也想着实在搞不定的话就 headless chrome,但是想着又要多个容器,后续维护也挺麻烦的。
话说没怎么接触过这方面,求问从 plesk 那边抓包和浏览器里看请求会有差别吗?
CloudRaft
2020-11-26 08:27:25 +08:00
@isukkaw plesk 本来就是分销系统啊,servershield 也是我们正规采购的授权,这些进行销售没有任何问题吧?
boboliu
2020-11-26 08:30:23 +08:00
@CloudRaft 主要是看你这请求都发到你 self host 的 plesk 服务器了,看起来还挺复杂的,这骨头明显要更硬

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

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

用 iframe 包含提交页面,插入 js 脚本,模拟点击。(当然要确保没刷单问题)
ChaiXingXing
2020-11-26 10:03:38 +08:00
可以用这个东西试试: https://incarnate.github.io/curl-to-php/
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
2020-11-26 15:46:21 +08:00
@donwa 666 !这个好像可行!我这就去试试看,如果需要 CF 的订阅随时 @我~
tms
2020-11-26 17:03:37 +08:00
五月份在你家买的 CloudFlarePlesk,还是旧的用户中心才能登陆,需要重新注册新版用户中心么。
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
2020-11-26 17:21:16 +08:00
实测 ws 在激活操作的时候没有任何作用。绑定因为没有账号测不了。
tms
2020-11-26 17:27:40 +08:00
实测激活有效
tms
2020-11-26 17:27:44 +08:00
CloudRaft
2020-11-26 17:54:08 +08:00
@tms 感谢大佬!能提供下 my cloudraft cn 的会员 ID 吗?这边帮您开一个账户试试(并奉上无限域名版订阅),这个 post 我尝试用 postman 绑定 CF 的邮箱一直是失败的,大佬帮忙看看吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/729300

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX