2

我正在开发一个涉及 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 新手。最后,此尝试仅用于我的教育目的。

4

1 回答 1

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;
}

我想你可能有几个原因:

  • 应在请求中指定用户代理,如果您将其留空,他们似乎会拒绝
  • 我使用http_build_query构建 POST 字符串(首选项)
  • 您在请求中缺少 2 个字段remLen,以及作为提交按钮的触发器值
  • 如果我在获得触发值后发送消息前几秒钟没有睡觉,我经常不会收到消息。

在我没有收到消息的大多数情况下,它仍然在屏幕上显示“消息已发送到电话#”,即使它从未收到。一旦我结合了所有正确的东西(睡眠时间、用户代理、有效的帖子字段),我会看到成功消息,但也会得到响应。

我认为您的代码中遗漏的最关键的事情是,在您获取触发器值的第一个请求中,它们还设置了PHPSESSID您需要捕获的 cookie ( )。如果没有在 POST 请求中发送它,它可能是一个自动拒绝。

要解决此问题,请确保在第一个请求以及后续请求中捕获 cookie。我选择为这两个请求重新使用相同的 curl 句柄。您不必这样,但您必须在请求之间使用相同的 cookie 文件和 cookie jar。

希望有帮助。

于 2012-07-10T18:49:45.430 回答