Dev Perfects
40 subscribers
9.23K photos
1.26K videos
468 files
13K links
بخوام خیلی خلاصه بگم
این کانال میاد مطالب کانالای خفن تو حوزه تکنولوژی و برنامه نویسی رو جمع میکنه

پست پین رو بخونید
https://t.iss.one/dev_perfects/455


ارتباط:
https://t.iss.one/HidenChat_Bot?start=936082426
Download Telegram
چطوری zig به maintain کردن پروژه ای C/cpp مون کمک میکنه.
این زبون نمیگه rewrite in zig (در حالی که توی rust میگن)
بلکه میگه کلی برنامه خفن با C/Cpp داریم، نمیشه همشون رو دور بریزیم.
به جایش بیایم کمک میکنیم از انی به بعد با zig توسعه پیدا کنن. مثلا در اولین قدم با toolchain مربوط به zig کامپایل بشن.
https://kristoff.it/blog/maintain-it-with-zig/
با وجود رشد هوش مصنوعی، هنوز هیچ پلتفرمی به‌اندازه‌ی وردپرس برای راه‌اندازی سریع وبلاگ بهینه، با سئوی عالی و ابزارهای قدرتمند وجود نداره. یک راهنمای کامل نوشتم که کمکتون می‌کنه در کمترین زمان ممکن یه وبلاگ وردپرسی بهینه (100% core web vital) بسازید:
https://wp-optimize.github.io/

@DevTwitter | <Masih Jahangirl/>
Forwarded from Go Casts 🚀
آخرین جلسه تیمسازی در سال ۱۴۰۳ به لطف خدا برگزار شد.
فقط روی پروژه تیمسازی ۳ در طول ۹ ماه گذشته ۹۸ تا Pull-Request مرج شد و بیش از ۴۰۰ کامیت توسط افراد مختلف زده شد.

در مورد دوره و تیمسازی GoCasts مثل همیشه هیچ ادعایی ندارم و میدونم پر از عیب و نقصه، اما فکر میکنم تیمسازی به این شیوه جز GoCasts در جای دیگه ای برگزار نشده که تقریبا بالای ۸۰ درصد هفته های سال جلسات لایو code-review و طراحی سیستم برگزار بشه و تلاش بشه مخاطب با چالش هایی شبیه چالش های پروژه های واقعی روبرو بشه و خودش کد بزنه و تمرین کنه که درک بهتر و تجربه مهم تری باشه براش.

ممنون از همه دوستانی که مثل همیشه در سال ۱۴۰۳ از GoCasts حمایت کردند، ان شاءالله سال جدید برای همه بهتر از قبل پیش بره.

دم همگی گرم
مخلصم ❤️


خرید تخفیف ویژه عید نوروز ۱۴۰۴
۵۰ درصد + ۱ میلیون تومان
NOWRUZ

خرید از سایت
https://gocasts.ir

توضیحات کامل
https://t.iss.one/gocasts/633

دوستانی که در خرید دوره تردید دارند میتونن برای مشاوره کوتاه تلفنی، فرم زیر رو پر کنند که باهاشون تماس بگیرم
https://survey.porsline.ir/s/ATeQL4b4


@gocasts
Forwarded from Go Casts 🚀
This media is not supported in your browser
VIEW IN TELEGRAM
در سیستم های RAG یا سوال-جواب chunking (تکه تکه کردن متن) یکی از حیاتی ترین مراحل هست. و نقش مهمی در دقت بازیابی اطلاعات داره. تعداد زیادی روش برای چانک کردن وجود داره و اینکه چه روشی را انتخاب کنیم سخته . یکی باز بهترین مقاله ها که روشهای مختلف chanking را مقایسه و ارزیابی کرده اینجا معرفی میکنم و کدش هم کامل گذاشتن.
Link: https://research.trychroma.com/evaluating-chunking
Github: https://github.com/brandonstarxel/chunking_evaluation

@DevTwitter | <Mehdi Allahyari/>
نکته های لینوکسی

اگر دنبال مانیتور کردن بخش ها مختلف لینوکس هستید این ابزار ها را روی سیستم داشته باشید

