วิธีใช้ file_get_contents() กับคุกกี้ของผู้ใช้ Wordpress

ฉันต้องส่ง file_get_contents() ไปยังจุดสิ้นสุด API ด้วยคุกกี้ของลูกค้าที่ตั้งค่าโดย Wordpress เพื่อแสดงว่าผู้ใช้ลงชื่อเข้าใช้ไซต์ WordPress ฉันรู้ว่าฉันต้องใช้ stream_context_create() ประมาณนี้:

$cookies = ??? //THIS IS THE QUESTION (see answer below)!

// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: {$cookies}\r\n"
  )
);

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://example.dev/api/autho/', false, $context);

อย่างที่คุณเห็นจากความคิดเห็นในบรรทัดแรก ฉันติดอยู่กับวิธีส่งคำขอนี้เพื่อที่จะส่งคุกกี้ที่ถูกต้อง ฉันรู้ว่ามีการส่งคุกกี้ที่ถูกต้องเพราะฉันสามารถพิมพ์ $_COOKIES และดูที่นั่นได้ แต่ถ้าฉันพยายามแทรกอาร์เรย์เดียวกันนั้นลงในส่วนหัว มันจะไม่ทำงาน

ขอบคุณล่วงหน้า!

PS: ฉันได้อ่านเจอว่าฉันควรใช้ cURL สำหรับสิ่งนี้ แต่ฉันไม่แน่ใจว่าทำไม และฉันไม่รู้ว่าจะใช้มันอย่างไร... แต่ฉันเปิดรับแนวคิดนี้

อัปเดต: ฉันได้สิ่งนี้มาใช้งานได้ โดยพื้นฐานแล้วมันเป็นสิ่งเดียวกับที่ฉันทำ โดยมีคุกกี้ที่สำคัญอีกชิ้นหนึ่ง ดูคำตอบของฉันด้านล่าง


person emersonthis    schedule 31.07.2012    source แหล่งที่มา
comment
คุณแน่ใจ 100% หรือไม่ว่าไม่มีวิธีฝั่งไคลเอ็นต์ (Ajax) ในการทำเช่นนี้? มันจะสะอาดกว่ามาก   -  person Pekka    schedule 31.07.2012
comment
อาจซ้ำกันของ PHP - ส่งคุกกี้ด้วย file_get_contents   -  person nickb    schedule 31.07.2012
comment
เพื่อน ลิงค์แรกหลังจาก googling php curl cookiescoderscult .com/php/php-curl/2008/05/20/php-curl-cookies-example และเอกสาร PHP ฉบับเต็มสำหรับ curl_setopt โดยเฉพาะ CURLOPT_COOKIE   -  person Vyktor    schedule 31.07.2012
comment
@ Lusitanian PS: ฉันได้อ่านแล้วว่าฉันควรใช้ cURL สำหรับสิ่งนี้ แต่ฉันไม่แน่ใจว่าทำไมและฉันไม่รู้ว่าจะใช้มันอย่างไร ... แต่ฉันเปิดรับแนวคิดนี้ ‹ เขาควรใช้มัน :)   -  person Vyktor    schedule 31.07.2012
comment
@Vyktor facepalm ความผิดของฉัน (:   -  person Lusitanian    schedule 31.07.2012
comment
@Lusitanian: ฉันจะตรวจสอบทรัพยากร curl ที่คุณแนะนำ แต่ไม่ใช่ตัวเลือกแรกของฉันหากสามารถทำได้ด้วย file_get_contents() @Pekk: มีวิธีฝั่งไคลเอ็นต์ในการทำซึ่งใช้งานได้ดี แต่ฉันไม่มี ตัวเลือกนั้น มีปัญหาด้านความปลอดภัย   -  person emersonthis    schedule 01.08.2012


คำตอบ (4)


คุกกี้ควรอยู่ในรูปแบบต่อไปนี้: Cookie: cookieone=value; cookietwo=value กล่าวคือ คั่นด้วยเครื่องหมายอัฒภาคและการเว้นวรรคโดยไม่มีเครื่องหมายอัฒภาคต่อท้าย วนซ้ำอาร์เรย์คุกกี้ของคุณ ส่งออกรูปแบบนั้น และส่งไป

person Lusitanian    schedule 31.07.2012
comment
นี่เป็นสิ่งแรกที่ฉันพยายามแต่มันไม่ได้ผล ฉันไม่ได้รับอะไรกลับมาจาก file_get_contents ฉันไม่แน่ใจว่าทำไม - person emersonthis; 01.08.2012

ปรากฎว่าฉันทำถูกต้องแล้ว แต่ฉันไม่รู้ว่า WP จำเป็นต้องมีคุกกี้ตัวที่สอง เพื่อให้คำขอทำงานได้อย่างถูกต้อง

นี่คือรหัสที่เหมาะกับฉัน:

$cookies = $_COOKIE;
$name;
$value;
foreach ($_COOKIE as $key => $cookie ) {
    if ( strpos( $key, 'wordpress_logged_in') !== FALSE ) {
        $name = $key;
        $value = $cookie;
    } 
}

// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: {$key}={$cookie}; wordpress_test_cookie=WP Cookie check \r\n"
  )
);
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
$file = file_get_contents('http://mydomain.dev/api/autho/', false, $context);

