وقتی مردم می­‌خوابند: تعیین فعالیت در فیس­بوک با استفاده از گوگل کروم، جاوااسکریپت و پیتون

استفاده از این مطلب با ذکر منبع (سایت جامع) آزاد است.

منبع:Bellingcat

ترجمه:جامع

این مقاله در اصل روی AutomatingOSINT.com blog. منتشر شده بود.

این مقاله در پاسخ به این سوال نگاشته شده که چگونه می­‌توانید بگویید که در کدام ساعت روز مردم در فیس­بوک فعال­ ترند؟ این سؤال جالبی است که در فروم‌­های IntelTechniques.com پرسیده شده بود. ابزارهایی برای این کار در توییتر و دیگر پایگاه­‌ها تعریف شده است اما با API محدود فیس‌­بوک، به دست آوردن چنین داده­‌هایی کاری سخت و طاقت­ فرسات. در حال حاضر به­ هیچ وجه قصد ندارم از پیتون استفاده کنم، می­خواهم به شما نشان دهم که چگونه از ابزارهای توسعه­ دهنده­‌ی Chrome مثل Javascript IDE بهره ببرید، به این ترتیب می‌توانید در هر صفحه­ وبی که در حال حاضر در آن گشت­ وگذار می­‌کنید، کدنویسی کنید. به­ محض اینکه داده­‌های  مورد نظر را استخراج نمودیم، از ترفند سریع و کثیفی استفاده می­‌کنیم که به پیتون اجازه می‌­دهد این داده‌­ها را مرتب کرده و وارد یک فایل CSV کند تا ما بتوانیم با بهره‌­گیری از Excel یا Google Fusion Charts نمودار زیبایی بسازیم که امکان تحلیل را به ما می­‌دهد. بیایید شروع کنیم!

وب­‌سایت­‌های مهندسی معکوس با کروم

شاگردان من از تکرار این مطلب اشباع شده‌­اند که چقدر Google Chrome برای درآوردن دل و روده­ی یک وب ­سایت فوق ­العاده است. کاملاً ضروری است که روی بخش‌­هایی از یک وب­ سایت که به آنها علاقه دارید، متمرکز شوید، چه هنگامی که دارید یک وب اسکریپر می­‌نویسید و چه زمانی که (در همین مورد ما) می‌خواهید اطلاعاتی را درمورد زمان پست­های فیس­بوک استخراج کنید. اولین کاری که باید انجام دهید (به­ جز اینکه باید کروم را اگر ندارید نصب کنید)، این است که تشخیص دهید محتوایی که به­ دنبال آن می‌گردید دقیقاً کجاست. در مورد فعلی، ما به­ دنبال تعداد زمان­‌هایی می­‌گردیم که یک کاربر فیس­بوک پست گذاشته است. حالا می­‌خواهیم از صفحه­‌ی Vancouver Canucks (بهترین تیم هاکی) به­عنوان یک مثال استفاده کنیم.

 

صفحه Vancouver Canucks

 

همه­‌ی ما پست­‌هایی را دیده‌­ایم که برچسب ۱۶ hrs یا ۱۰ hrs را بر خود دارند که نشان می­‌دهد چند ساعت قبل به وقت شما، پست شده‌اند. بیایید ببینیم چه چیزی واقعاً پشت این استتوس به­‌دردنخور ۱۶ hrs است. درست روی آن کلیک کنید، و از منوی باز شده Inspect  را انتخاب کنید:

 

مشاهده مشخصات استاتوس

 

این کار صفحه­‌ی ابزارهای توسعه ­دهنده­‌ی گوگل کروم (the Google Chrome developer tools pane) را باز می­‌کند، و این جایی است که شگفتی آغاز می‌­شود. وقتی این قسمت باز شد، عنصر HTML که می­‌خواهید مورد تفتیش قرار گیرد، های­لایت خواهد شد. نگاهی به نتیجه در پایین بیندازید:

 

نگاهی به html صفحه

اگر نگاه دقیق­‌تری بیاندازید می­‌بینید که عنصر انتخاب شده، رشته­‌ی ۱۶ hrs  را دقیقاً همان­‌طور که انتظار داشتیم در خود دارد. هرچند اگر کمی بالاتر را نگاه کنید، تگ abbr  را خواهید دید که رشته­‌ی تاریخ کامل یعنی ‘Saturday, March 26, 2016 at 4:00pm’ را دارد اما جالب‌­تر از آن ویژگی data-utime  است که به‌­نظر می­‌رسد یک برچسب زمانی Unix باشد (یک مبدل را در اینجا چک کنید). این برچسب زمانی برای ما مفید خواهد بود، چراکه می‌توانیم به­‌سادگی آن را به ابژه­‌ی زمان­دار/ datetime قابل استفاده­ای در پیتون جهت انجام تحلیل­‌های بعدی، تبدیل کنیم. ترفند ما استفاده از تمامی تگ‌­های abbr  و سپس استخراج ویژگی data-utime از هرکدام از آنهاست.

