ソケットから始めましょう。 ヘルプは、HTTPSプロトコルを使用する可能性を宣言したので、試してみてください。 POST変数のセットは、 開発者ガイドから取得されます 。 Habraparserは石鹸をリンクでフレーム化するため、「@」は(at)に置き換えられます。
$postvars = array(
"Email" => "mail(at)gmail.com",
"Passwd" => "pass",
"service" => "blogger"
);
$postdata = "";
foreach ( $postvars as $key => $value )
$postdata .= "&".rawurlencode($key)."=".rawurlencode($value);
$postdata = substr( $postdata, 1 );
$fp = fsockopen("ssl://google.com", 443);
$send = "";
$send .= "POST /accounts/ClientLogin HTTP/1.1\r\n";
$send .= "Host: google.com\r\n";
$send .= "Content-length: ".strlen($postdata)."\r\n";
$send .= "Content-type: text/plain\r\n";
$send .= "Connection: close\r\n";
$send .= "\r\n";
$send .= $postdata."\r\n\r\n";
fputs($fp, $send);
$html = fread($fp, 1000000);
fclose($fp);
echo "".$html." ";
$postvars = array(
"Email" => "mail(at)gmail.com",
"Passwd" => "pass",
"service" => "blogger"
);
$postdata = "";
foreach ( $postvars as $key => $value )
$postdata .= "&".rawurlencode($key)."=".rawurlencode($value);
$postdata = substr( $postdata, 1 );
$fp = fsockopen("ssl://google.com", 443);
$send = "";
$send .= "POST /accounts/ClientLogin HTTP/1.1\r\n";
$send .= "Host: google.com\r\n";
$send .= "Content-length: ".strlen($postdata)."\r\n";
$send .= "Content-type: text/plain\r\n";
$send .= "Connection: close\r\n";
$send .= "\r\n";
$send .= $postdata."\r\n\r\n";
fputs($fp, $send);
$html = fread($fp, 1000000);
fclose($fp);
echo "".$html." ";
fsockopen関数では、httpsは使用しませんが、サーバー名の前のプレフィックスとしてsslを使用します。 ヘルプのプレーンテキストで書かれています。 その後、すべてが簡単です。 HTTPヘッダーを作成し、オープンソケットに押し込みます。 答えを読んで、
Error=BadAuthentication
要するに、時間の試練を省き、ソケットの機能の周りで踊ると、成功しませんでした。 つまり、GET要求は正常に返されましたが、POSTデータを送信することはできませんでした。 たぶんこれはGoogleサーバーにのみ接続されていますが、どこか他の場所で機能します。
UPD。 anabolik habrayuzerに感謝します。1人のヘッダー行を変更して、
$send .= "Content-type: application/x-www-form-urlencoded\r\n";
その後、すべてがすぐに動作します。 どうもありがとう。 あらゆる方法で感謝=)。
2番目のメソッドに渡します。
cURLに関するmanページを開き、喜んでいます。 どのような構成でも、リクエストには非常に多くの可能性があります。 うまくいくはずです。 したがって、curl_setoptに進みます。 必要になります
CURLOPT_URLはリクエストURLです。
CURLOPT_POST-POSTリクエストを送信すると言います。
CURLOPT_POSTFIELDS-実際に変数をPOSTします。
CURLOPT_RETURNTRANSFER-要求の結果を返し、ブラウザに出力しません。
SSLパラメーターについて:
CURLOPT_SSL_VERIFYPEER-0に設定すると、リモートサーバーは証明書を確認しません。 それ以外の場合は、この証明書を送信する必要があります。
CURLOPT_CAINFO-CURLOPT_SSL_VERIFYPEERが1に設定されている場合、証明書ファイルを指定します
CURLOPT_SSLVERSION-通常は自動的に決定されるSSLバージョン(2または3)を示す整数。
CURLOPT_SSL_VERIFYHOST-証明書で指定されたリモートサーバーの名前を確認するかどうか。 値を「2」に設定すると、ホスト名もチェックされます。 (正直なところ、このフラグが何をするのかまだわかりません)
以上です。 Googleの場合は、証明書を持ってこなかったことを示すだけで済みます。 コードを書いています。
$postvars = array(
"Email" => "mail(at)gmail.com",
"Passwd" => "pass",
"service" => "blogger"
);
$postdata = "";
foreach ( $postvars as $key => $value )
$postdata .= "&".rawurlencode($key)."=".rawurlencode($value);
$postdata = substr( $postdata, 1 );
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close($ch);
echo $result;
$結果変数には、3行ありますが、そのうち1行のみが必要です。最後の行は「Auth = "で始まります」。 しかし、これについては、おそらく次回。
これは私のブログからのクロスポストです。