web-dev-qa-db-ja.com

wp_remote_get()がページを正しく取得できない

私はwp_remote_get()を使ってウェブからさまざまなページを取得しています。ニュースサイトです。

ほとんどの場合、これはうまく機能します。ただし、要求が成功(コード200)を返すことがありますが、そのページのコンテンツは、ブラウザで取得されたページとは異なります(この呼び出しで返されるページのコンテンツは、 "ページが見つかりません"という行に沿っています。 「)

ただし、問題のページを取得するためにブラウザを使用した場合、そのページは正常に返されます。

これが一例です。

// The following returns code 200, yet the returned page is different from the acual page that is accessed via the browser
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");

注:確認のために、私はPHPを介して返されたページとブラウザ経由でそのページのソースコードを見ましたが、それらは異なります。

何が問題なのかわかりません。私はそれがwp_remote_get()の引数でやるのが差し迫っているかもしれないと疑っています、しかし、 ドキュメンテーション 引数については明確ではありません。

それは議論ですか?もしそうなら、何をどのように設定するのですか?そうでない場合、あなたはその問題をどう思いますか?


重要なアップデートと解決策

zendka のコメントを読んだ後、 " 私は全く同じ内容になります。もう一度調べて、レスポンスボディをブラウザのページソースと比較しました。それらは同じです:) 「非常に重要なことに気づいた。

wp_remote_get()の私のコードで使用されていた元のURLはhttp://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطالياです。

そして電話は

// Causes problems
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطاليا");

この質問で使用され、もともと説明されているURLは

// Runs successfully
wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");

次の点に注意してください:

  1. 問題やエラーを発生させずにwp_remote_get()と連携させるためには、http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطالياの形式ではなく、http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7のようにエンコードする必要があります。

  2. wp_remote_get()http://www.aljazeera.net/news/international/2016/8/24/قتلى-ودمار-بزلزال-يضرب-وسط-إيطالياと連携できないのは、このutf8フォーマットに対応できないからです。これが正しく動作するためには、urlのパスのみをパーセントエンコード形式に変換する必要があります。さらに、パス内のスラッシュ(/)文字はエンコードしないでください。そうしないと、wp_remote_get()がページを見つけることができなくなるため、404ページの内容で成功コード(200)が得られます。したがって、このフォーマットhttp://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7は、wp_remote_get()に渡されると正しく機能します。

  3. フォーマットを誤って報告したのは、私がテストしている最中で、FirefoxからURLをコピーしてここに貼り付けたためです。 Firefoxはフォーマットを自動的に「正しい」フォーマットに変換します。詳細はこちら: https://superuser.com/questions/480692/copying-unicode-symbols-from-firefox-address-bar-as-is

解決策

  1. URLのパーセンテージ形式が正しいことを確認してください

  2. wp_remote_get()で新しくフォーマットされたURLを使う

役に立つリソース

https://github.com/neitanod/forceutf8

https://stackoverflow.com/questions/910793/detect-encoding-and-make-everything-utf-8

https://stackoverflow.com/questions/2742852/unicode-characters-in-urls

https://stackoverflow.com/questions/9831077/how-to-url-encode-only-non-ascii-symbols-of-url-in-php-but-leave-reserved-symbo

https://stackoverflow.com/questions/25465114/php-str-replace-not-working-with-special-chars

3
Greeso

wp_remote_get()によって送信されるHTTPリクエストは、ブラウザが送信するものとは異なります。例えばuser-agentは違います( documentation を参照)。いくつかのウェブサイトはこれに基づいて異なって反応します。 wp_remote_get()の2番目の引数はリクエストを変更することを可能にします。

Webサイトは、IPまたは受信した要求の数に応じて(通常は特定のパターンを制限または禁止することによって)応答が異なる場合があります。

ところで、私はあなたが言及したページをテストしました、そしてそれは私のために働きます:

wp_remote_get("http://www.aljazeera.net/news/international/2016/8/24/%D9%82%D8%AA%D9%84%D9%89-%D9%88%D8%AF%D9%85%D8%A7%D8%B1-%D8%A8%D8%B2%D9%84%D8%B2%D8%A7%D9%84-%D9%8A%D8%B6%D8%B1%D8%A8-%D9%88%D8%B3%D8%B7-%D8%A5%D9%8A%D8%B7%D8%A7%D9%84%D9%8A%D8%A7");
3
zendka