var_dump($file);

โดยพื้นฐานแล้วมันเป็นสิ่งเดียวกับที่คุณเห็นในคำถามของฉัน แต่มีการเพิ่มที่สำคัญ: wordpress_test_cookie=WP Cookie check ฉันไม่เห็นมันถูกบันทึกไว้ที่ไหนเลย แต่ WP ต้องการคุกกี้นี้รวมถึงคุกกี้ wordpress_logged_in จริงเพื่อให้การโทรเกิดขึ้นในฐานะผู้ใช้ที่เข้าสู่ระบบ

person emersonthis    schedule 01.08.2012

โอเค อย่างที่คุณบอกไปแล้ว คุณควรใช้ cURL (บางส่วนเป็นความคิดเห็นส่วนตัวของฉัน ฉัน มีประสบการณ์ที่ไม่ดีกับการกำหนดค่าเซิร์ฟเวอร์ที่ห้ามการห่อไฟล์ URL)

คำพูดจาก manual:

URL สามารถใช้เป็นชื่อไฟล์ด้วยฟังก์ชันนี้ได้หากเปิดใช้งาน wrappers fopen

ดังนั้นอาจเกิดขึ้นกับคุณว่าโค้ดใช้งานไม่ได้ ในทางกลับกัน cURL ได้รับการออกแบบมาเพื่อดึงเนื้อหาระยะไกลและให้การควบคุมอย่างมากเกี่ยวกับสิ่งที่เกิดขึ้น วิธีดึงข้อมูล และอื่นๆ

เมื่อคุณดูที่ curl_setopt คุณจะเห็นได้ว่ามีสิ่งต่างๆ มากมายและมีรายละเอียดมากน้อยเพียงใด สามารถตั้งค่าได้ (แต่คุณไม่จำเป็นต้องทำ เป็นทางเลือกเมื่อคุณต้องการ)

นี่คือลิงก์แรกหลังจาก googling php curl set cookies เป็นสถานที่ที่ดีเยี่ยม ให้คุณเริ่มต้น... ตัวอย่างพื้นฐานนั้นไม่สำคัญเลย

person Vyktor    schedule 31.07.2012
comment
ฉันลองใช้ curl เช่นเดียวกับที่แสดงในลิงก์นั้น แต่มันใช้งานไม่ได้ ข้อมูลที่ส่งคืนแสดงว่าไม่มีผู้ใช้เข้าสู่ระบบ ถ้าฉันป้อนจุดสิ้นสุด API ลงในเบราว์เซอร์ ฉันจะเห็น Wordpress user_id ฯลฯ ดังนั้นคุกกี้จึงได้รับการตั้งค่าอย่างถูกต้อง - person emersonthis; 01.08.2012
comment
คุณรู้หรือไม่ว่าฉันควรเห็นไฟล์ชั่วคราวนั้นหรือไม่/ที่ไหนหลังจากที่ฉันทดสอบโค้ดนั้นแล้ว ฉันทดสอบบน MAMP PRO และไม่เห็นใน Applications/MAMP/tmp/ และฉันสงสัยว่ามีปัญหาเรื่องการอนุญาตหรืออะไร แต่ฉันไม่รู้จริงๆ ว่าฉันควรจะคาดหวังอะไร - person emersonthis; 01.08.2012
comment
อัปเดต. ฉันพบว่า MAMP เก็บไฟล์ไว้ที่ไหน (/private/tmp/COOKIxyz) ไฟล์ไม่แสดงสถานะการเข้าสู่ระบบของผู้ใช้: mydomain.dev FALSE / FALSE 0 PHPSESSID 8dacd1af06a4cc75936fef743b52a8ef - person emersonthis; 01.08.2012

$cookies = $_COOKIE;
foreach ($_COOKIE as $key => $cookie ) {
    if ( strpos( $key, 'wordpress_logged_in') !== FALSE ) {
        $name = $key;
        $value = $cookie;
        break;
    } 
}

// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: {$key}={$cookie}; wordpress_test_cookie=WP Cookie check\r\n"
  )
);
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
$file = file_get_contents('http://mydomain.dev/api/autho/', false, $context);

var_dump($file);

ฉันไม่มีประเด็นที่จะแสดงความคิดเห็น ดังนั้นฉันจึงอ่านโค้ดจาก emersonthis เพื่อให้สิ่งนี้ทำงานภายใต้การกำหนดค่าของฉัน (php 7.0.3, wordpress 4.4.2) ฉันต้องลบช่องว่างสุดท้ายหลังสตริง "ตรวจสอบคุกกี้ WP"

person Fredrik_Borgstrom    schedule 08.03.2016