如何使用涉及cookie的Php进行Curl post

时间:2012-07-10 18:01:11

标签: php curl

我正在开发一个涉及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的新手。 最后,这种尝试只适用于我的教育用品。

1 个答案:

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

我认为你可能遇到麻烦有几个原因:

  • 应在请求中指定User-Agent,如果将其留空则似乎拒绝
  • 我使用http_build_query来构建POST字符串(首选项)
  • 您在请求中缺少2个字段remLen,并且触发器值为提交按钮
  • 如果在获取触发值后发送消息前几秒没有睡觉,我经常不会收到消息。

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

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

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

希望有所帮助。