我正在开发一个涉及Php Curl的脚本,使用http://www.gysms.com/freesms.php发送短信 该页面存储了一个cookie PHPSESSID,并且在发布期间还传递了一个名为token的隐藏字段。
我写了一个涉及两个curl请求的脚本。第一个curl请求解析页面并获取令牌值。
以下是代码:
<?php
$phone = '9197xxxxxxx';
$msg = 'Hi this is curlpost';
$get_cookie_page = 'http://www.gysms.com/freesms.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $get_cookie_page);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$sabin = curl_exec($ch);
$html=explode('<input type="hidden" name="trigger" value="',$sabin);
$html=explode('"/>',$html[1]);
//store the token value to $html[0]
?>
使用以下代码完成卷曲帖子:
<?php
$fields = array(
'trigger'=>urlencode($html[0]), //token value
'number'=>urlencode($phone), //phone no
'message'=>urlencode($msg) //message
);
//posting curl request
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');
$url = 'http://www.gysms.com/freesms.php';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
//execute post
$result = curl_exec($ch);
echo $result;
curl_close($ch);
?>
短信未发送使用上述代码。 如果发送短信它应该显示短信发送到否。 我不知道我哪里出错了。请帮助,我是PHP的新手。 最后,这种尝试只适用于我的教育用品。
答案 0 :(得分:3)
这是我提出的一些有用的代码。希望能帮助到你。有关您的代码的一些解释和反馈如下。
<?php
$number = '14155556666';
$message = 'This is my text in all its glory.';
$url = 'http://www.gysms.com/freesms.php';
$cookieFile = tempnam(null, 'SMS');
$userAgent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0';
if (strlen($message) > 100) {
die('Message length cannot exceed 100 characters.');
}
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); // empty user agents probably not accepted
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // enable this - they check referer on POST
$html = curl_exec($ch);
// <input type="hidden" name="trigger" value="CXXrtmqVC7KbUnJ22UBodFy1kBj4ign5PsQ3qNR91nH2055307b4xP4"/>
if (!preg_match('/name=.trigger.\s+value=.([^\'"]+)/i', $html, $trigger)) {
die('Failed to locate hidden input value');
}
sleep(5); // without a slight delay, i often would not receive sms
$trigger = $trigger[1];
// build array of post values - all are important
$post = array('number' => $number,
'trigger' => $trigger,
'message' => $message,
'remLen' => 100 - strlen($message),
$trigger => 'Send Message');
// switch request to POST, use http_build_query to encode post data for us
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$html = curl_exec($ch);
if (strpos($html, '<b>Message sent to</b>') !== false) {
echo "Message sent!";
} else {
echo "<b>Message not sent :(</b><br /><br />";
echo $html;
}
我认为你可能遇到麻烦有几个原因:
remLen
,并且触发器值为提交按钮在我没有收到消息的大多数情况下,它仍会在屏幕上显示“消息发送到手机号码”,即使它从未出现过。一旦我结合了所有正确的事情(睡眠时间,用户代理,有效的帖子字段),我会看到成功消息,但也会得到响应。
我认为代码中遗漏的最重要的事情是,在您获取触发器值的第一个请求中,他们还设置了一个您需要捕获的cookie(PHPSESSID
)。如果不在POST请求中发送,则可能是自动拒绝。
要解决此问题,请确保在第一个请求以及后续请求中捕获Cookie。我选择为两个请求重复使用相同的curl句柄。您不 以这种方式执行此操作,但 必须在请求之间使用相同的Cookie文件和Cookie jar。
希望有所帮助。