برای من جالب بود که بدونم مثلن بین اکانت X و Y تو توییتر کی ها مشترک هستن یا راحتتر دوستهای مشترک دو تا اکانت مورد نظر من چه کسایی هستند. خوب وقتی من با اکانت خودم لاگین هستم میتونم برم تو اکانتهای دیگه و توییتر بهم میگه از افرادی که من رو فالو میکنن کدومشون این اکانت رو دارن فالو میکنن ولی گفتم که من میخواستم بدونم دو تا اکانتی که من انتخاب کردم کی ها رو مشترک دارن.
برای بدست آوردنش از دو تا API توییتر استفاده میکنیم یکی برای پیدا کردن ID های فالویینگهای کاربران هدفم (Twitter IDs) و یکی هم برای برگردوندن ID ها به یوزنیم (users/lookup) . البته میشه فقط از یه API استفاده کرد ولی از اونجایی که فقط یوزنیم رو نمیده و کلی اطلاعات دیگه رو هم از فالویینگها میفرسته و این حجمش زیاد میشه خب، به همین خاطر اول ID ها رو میگیرم که حجمی ندارن و کمتر هم میشن چون مشترکاتشون رو بر میداریم و بعد این ID ها رو میدیم و بقیه چیزا رو میگیریم.
خیلی خلاصه، اینطور میشه که دو تا username رومیگیرم و برای هر کدوم جداگونه ID های کسایی که فالوش میکنن رو با Twitter IDs پیدا میکنم و بعد ID های مشترک رو پیدا میکنیم و از users/lookup استفاده میکنیم برای پیدا کردن Username اون ID ها و دان.
خب برای این کار که یه اپ تو توییتر میسازیم، و برای اینکه این اپ بتونه با API ها کار کنه نیاز به احراز هویت و دسترسی داره که توییتراز oAuth استفاده میکنه- یه دسترسی به اکانتها و فرستادن اطلاعات و گرفتنشون از API ها- بعد از احراز هویت یه token میگیریم که میتونیم باهاش از API ها استفاده کنیم. و برای اینکه درخواست token بدیم باید key رمز شده با base64 دو تا key که یکیش Consumer Key (API Key) و یکی هم Consumer Secret (API Secret) هست رو بسازیم. (تو صفحه اپلیکیشنی که ساختیم این دو تا key هستند)
خیلی سادهتر دو تا key رو با “:” بینشون پشت هم بنویسین و برای رمز base64 از این سرویس استفاده کنین. نتیجه اش همونی میشه که من تو کد پایین به اسم base64 encoded key نوشتم . (و یا میتونیم به جای استفاده از سرویس آنلاین تو php از () base64_encode و یا تو بش از echo ‘API key:API Secret’ | base64 استفاده کنیم) .
قطعه کد برای گرفتن token : (چون اطلاعات رو با url میفرستیم از cURLاستفاده کردم)
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://api.twitter.com/oauth2/token"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $headers = array(); $headers[] = 'Authorization: Basic base64 encoded key'; $headers[] = 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch,CURLOPT_POSTFIELDS, 'grant_type=client_credentials'); $server_output = curl_exec ($ch); $data = json_decode($server_output, true); $tok=$data['access_token']; curl_close ($ch);
خب حالا این توکن رو داریم و ازش استفاده میکنیم برای فرستادن درخواست به API ها، برای نمونه برای گرفتن ID یه اکانتی ($user_name) :
$ch_user = curl_init(); curl_setopt($chUser, CURLOPT_URL,"https://api.twitter.com/1.1/friends/ids.json?screen_name=".$user_name."&count=5000"); curl_setopt($ch_user, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch_user, CURLOPT_POST, FALSE); $headers = array(); $headers[] = 'Authorization: Bearer '. $tok_str; curl_setopt($chUser, CURLOPT_HTTPHEADER, $headers); $server_Output = curl_exec ($ch_user); $first_obj = json_decode($server_Output, true); curl_close ($ch_user);
چون خروجی json هست به آرایه برگردوندمش تا با آرایه دیگهای که برای کاربر دومم یا … میگیرم بتونم مشترکاتشون رو با array_values بگیرم. و در نهایت خروجی رو به string تبدیل میکنیم و میدیم به درخواست API users/lookup : (به اسم common_ids$)
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://api.twitter.com/1.1/users/lookup.json?user_id=".$common_ids); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, FALSE); $headers = array(); $headers[] = 'Authorization: Bearer '.$tok_str; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $serverOutput = curl_exec ($ch); $resultObj = json_decode($serverOutput, true);
همین دیگه.
من جوابمو گرفتم هر چند ممکنه کدی که نوشته باشم بهینه نباشه، و کم کم سعی میکنم چیزای بیشتری یاد بگیرم و بتونم بهینه و درست و درمون بنویسم. نوشتنش اینجا بیشتر به خاطر ایده باحالش بود البته برای من باحال بود دونستنش، و حتا از بالا به قضیه نیگاه کنیم میبینیم که خیلی کارای دیگه هم میشه کرد. آمارای باحال دیگه در آورد و …
سر این قضیه من از آقای حسین بقایی کلی سوال پرسیدم و ایشون هم کلی بهم کمک و راهنمایی کردن . خیلی ممنون هستم از ایشون.