top: https://linux.die.net/man/1/top
s-tui: https://amanusk.github.io/s-tui/
htop: https://htop.dev
atop: https://linux.die.net/man/1/atop
iftop: https://linux.die.net/man/8/iftop
iotop: https://github.com/Tomas-M/iotop
nvtop: https://github.com/Syllo/nvtop
asitop: https://github.com/tlkh/asitop
btop: https://github.com/aristocratos/btop
perf: https://www.brendangregg.com/perf.html
wavemon: https://github.com/uoaerg/wavemon

آموزش تصویری انگلیسی در youtube
https://www.youtube.com/watch?v=4isEhE2rvmA
با تشکر از امیر عزیز
یه مدته دارم در مورد MCP و اینا می‌خونم... مخصوصا فلسفه‌ای که با خودش میاره.

این مقاله جالبی بود که با تاریخچه REST مقایسه کرده و دید جالبی داره.

https://twitchard.github.io/posts/2025-03-09-mcp-hypermedia-reborn.html

به نظرم برای کسایی که روی مدل‌های معماری AI دارن کار می‌کنن خوندن این مقاله ارزشش رو داره.

@DevTwitter | <Mehran/>
فرآیند بوت شدن سیستم های لینوکسی 🚀
خب توی این پست فرآیند بوت شدن سیستم هایی که از لینوکس استفاده میکنن رو بررسی میکنیم.

1️⃣ فاز اولیه: اجرا شدن فریمور (BIOS/UEFI)
وقتی دکمه‌ی پاور رو می‌زنی، اولین چیزی که اجرا می‌شه، BIOS (تو سیستم‌های قدیمی‌تر) یا UEFI (تو سیستم‌های جدید) هست. این قسمت سخت‌افزار رو بررسی می‌کنه و مطمئن می‌شه که قطعات اصلی (مثل رم، پردازنده و دیسک‌ها) درست کار می‌کنن.

تست اولیه: این مرحله به اسم POST (Power-On Self Test) شناخته می‌شه و اگه مشکلی باشه، مثلاً رم خراب باشه، معمولاً با یه سری بوق یا پیام خطا هشدار می‌ده.

پیدا کردن بوت لودر: بعد از تست سخت‌افزار، BIOS/UEFI دنبال دیسک قابل بوت می‌گرده (مثل SSD یا USB) و بوت‌لودر رو اجرا می‌کنه.

2️⃣ بوت‌لودر (GRUB یا systemd-boot)
بعد از اینکه دیسک بوت پیدا شد، بوت‌لودر (معمولاً GRUB) اجرا می‌شه. بوت‌لودر یه برنامه‌ی کوچیکه که وظیفه‌ی لود کردن کرنل لینوکس رو داره.

انتخاب سیستم‌عامل:
اگه چند تا سیستم‌عامل نصب کرده باشی (مثلاً لینوکس و ویندوز)، اینجا می‌تونی انتخاب کنی که کدوم یکی بوت بشه.

بارگذاری کرنل:
بعد از انتخاب سیستم‌عامل (یا بعد از چند ثانیه اگه گزینه‌ای انتخاب نشه)، بوت‌لودر کرنل لینوکس (فایل vmlinuz) رو بارگذاری می‌کنه.

3️⃣ بارگذاری کرنل و initramfs
اینجا کرنل لینوکس اجرا می‌شه و شروع به کنترل سخت‌افزار می‌کنه. اما چون هنوز فایل‌سیستم اصلی (Root) بارگذاری نشده، یه چیز به اسم initramfs وارد ماجرا می‌شه.

‏initramfs چیه؟
یه فایل موقتی که شامل درایورها و ابزارهای اولیه برای شناسایی و اتصال فایل‌سیستم اصلیه. به کرنل کمک می‌کنه که بتونه پارتیشن‌های دیسک رو بشناسه و مونت کنه.

4️⃣ مونت شدن روت و اجرای systemd
بعد از اینکه کرنل تونست به فایل‌سیستم اصلی دسترسی پیدا کنه، حالا سیستم آماده‌ی راه‌اندازی سرویس‌ها و بقیه‌ی چیزهاست.

ورود systemd:
تو اکثر توزیع‌های مدرن لینوکس، systemd اجرا می‌شه و وظیفه‌ی مدیریت سرویس‌ها و فرآیندهای سیستم رو به عهده داره.

