2

http://www.gysms.com/freesms.phpを使用してSMSを送信するPhpCurlを含むスクリプトを開発しています 。ページにはCookiePHPSESSIDが格納され、投稿中にtokenという名前の非表示フィールドが渡されます。

2つの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);
?>

上記のコードを使用してSMSが送信されていません。SMSが送信された場合SMSが送信されたことを示す必要があります-いいえ。どこが間違っていたのかわかりません。助けてください、私は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をキャプチャするようにしてください。両方のリクエストで同じカールハンドルを再利用することにしました。そのようにする必要はありません、リクエスト間で同じCookieファイルとCookiejarを使用する必要があります。

お役に立てば幸いです。

于 2012-07-10T18:49:45.430 に答える