درحالت کلی برای دریافت اطلاعاتِ کاربر جاری X، روال به این صورت است که در سایتی (مثلا طرفداری) کاربر X برروی لینکی (مثلا «دریافت لیست تماس‌ها از یاهو») کلیک می‌کند، سپس صفحه‌ای متعلق به سایت یاهو باز می‌شود که از شما (کاربر X) اجازه می‌خواهد تا «طرفداری» به موارد مندرج (مثلا لیست تماس‌ها) دسترسی داشته باشد. بعد از موافقت شما، دوباره به صفحه‌ای از سایت طرفداری بازمی‌گردید که لیست تماس‌هایتان را از یاهو دریافت کرده است و به شما نمایش می‌دهد. در این پست قصد داریم نحوه‌ی انجام مراحل بالا را (از طرف سایت) شرح دهیم.

درحالت کلی برای دریافت اطلاعاتِ کاربر جاری X، روال به این صورت است که در سایتی (مثلا طرفداری) کاربر X برروی لینکی (مثلا «دریافت لیست تماس‌ها از یاهو») کلیک می‌کند، سپس صفحه‌ای متعلق به سایت یاهو باز می‌شود که از شما (کاربر X) اجازه می‌خواهد تا «طرفداری» به موارد مندرج (مثلا لیست تماس‌ها) دسترسی داشته باشد. بعد از موافقت شما، دوباره به صفحه‌ای از سایت طرفداری بازمی‌گردید که لیست تماس‌هایتان را از یاهو دریافت کرده است و به شما نمایش می‌دهد.