راه‌اندازی سطح سیستم:
اینجا کلی سرویس اجرا می‌شن، مثل:
مدیریت شبکه (NetworkManager یا systemd-networkd)

مدیریت لاگ‌ها (journald)

راه‌اندازی محیط گرافیکی (GDM، SDDM یا LightDM)


5️⃣ نمایش صفحه‌ی لاگین
در نهایت، بعد از اینکه همه سرویس‌های لازم اجرا شدن، یه ترمینال لاگین (TTY) یا محیط گرافیکی دسکتاپ (مثل KDE Plasma یا GNOME) نمایش داده می‌شه و می‌تونی با یوزرنیم و پسورد وارد سیستم بشی.

جمع‌بندی:
1.‏ BIOS/UEFI اجرا می‌شه و سخت‌افزار رو بررسی می‌کنه.
2. بوت‌لودر (GRUB) کرنل لینوکس رو لود می‌کنه.
3. کرنل و initramfs فایل‌سیستم رو راه‌اندازی می‌کنن.
4.‏ systemd مدیریت سرویس‌ها رو انجام می‌ده.
5. صفحه‌ی لاگین نمایش داده می‌شه و سیستم آماده‌ی استفاده‌ست!

#️⃣ #linux #boot #kernel


🐧 CHANNEL | GROUP
Forwarded from Python Hints
آتیش شادی جشن ایرانی‌ها
شب گذشته خیلی‌ها رو سوزوند.

لذت می‌برم مردمم رو شاد می‌بینم ♥️
Forwarded from omid trade 360
به طور متوسط، یک مهندس سنیور نرم‌افزار ۳ تا ۵ برابر بیشتر از یک جونیور درآمد داره. این فقط به خاطر تجربه بیشتر نیست، بلکه به دلیل ارزش بیشتری هست که به شرکت میاره.

حالا فرض کنید دو مهندس تو یه شرکت کار می‌کنند:

مهندس A (سخت‌کوش)
-  روزی 10 ساعت کار میکنه، باگ‌هارو را درست می‌کنه و هزاران خط کد می‌نویسه.
- تمام وظایف محول شده رو بدون فکر کردن به تأثیرشون انجام می‌ده.
- و یه جورایی در چرخه‌ی "کار زیاد، پیشرفت کم" گیر کرده.

مهندس B (موثر)
- قبل از نوشتن حتی یک خط کد، وقت می‌گذاره تا مشکل اصلی رو بفهمه.
- می‌تونه یه مشکل بزرگ تو سیستم پیدا کنه و با یک اسکریپت 500 خطی، سالانه ۵۰ تا ۷۰ میلیون تو هزینه‌های شرکت صرفه‌جویی کنه.
- ورک‌فلو رو بهتر می‌کنه تا سیستم سریع‌تر، بهینه‌تر و مقیاس‌پذیر بشه.
حالا وقتی زمان ترفیع برسه به نظرت شرکت کدوم رو بیشتر میخواد؟

انصاف هست مهندس A که مشغول بوده صرفا و تسک‌هارو انجام میداده و ارزش و تاثیر کمتری تو شرکت میذاره بیشتر ترفیع بگیره؟ خوب نه (نه اینکه نگیره، اینه که بیشتر یا کمتر بگیره)

پس کار ما مساوی هست با تأثیری که می‌گذاریم

چند تا نکته در نهایت

- مشکلات را حل کن، نه اینکه فقط کارارو را انجام بده
- قبل از شروع کدنویسی، بپرس: این چرا مهمه؟
- روی مشکلات بزرگ، بهینه‌سازی و اتومیشن کار کن که ارزش واقعی می‌سازه.
-فراتر از کدنویسی فکر کن
- یک سنیور نصفش مشکل‌گشا و نصفش برنامه‌ریزه.

- یک سنیور سیستم‌ها را طراحی می‌کنه، پیچیدگی رو کم می‌کنه و تصمیم‌های بهتر می‌گیره، نه فقط کد بزنه.
- بفهم کارت چطور به شرکت کمک می‌کنه
- یادت باشه یک اسکریپت 200 خطی که پول صرفه‌جویی کنه، از یک ویژگی 10,000 خطی که کسی استفاده نکنه باارزش‌تره.