شما باید زبانه­‌ی Console را ببینید که درواقع جایی است که می­‌توانیم برخی کدهای  Javascript را در آن بگذاریم؛ پس بیایید این کار را انجام دهیم. کدی که می‌­توانید در آن وارد کنید:

(abbr_tags = document.getElementsByTagName(“abbr”

این کار تمام متغیرهای abbr_tags  را با همه­‌ی تگ­‌های abbr  که در حال حاضر در این صفحه یافت می‌شوند، یک جا جمع خواهد کرد. البته که در فیس­بوک هرچه صفحه را به سمت پایین پیمایش کنید، پست­های بیشتری بارگذاری شده و امکان کشف داده­های بیشتری را خواهید داشت.

 

 

تمام متغیرهای abbr_tags

 

عالی است. حالا همان­‌طور که قبلا اشاره شد، می­‌خواهیم ویژگی data-utime  را استخراج کنیم و یک دستور Javascript وجود دارد که دقیقاً همین کار را انجام می­‌دهد و نام آنgetAttribute() است. برای امتحان عبارت زیر را در کنسول Javascript خود وارد کنید:

کنسول Javascript

 

وقتی این خطوط از کدها را وارد کردید می‌­توانید ببینید که ما دقیقاً همان قسمتی از برچسب زمانی را که می­‌خواهیم استخراج کردیم. راحت باشید و سعی کنید رشته تاریخی را که بیش از این به آن اشاره کردم استخراج کنید!

به‌­این‌­ترتیب ما یک برچسب زمانی را استخراج کردیم اما می­‌خواهیم تمام آنها را به­‌دست آوریم. این کار ار با راه­‌اندازی یک متغیر رشت‌ه­ای خالی انجام خواهیم داد، و سپس یک دستور حلقه‌ه­ای (لوپ) ایجاد خواهیم کرد که وارد هریک از تگ­‌های abbr  در آرایه‌­ی ما خواهد شد و به افزودن برچسب­‌های زمانی به رشته­‌ی خالی ادامه خواهد داد:

 

افزودن برچسب­‌های زمانی

 

 

افزودن برچسب­‌های زمانی

 

فوق­‌العاده است! حالا متغیر برچسب زمانی ما، فهرستی از برچسب­‌های زمانی یونیکس خواهد داشت که هریک در یک خط بوده و آماده­‌ی وارد شدن به اسکریپتِ پیتون جهت پردازش شدن هستند. ساده‌­ترین راه برای این کار استفاده از دستور copy() در Javascript است که متغیر را در کلیپ­‌بورد ما کپی خواهد کرد:

دستور copy() در Javascript

 

زیباست. حالا برویم یک اسکریپت سریع پیتون را برای پردازش برچسب­‌های زمانیمان راه بیاندازیم.

صبر کنید، چرا همه­‌ی این کارها را  در پیتون انجام ندهید؟

سوال خوبی است که می­‌دانم خیلی از شما می­‌پرسید. بله، می‌­توانستیم از Selenium  استفاده کنیم (که همان چیزی است که من به شاگردانم درس می­‌دهم) یا چارچوب دیگری که از عهده­‌ی همه­‌ی این جریان در پیتون بر بیاییم، اما چه باور کنید چه نکنید در حال حاضر من ترجیح می­‌دهم چیزی را به­‌سرعت در مرورگری که از Javascript استفاده می­‌کند، راه‌­اندازی کنم. به­‌علاوه، هرزمان که بتوانید دانش خود را درمورد نحوه­‌ی عملکرد وب­‌سایت­‌ها، شامل نوشتن کمی Javascript گسترش دهید، در این کار بهتر خواهید شد. حالا به سراغ همان پیتون برویم.

جادوی پیتون

همان­طور که قبلاً اشاره شد، پیتون تعدادی سازه­‌ی بسیار کارآمد در مجموعه برنامه­‌هایش دارد که می­‌تواند در تبدیل آن برچسب­‌های زمانی به ابژه­‌ی datetime مفید، و سپس تعیین زمان­‌های دقیقی که یک حساب کاربری درطول روز یا شب فعال شده است، به ما کمک کند. برای این کار راه­‌های مختلفی وجود دارداما من قصد دارم تا حد امکان آن را ساده کنم. بیایید با ساخت یک فایل جدید در fbsleep.py در Python IDE محبوبمان (امیدوارانه Wing) یا ویراستار متن شروع و کد زیر را وارد کنیم:

ساخت یک فایل جدید در fbsleep.py در Python IDE

خیلی­ خوب، پس ما فقط چند خط اول را وارد کتابخانه‌­های ضروری کردیم تا از پس تبدیل برچسب زمانی و برخی مجموعه‌­های کمک­‌رسان برای تولید خروجی، بر بیاییم . مابقی کد موردنظر:

  • خط ۶: همان‌­طور که معلوم است اینجا همان­‌جایی است که باید برچسب­‌های زمانی خود را که کد Javascript در کلیپ­‌بردتان کپی کرده‌­است، بچسبانید/ pasteکنید. اطمینان یابید که شما درواقع قسمت ‘PASTE YOUR CLIPBOARD HERE’ را حذف کرده‌اید.
  • خط ۸:به یک دیکشنری خالی مقدار اولیه می­‌دهیم که تمامی برچسب­‌های زمانی تحلیل شده را دربرخواهد گرفت.
  • خطوط ۱۲-۱۰: یک کلید برای هر ساعت روز، در دیکشنری time_frequency  خود می‌­سازیم و آن را روی ۰ تنظیم می‌کنیم. وقتی برچسب­‌های زمانی که در یک ساعت مشخص می­‌گنجند را یافتیم، این عدد را افزایش خواهیم داد. به­‌عنوان مثال، برچسب زمانی پستی که ۱ بعدازظهر (۱:۰۰ PM) است، time_frequency را به ۱ افزایش خواهد داد.

حالا بیایید هریک از برچسب­‌های زمانی را که گفتیم تجزیه کنیم و کنتورها را آن­طور که توضیح داده شد، افزایش دهیم:

تجزیه برچسب های زمانی

  • خط ۱۴: با استفاده از دستور splitlines()  با فهرست برچسب­‌های زمانی کار می­‌کنیم تا آن را تجزیه کنیم، یکی برای هر خط. این همان دلیل قرار دادن “\r\n”   در کد Javascript  است تا چیزی برای تقسیم کردن در اختیارمان قرار دهد.
  • خط ۱۶: در اینجا ما با فراخواندن دستور datetime.fromtimestamp  و تصویب یکی از برچسب­‌های زمانی خود، ابژه‌­ی datetime  را به­‌دست می­‌آوریم. هم­چنین مشاهده می‌کنید که باید برچسب زمانی را با استفاده از دستور int() از یک رشته به عددی صحیح تبدیل کنیم.
  • خط ۱۸: ما فقط بخش ساعت ابژه‌­ی datetime را استخراج می­‌کنیم. می­بینید که اگر می­‌خواستید می­‌توانستید پردازش­‌های دیگری را نیز در اینجا انجام دهید، مثلاً رایج­ترین دقیق‌ه­ای را که یک حساب کاربر خاص پست گذاشته است. یا ماه. یا سال.
  • خط ۲۰: ما از مقدار ساعتی که به­‌عنوان کلیدی برای دیکشنری time_frequency  خود استخراج کردیم، استفاده می­‌کنیم، و مقدار فعلی ذخیره شده در این کلید را به ۱ افزایش می­‌دهیم. این به این خاطر است که هر مقدار برچسب زمانی که داریم، پستی را نشان می­‌دهد که کاربر فیس­بوکِ هدف گذاشته است.
  • خط ۲۳-۲۲: ما از ماژول دلپذیر پرینت pprint  برای گرفتن پرینت نسخه‌­ای خوانا از دیکشنری time_frequency  استفاده می­‌کنیم. حتی نگاهی صرفاً اجمالی به این دیکشنری، بیشترین و کم­ترین ساعت­‌های فعال در روز برای یک کاربر خاص را به شما خواهد گفت. تر و تمیز!

بسیار خوب پس ما پردازش اولیه را انجام دادیم و می­‌توانیم ساعات فعالیت و عدم فعالیت را مشاهده کنیم، ولی مثل همیشه تجسم بخشیدن این اطلاعات خوب است. یکی از دم‌­دست­‌ترین راه­‌های این کار البته که صفحات گسترده‌­ی اکسل یا جداول فیوژن گوگل است. پس بیایید حالا این داده­‌ها را برداریم و وارد یک فایل CSV کنیم تا بتوانیم به یکی از دو ابزار یادشده واردشان کنیم:

واردن کردن داده ها در فایل csv

بیایید این کد را کمی بشکنیم:

  • خط ۲۵: فایل جدیدی به­نام facebook-sleep.csv  برای نوشتن باز می­‌کنیم و فایل هندل (گیره­‌ی فایل) را در متغیر csv_output ذخیره می­‌کنیم.
  • خط ۲۷: فهرستی از نام­‌های فیلد برای فایل CSV خودمان ایجاد می­‌کنیم، که به­‌عنوان سربرگ برای هریک از ستون­‌های صفحه­‌گسترده، استفاده خواهد شد.
  • خطوط ۳۰-۲۹: ابژه­ی DictWriter تازه­ای را راه‌­اندازی می‌کنیم که برای نوشتن فایل CSV ما، مورد استفاده قرار خواهد گرفت، و با دستور writeheader()، خط سربرگ در صفحه‌­گسترده را می­‌نویسیم.
  • خطوط ۳۸-۳۲: در هریک از کلیدهایمان در دیکشنری time_frequency  حلقه (لوپ) ایجاد می­‌کنیم (۳۲) و سپس یک دیکشنری تازه ایجاد می­‌کنیم که همان کلیدهای سربرگ­‌های CSV ما را داراست (۳۵) و ساعت (۳۵) و تعداد پست­‌ها را ذخیره می­‌کنیم (۳۶). سپس این دیکشنری را در قالب یک ردیف در صفحه‌­گسترده­‌مان می­‌نویسیم.

اجازه دهید ریپ شود!

اگر همه ­چیز خوب پیش برود و اسکریپت را راه باندازید، باید خروجی­‌ای شبیه این را ببینید:

Justins-MacBook-Pro: justin$ python fbsleep.py

در اینجا نقشه‌­ی فرکانس را می­‌بینید:

{۰: ۴,
۱: ۲,
۲: ۰,
۳: ۰,
۴: ۲,
۵: ۰,
۶: ۲,
۷: ۰,
۸: ۱,
۹: ۹,
۱۰: ۱,
۱۱: ۱۴,
۱۲: ۱۴,
۱۳: ۱۳,
۱۴: ۱۶,
۱۵: ۲۱,
۱۶: ۱۲,
۱۷: ۱۳,
۱۸: ۱۱,
۱۹: ۱۶,
۲۰: ۱۴,
۲۱: ۱۰,
۲۲: ۴,
۲۳: ۷}

[*] Done writing facebook-sleep.csv!

باید فایل facebook-sleep.csv  را در همان دیکشنری اسکریپت پیتون خودتان ببنید. حالا بیایید این داده­‌ها را با جداول فیوژن گوگل مصوّر کنیم.

  1. به سایت جداول فیوژن بروید.
  2. فایل facebook-sleep.csv خود را وارد کنید.

مصور کردن داده ها با جداول فیوژن گوگل

 

  1. روی علامت به­‌علاوه­‌ی قرمز کلیک کرده و افزودن نمودار / add chartرا انتخاب کنید.
  2. نمودار میل‌ه­ای را انتخاب کرده و عدد حداکثر دسته‌­بندی ها/ Maximum Categories را روی ۲۴ تنظیم کنید. باید نمودار زیبایی را ببینید که ساعات بیشترین فعالیت، کمترین فعالیت، و کاملاً غیرفعالِ روز برای حساب کاربری موردنظرتان را به شما نشان دهد.

نموداری از ساعات بیشترین فعالیت، کمترین فعالیت

 

زیباست! البته که می‌­توانید با دیگر انواع نمودار و روش‌­های مختلف تصویر کردن داده‌­ها بازی کنید. باید به یاد داشت که چیزی که به آن نگاه می‌­کنید، تنها نمایانگر پست‌هایی از کاربر فیس­بوک است که آنها را پیمایش کرده و دیده‌­اید. اگر می‌خواهید بیشتر از این به سمت پایین صفحه بروید، باید تمام مراحلی را که در بالا گفته شد تکرار کنید، اما راستش این کار اصلاً وقت زیادی نمی­‌برد.

در اینجا تکلیفی برای منزل به شما می­‌دهم، مشتاقم بدانم آن را چگونه انجام داده‌­اید:

  • چند Javascript اجرا کنید که صفحه­‌ی فیس­بوک را اتوماتیک به‌­سمت پایین پیمایش کند (auto-scrolls down ) تا بتوانید تمامی پست‌­های کاربر را بارگذاری کنید.
  • جهت مصور کردن داده­‌ها، از پیتون به­‌جای اکسل یا نمودارهای فیوژن گوگل استفاده کنید.
  • از پیتون استفاده کنید تا فقط از سه ساعت اوج فعال بودن و اوج غیرفعال بودن در روز، خروجی بگیرید.

 

 

ما را در شبکه‌های اجتماعی دنبال کنید.

دیدگاه خود را ارسال کنید...