در این پست قصد داریم نحوه‌ی انجام مراحل بالا را (از طرف سایت) شرح دهیم:

  1. ابتدا نیاز است که یک application را در حساب یاهو خود ایجاد کنید. با این کار به یاهو می‌گویید که پس از موافقت کاربر یاهو او را به چه آدرسی هدایت کند. البته شناسه‌ و کد مخفی نیز برای app صادر می‌شود.
    1. به قسمت My Apps در حسابتان بروید (از آدرس https://developer.yahoo.com).
    2. بر روی create an app کلیک کنید.
    3. اطلاعات ضروری را وارد کنید. گزینه‌ی This app requires access to private user data را فعال کنید. با این کار فیلد Callback Domain ظاهر می‌شود که در اینجا مسیری را (با دقت) وارد کنید که تمایل دارید یاهو، پس از موافقت کاربر، اجازه‌ی دسترسی را به آن بفرستد. هشدار: اگر این مسیر با مسیر واقعی شما هماهنگ نباشد با عدم پاسخ از طرف یاهو روبرو می‌شوید که حتی خطا را هم به شما گوشزد نمی‌کند.
    4. نوع دسترسی را مشخص کنید. مثلا برای این مثال contacts و فقط برای خواندن (read).
    5. create apps را کلیک کنید.
    6. دوباره به صفحه‌ی My apps بازگردید و بر روی application ایجاد شده کلیک کنید.
    7. برای callback domain خود verify domain را انتخاب کنید. در این قسمت باید به یاهو نشان دهید که domain متعلق به شماست. برای اینکار مطابق دستورات یک فایل با نام گفته شده را در domain خود قرار دهید و سپس verify کنید. در صورت موافقت علامت تیک سبز در کنار application  ظاهر می‌شود.
    8. حال می‌توان با یاهو تعامل کرد.
  2. ابتدا باید توسط درخواست GET که در زیر آمده است (به صورت POST نیز امکان پذیر است) از یاهو token دریافت کرد:
    1. https://api.login.yahoo.com/oauth/v2/get_request_token?
      oauth_nonce=<a random 32-char string preferably a hexadecimal number>
      &oauth_timestamp=<current timestamp>
      &oauth_consumer_key<the costumer key from yahoo>
      &oauth_signature_method=plaintext
      &oauth_signature=<the costumer secret key from yahoo>%26
      &oauth_version=1.0
      &xoauth_lang_pref=en-us
      &oauth_callback=<the callback address (not just domain) you have set in your yahoo application>
    2. که در آن <x> را با مقدار مشخص شده عوض کنید. oauth_nonce در یاهو برای جلوگیری از حمله استفاده می‌شود و باید طی ۱ ساعتی که درخواست بالا معتبر است برای هر کاربر منحصر به فرد باشد.
    3. اگر ورودی‌های شما اشتباه باشند ممکن است از یاهو هیچ پاسخی دریافت نکنید.
  3. یاهو به شما به صورت GET اطلاعاتی را ارسال می‌کند که باید oauth_token_secret آن را برای کاربر جاری ذخیره کنید (مثلا در session) و سپس کاربر را به آدرس قرار گرفته در xoauth_request_auth_url بفرستید (بدون هیچ پارامتر اضافی). می‌توانید اینکار را به صورت redirect خودکار یا قرار دادن یک hyperlink برای کاربر انجام دهید.
  4. در این مرحله کاربر موافقت خود را با دسترسی «طرفداری» اعلام می‌کند و یاهو به آدرس callback اطلاعات لازم را به صورت GET می‌فرستد.
  5. حال در فایلی که پاسخگوی آدرس callback است مراحل باقیمانده‌ی اجازه‌ی دسترسی و گرفتن لیست کاربران را انجام می‌دهیم.
  6. یاهو متغیر‌های oauth_token و oauth_verifier را برای ما برگردانده است که از آنها برای گرفتن کلید نهایی جهت دسترسی به اطلاعات فردی استفاده می‌کنیم. این کار با ارسال درخواست زیر صورت می‌گیرد:
    1. https://api.login.yahoo.com/oauth/v2/get_token?
      oauth_consumer_key=<the costumer key from yahoo>
      &oauth_signature_method=PLAINTEXT
      &oauth_version=1.0
      &oauth_verifier=<oauth_verifier>
      &oauth_token=<oauth_token>
      &oauth_timestamp=<current timestamp>
      &oauth_nonce==<a random 6-char string preferably a hexadecimal number>
      &oauth_signature=<the costumer secret key from yahoo%26oauth_token_secret that was saved in session>
    2. توجه: در راهنمایی سایت یاهو به اشتباه آمده است که بین customer secret و oauth secret علامت & قرار داده شود که نباید قرار داد وگرنه خطای invalid signature صادر می‌شود.
  7. با دریاف کلید نهایی از یاهو، متغیر‌های oauth_token_secret و oauth_token قبلی منقضی شده‌اند و باید با مقادیر جدیدی که همراه کلید نهایی در پاسخ GET یاهو قرار دارند جایگزین شوند. درصورت فرستادن درخواست جدید به یاهو توسط متغیرهای منقضی شده، یاهو به اشتباه خطای invalid signature را صادر می‌کند، پس مواظب باشید.
  8. حال می‌توانیم، با کلیدهای جدید، لیست تماس‌های فرد را با ارسال درخواست زیر از یاهو دریافت کنیم:
    1. https://social.yahooapis.com/v1/user/{$xoauth_yahoo_guid}/contacts;email.present=1;start=0;count=max?
      format=xml
      &realm=yahooapis.com
      &oauth_consumer_key=<the costumer key from yahoo>
      &oauth_nonce=<a random 6-char string preferably a hexadecimal number>
      &oauth_timestamp=<current timestamp>
      &oauth_token=<oauth_token>
      &oauth_version=1.0
      &oauth_signature_method=PLAINTEXT
      &oauth_signature=<the costumer secret key from yahoo%26oauth_token_secret that is returned from yahoo>
      
    2. توجه کنید که xoauth_yahoo_guid در جواب پیشین یاهو (همراه با کلید نهایی) به ما فرستاده شده است که شناسه‌ی دسترسی کاربر جاری را مشخص می‌کند. برای دسترسی به اطلاعات فردی، این شناسه جزیی از آدرس است.
    3. برای دسترسی به لیست تماس از سرویس contacts استفاده شده است. سرویس‌های دیگر در سایت developer یاهو توضیح داده شده‌اند.
    4. می‌توان لیست درخواستی را با اعمال فیلتر‌های مختلف محدود کرد. در اینجا email.present=1 تنها contactهای دارای ایمل را مشخص می‌کند و start=0;count=max می‌گوید از ابتدای لیست و به تعداد حداکثر ممکن (برای یاهو حدود ۵۰۰۰ نفر) برگرداند.
  9. با دریافت xml و نگاهی اجمالی به آن به ساختار فایل پی‌ خواهید برد و فیلدهای مورد نیاز هر contact را (مثلا نام، نام میانی، نام خانوادگی، ایمیل و شماره تلفن) می‌توانید استخراج کنید. در php برای تبدیل xml به یک آرایه‌ از xml_parse_into_struct استفاده کنید.

 

با آرزوی موفقیت،

پویا اسماعیلیان

افزودن نظر جدید