- بهترین مهندس‌ها فقط کد نمی‌نویسن، سیستم‌ها محصولات و کارایی رو بهتر می‌کنن.
- هدف این نیست که کد بیشتری بنویسی، هدف اینه که ارزش بیشتری بسازی.

پس (در یک شرکت یا تیم سالم) ارزش بیشتری بسازی، پاداش بیشتری می‌گیری.

<Saman/>

https://t.iss.one/addlist/KpzXaiSpKENkMGM0
Forwarded from FullstacksJS — Academy
ریویو پروژه NextJS
توی این جلسه یک پروژه تو این جلسه یک پروژه NextJS رو با هم ریویو می‌کنیم.

مشاهده ویدئو

درباره ماب ریویو:
ماب ریویو یه رویداد دوستانه و خودمونی برای انتقال تجربه دانشه.
توی این رویداد دور هم جمع می‌شیم تا یک سورس کد رو با هم ریویو کنیم و درباره پرکتیس‌های بهتر و دلایلش صحبت کنیم.

مباحث:
00:00 درباره ماب ریویو
01:30 خواهش دومم
02:40 درباره پروژه
03:37 وابستگی ها
05:33 مسئله Dead Code و Zombie Code ها
10:10 سلامتی وابستگی ها
11:46 کدهایی که مردن رو پاک کنید!
15:22 چطوری یک خط خالی توی کد روی استخدام شدن شما تاثیر می‌ذاره؟
31:30 اضافه کردن فرمتر و لینتر
33:03 از public چیزی ایمپورت نکنید
34:47 کی و چطوری باید کامپوننتمون رو بشکنیم؟
42:35 مسئله useless fragment
43:51 یکپارچگی پیاده سازی و اسم گذاری
45:15 مسئله layout
48:04 مسئله اسم گذاری
53:46 بررسی کامپوننت Banner
55:11 چرا نباید از z-index و overflow زیاد استفاده کنید
55:54 تعداد خط‌های کامپوننت Code Smell حساب می‌شه.
57:42 نحوده درست مدیریت z-index
59:51 اصل Single Responsibility تو فرانت اند
01:02:52 چه چیزهایی رو نباید توی کامپوننت برد؟
1:08:55 درک مسئله Spacing
1:11:07 پیاده سازی درست تم dark و light با taildinw
1:16:23 انکپسوله کردن مسئولیت های کامپوننت ها
1:20:07 کی از margin استفاده کنیم کی از padding
1:22:00 از grid و flex تو در تو استفاده نکنید.
1:27:34 به CSS فحش ندیم
1:28:32 فرق بین space و gap توی tailwind
1:30:25 جمع بندی

#fullstacksjs #mobreview #css #react #typescript #nextjs
کانال اطلاع‌رسانی توزیع پارچ
سال جدید، پارچ جدید! 🥤 کم‌کم به ۱۴۰۴ نزدیک می‌شیم و ما توی تیم پارچ لینوکس در حال کار روی یه تحول بزرگ هستیم. علاوه بر بهینه‌سازی‌های فنی، داریم روی هویت بصری جدید پارچ کار می‌کنیم تا ظاهر و تجربه‌ی کاربریش مدرن‌تر و حرفه‌ای‌تر بشه. این تغییرات از لوگو…
بالاخره هویت بصری رو استارت زدیم، چرا مهمه؟

خب این کتابچه هویت بصری تعیین می‌کنه که طرح‌هایی که برای پارچ ساخته میشن چه ساختاری رو داشته باشن، چه فونتی داخلشون باید استفاده بشه و همینطور اگر از لوگوی پارچ داخل طرحی بخواد استفاده بشه چه شرایطی داشته باشه که بهترین ظاهر رو به خودش بگیره.

از همه مهمتر اینکه خود برنامه‌هایی که برای پارچ نوشته میشن دستخوش تغییرات میشن، توی ۱۴۰۴ سعی داریم تا پارچ رو چشم‌نواز تر از همیشه بکنیم.


@SohrabContents
لینوکس Linux 6.15 از The Airoha NPU که یک A RISC-V Network Processor Unit پشتیبانی میکنه

