سؤال

لا بد لي من إرسال المعلومات إلى موقع ويب خارجي باستخدام cURL.لقد قمت بإعداد Guzzle على تطبيق Laravel الخاص بي.لقد قمت بإعداد الأساسيات، ولكن وفقًا لوثائق موقع الويب، هناك إجراء مطلوب لاسم المستخدم وكلمة المرور.كيف يمكنني تمرير "الإجراء" مع بيانات الاعتماد اللازمة لتسجيل الدخول والحصول على حق الوصول؟

ينص الموقع على ما يلي:

curl [-k] –dump-header <header_file> -F “action=login” -F “username=<username>” -F “password=<password>” https://<website_URL>

وحدة التحكم الخاصة بي:

    $client = new \GuzzleHttp\Client();

    $response = $client->get('http://website.com/page/login/', array(
        'auth' => array('username', 'password')
    ));

    $xml = $response;
    echo $xml;

سيتم تحميل الموقع على echo, ، ولكنه لن يؤدي إلا إلى سحب شاشة تسجيل الدخول.أحتاج إلى بيانات الاعتماد هذه لتجاوز شاشة تسجيل الدخول (مع تسجيل دخول ناجح) للوصول إلى جزء المعلومات الذي أحتاجه لـ cURL.

هل كانت مفيدة؟

المحلول

curl -F يرسل طلب POST بدلاً من طلب GET.لذلك سوف تحتاج إلى تعديل التعليمات البرمجية الخاصة بك وفقا لذلك، شيء من هذا القبيل

$client = new \GuzzleHttp\Client();

$response = $client->post('http://website.com/page/login/', [
    'body' => [
        'username' => $username,
        'password' => $password,
        'action' => 'login'
    ],
    'cookies' => true
]
);

$xml = $response;
echo $xml;

يرى http://guzzle.readthedocs.org/en/latest/quickstart.html#post-requests, http://curl.haxx.se/docs/manpage.html#-F

يحرر:

فقط اضف ['cookies' => true] للطلبات من أجل استخدام ملف تعريف الارتباط المصادقة المرتبط بهذا GuzzleHttp\Client(). http://guzzle.readthedocs.org/en/latest/clients.html#cookies

$response2 = $client->get('http://website.com/otherpage/', ['cookies' => true]);

نصائح أخرى

كنت أواجه مشكلة في الحصول على إجابة @JeremiahWinsley للعمل على الإصدار الأحدث من Guzzle لذا قمت بتحديث الكود الخاص بهم للعمل اعتبارًا من Guzzle 5.x.

هناك حاجة إلى ثلاثة تغييرات رئيسية

  • استخدام form_params بدلاً من body لمنع ظهور الخطأ "تم إهمال تمرير خيار الطلب "النص الأساسي" كمصفوفة لإرسال طلب POST."
  • تغيير ملفات تعريف الارتباط لاستخدام CookieJar هدف
  • يستخدم ->getBody()->getContents() للحصول على جسم الطلب

هنا هو الكود المحدث:

$client = new \GuzzleHttp\Client();
$cookieJar = new \GuzzleHttp\Cookie\CookieJar();

$response = $client->post('http://website.com/page/login/', [
    'form_params' => [
        'username' => $username,
        'password' => $password,
        'action' => 'login'
    ],
    'cookies' => $cookieJar
]
);

$xml = $response->getBody()->getContents();
echo $xml;

ولمواصلة استخدام ملفات تعريف الارتباط في الطلبات المستقبلية، قم بتمرير cookieJar إلى الطلب:

$response2 = $client->get('http://website.com/otherpage/', ['cookies' => $cookieJar]);

كنت أواجه مشكلة في الحصول على إجابة @JeremiahWinsley و@Samsquanch للعمل على الإصدار الأحدث من Guzzle.لذلك قمت بتحديث الكود ليعمل اعتبارًا من Guzzle 6.x.

أسرف في تناول الطعام 6.x.وثائق: http://docs.guzzlephp.org/en/stable/index.html

هنا هو الكود المحدث:

use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;

try {
        $client = new Client();
        $cookieJar = new CookieJar();

        $response = $client->request('POST', 'http://website.com/page/login/', [
            'form_params' => [
                'username' => 'test@example.com',
                'password' => '123456'
            ],
            'cookies' => $cookieJar
        ]);

        $response2 = $client->request('GET', 'http://website.com/otherpage/', [
            'cookies' => $cookieJar
        ]);

        if ($response2->getStatusCode() == 200) {
            return $response2->getBody()->getContents();
        } else {
            return "Oops!";
        }
    } catch (\Exception $exception) {
        return 'Caught exception: ', $exception->getMessage();
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top