💠واحد پردازش شبکه (NPU) شرکت Airoha، با نام Xessor، یک پردازنده ۸ هسته‌ای مبتنی بر معماری RISC-V است برای پردازش وظایف شبکه و تسریع Wi-Fi طراحی شده

🔥 این NPU به طور قابل توجهی بار کاری CPU را کاهش داده و مصرف انرژی سیستم را بهبود می‌بخشد. در نتیجه، مصرف انرژی کلی NPU هشت هسته‌ای کمتر از یک CPU تک هسته‌ای معمولی است

🔥 معماری Xessor به گونه‌ای طراحی شده که تقریباً تمام وظایف پردازش شبکه را مدیریت می‌کند، بنابراین منابع CPU برای اجرای خدمات و برنامه‌های ارزش افزوده ارائه‌دهندگان خدمات آزاد می‌ماند. همچنین، در صورت بارگذاری کامل CPU، NPU می‌تواند منابع جایگزین را برای حفظ سرعت و عملکرد روان سیستم فراهم کند

این معماری در سیستم روی تراشه (SoC) AN7581 شرکت Airoha به کار رفته است که از ترکیب CPU، NPU و یک شتاب‌دهنده بسته هوشمند (SPA) بهره می‌برد. این ترکیب، AN7581 را به اولین SoC در جهان تبدیل کرده که می‌تواند WAN، WLAN و LAN را با یک تراشه پشتیبانی کند و به سرعت‌های بالای Wi-Fi 7 دست یابد.

#hardware #linux
این دستگاه که می‌بینید اسمش DGX Spark هست؛ جواب شرکت Nvidia به Framework, Apple Studio پیش فروش شروع شده با قیمتی حدوداً 3500 یورو.

برای سال جدید، با شرکتی در ایران صحیت می‌کردیم روی یک سری کارهای هوش مصنوعی؛ که خب تصمیم گرفته بودند دوتا دستگاه با حداقل 96GB گرافیک تهیه کنند و نگرانی سرمایه گذاری و نشدن و ... داشتند.

یک همچین کانفیگی اگر بخواد بروز هم باشه برای هر سیستم حدوداً 8000$ درمیاد؛ که شخصاً با کمی جستجو پیشنهاد این دستگاه رو دادم.

تنها چیزی که کم داره البته فقط Memory Bandwith هست که ای کاش بالای 400GB بود ولی همین هم عالی هست (برای 90٪ البته فرقی هم نمی‌کنه)

با قیمت ۲تای این دستگاه؛ میشد یکی ازون سیستم‌ها تهیه کرد فقط.
کاملاً هم قابل حمل هست.

https://www.nvidia.com/en-us/products/workstations/dgx-spark/
Forwarded from Gopher Academy
🔵 عنوان مقاله
TypeScript's Compiler to Get 10x Faster, Thanks to Go

🟢 خلاصه مقاله:
در سال‌های اخیر، TypeScript با استفاده از تایپ قوی (نوع‌بندی قوی که به کمک آن نوع متغیرها قبل از اجرای کد مشخص می‌شود) و ساختار افزوده، اکوسیستم JavaScript را به شدت تکان داده است. هرچند که کامپایلر (برنامه‌ای که کد منبع را به کد ماشین تبدیل می‌کند) TypeScript به طور خاص سریع نیست، اما تیم TypeScript در مایکروسافت با انتقال آن به Go این مشکل را حل می‌کند!

🟣لینک مقاله:
https://golangweekly.com/link/166805/web


👑 @gopher_academy
Forwarded from Geek Alerts
فقط ۴ روز برای آپدیت فایرفاکس فرصت داری وگرنه همه‌چی خراب میشه! 🔴

اگه از فایرفاکس استفاده می‌کنی، بدو که فقط ۴ روز وقت داری آپدیتش کنی! یه گواهینامه ریشه (root certificate) مهم که برای تایید محتوا و افزونه‌ها استفاده می‌شده، تاریخ انقضاش تموم شده و اگه به نسخه ۱۲۸ یا بالاتر آپدیت نکنی، فاتحه همه چی خونده‌ست. فرقی هم نمی‌کنه لینوکس، مک، ویندوز، اندروید یا iOS باشی، همه‌تون باید آپدیت کنید!

اگه آپدیت نکنی، همه قابلیت‌هایی که به آپدیت از راه دور وابسته هستن از کار می‌افتن، افزونه‌هات غیرفعال می‌شن و محتوای DRM دار هم دیگه پخش نمی‌شه. حتی ممکنه سیستم‌هایی که به تایید محتوا نیاز دارن هم درست کار نکنن. پس دست بجنبون و برو توی تنظیمات فایرفاکس ببین چه نسخه‌ای داری و اگه پایین‌تر از ۱۲۸ بود، سریع آپدیتش کن که بعداً پشیمون نشی.

در تاریخ ۲۸ اسفند ۱۴۰۳ • ساعت ۱۹:۵۲ • ۱۸ مارس ۲۰۲۵
zdnet
@alertsai
This media is not supported in your browser
VIEW IN TELEGRAM
یک مدل جدید multimodal اومده به اسم SmolDocling که خیلی عالیه! خیلی کوچکه (ultra-compact vision-language model) و فقط با ۲۵۶ میلیون پارامتر دقتش در تبدیل داکیومنت به متن و استخراج اطلاعات واقعا بالاست. از OCR تا تشخیص کد و فرمولها و ... به کار میاد. راحت روی کامپیوتر نصب میشه و سرعتش هم خیلی بالاست. برای انواع کارها از جمله در workflow های agentic خیلی به درد میخوره.
HF: https://huggingface.co/ds4sd/SmolDocling-256M-preview
Paper: https://arxiv.org/pdf/2503.11576

@DevTwitter | <Mehdi Allahyari/>
Forwarded from Geek Alerts
اگه نسخه مرورگر فایرفاکس شما زیر ۱۲۹ باشه فقط ۴ روز زمان دارید تا آپدیتش کنید، تو نسخه‌های قدیمی یه گواهینامه‌ روت بوده برای تایید محتوا و افزونه‌ها که این تاریخ انقضاش تموم شده، فرقی نداره نسخه فایرفاکس شما چی باشه، زمانش که تموم بشه بخشی از اکستنشن‌ها یا سایت‌ها دیگه کار نمیکنن.

البته مرورگر یکی از برنامه‌هایی هست که همیشه باید اپدیت نگهش دارید چون مستقیم با امنیت دستگاهتون مرتبط هست.

🔗 zdnet
🤓 @geekalerts
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Md Daily (Mahan)
🎶 میخواستم برای فان و بدون استفاده از AI و یا راهنمایی های موجود یه کلاینت SoundCloud با 🚀 بنویسم. پس Burp Suite عزیز رو باز کردم و شروع کردم به دیدن رکوئست هایی که داره ارسال و دریافت میشه. خبر خوب این بود که همه چیز به صورت api کار میکرد و نیازی به استفاده از چیزی مثل selenium نبود ولی توی تمام درخواست هایی که نیاز به احراز هویت داشت یه چیزی مشترک بود و اون چیزی نبود جز client_id. ولی یه نکته ای وجود داشت. توی هیچ کدوم از درخواست هایی که دریافت میشد چیزی نبود که بره client_id رو بگیره، پس احتمال دادم که client_id توی یکی از فایل های ,js مخفی شده. شروع کردم به باز کردن تک تک لینک های .js ای که توی html لود شده ی صفحه ی soundcloud.com وجود داشتن و بوم :)

چیزی که ما میخواستیم تو یکی از فایل های .js به دو صورت زیر مخفی شده بود.

"client_id=f1TFyuaI8LX1Ybd1zvQRX8GpsNYcQ3Y5" 
client_id:"f1TFyuaI8LX1Ybd1zvQRX8GpsNYcQ3Y5"


حالا وقتش بود که این فرایند رو اتوماتیک کنم. عید وقت خوبیه که اگه هنوز regex بلد نیستید، یاد بگیرید (وبسایت https://regexlearn.com/ و ریپو ی https://github.com/ziishaned/learn-regex که ترجمه فارسی هم داره و در نهایت ویدیوی https://www.youtube.com/watch?v=sXQxhojSdZM منابع خوبی برای یادگیری هستن).

سناریو ساده بود یه کد go بنویسم که بره محتوای soundcloud.com رو بگیره لینک های .js رو ازش استخراج کرده و شروع کنه توی فایل های جاوا اسکریپت با regex دنبال پترن client_id بگرده. می تونید کد رو از اینجا ببینید:

https://gist.github.com/mdpe-ir/709c3ca362fa0c2a30fa71e46ddd1f96

ولی بریم برای توضیح بخش های مهمش:

✔️ تابع fetchHTML:

func fetchHTML(url string) (string, error) {
resp, err := http.Get(url)
if err != nil {
return "", fmt.Errorf("error fetching URL %s: %v", url, err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
return string(body), nil
}


این تابع یه درخواست HTTP GET به آدرس https://soundcloud.com/ می‌فرسته و کل محتوای HTML صفحه رو برمی‌گردونه.

نکته: اینجا defer resp.Body.Close() باعث می‌شه بعد از تموم شدن کار، اتصال بسته بشه تا منابع سیستم آزاد بشه.

✔️ استخراج لینک‌ها و کدهای جاوااسکریپت (extractJSSources)

این تابع HTML رو پارس می‌کنه و همه تگ‌های <script> رو پیدا می‌کنه. دو نوع جاوااسکریپت رو جدا می‌کنه: لینک‌های خارجی (با src) و کدهای داخلی (inline).
از پکیج golang.org/x/net/html برای پارس کردن HTML استفاده می‌کنه. لینک‌های نسبی رو با resolveURL به آدرس کامل تبدیل می‌کنه و فقط فایل‌هایی که به .js ختم می‌شن رو نگه می‌داره.

✔️ گرفتن محتوای فایل‌های جاوااسکریپت (fetchJSContent)

برای هر لینک .js که پیدا شده، یه درخواست HTTP می‌فرسته و محتوای فایل رو می‌گیره.

✔️ و در نهایت جستجوی client_id با Regex برای (findClientIDs)

پکیج regexp استفاده می‌کنه. دو الگو رو چک می‌کنه

برای فرمت پارامتری:
client_id=([A-Za-z0-9]{32})



برای فرمت object مانند:
client_id\s*:\s*["']([A-Za-z0-9]{32})["']


نکته: [A-Za-z0-9]{32} یعنی دنبال یه رشته ۳۲ کاراکتری از حروف و اعداد می‌گرده.

جمع‌بندی و نمایش نتیجه (main)

همه مراحل رو اجرا می‌کنه، client_idها رو جمع می‌کنه، تکراری‌ها رو حذف می‌کنه و چاپ می‌کنه.

توی تست هام متوجه شدم که هر client id حدودا ۷ روز معتبره. میشه یه cron job نوشت که طی یه مدت مشخص اجرا بشه و client id رو اپدیت کنه.

بعد از اینکه client_id رو پیدا کردیم، حالا می‌تونیم با استفاده ازش به APIهای SoundCloud درخواست بزنیم. برای این کار، من تصمیم گرفتم یه درخواست به endpoint سرچ بزنم تا یه خواننده پیدا کنم و بعد برم لیست موزیک‌هاش رو بگیرم. بیایم اینو قدم به قدم پیاده کنیم.

یه API داره که می‌تونیم با استفاده ازش یه خواننده رو جستجو کنیم. طبق درخواست‌ها تو Burp Suite یه endpoint سرچ چیزی شبیه اینه:

برای جستو در کاربران:
GET https://api-v2.soundcloud.com/search/users?q={query}&client_id={client_id}


برای جستجوی کلی :
GET https://api-v2.soundcloud.com/search?q={query}&client_id={client_id}


حالا فقط کافی بود برای گرفتن لیست موزیک های خواننده :
GET https://api-v2.soundcloud.com/users/{user_id}/tracks?client_id={client_id}


به عنوان مثال این اندپوینت لیست موزیک های Safir رو بر میگردونه:
https://api-v2.soundcloud.com/users/1016216608/tracks?client_id=f1TFyuaI8LX1Ybd1zvQRX8GpsNYcQ3Y5


حالا که این کار رو کردیم، می‌تونیم کلاینت رو گسترش بدیم، مثلاً یه رابط کاربری ساده باهاش بسازیم یا قابلیت دانلود ترک‌ها رو اضافه کنیم:)
---

مثل همیشه کنجکاو بمونید :)

🆔 @MdDaily
Please open Telegram to view this post
VIEW IN TELEGRAM