این متن برای کسانی نوشته شده که با برنامهنویسی آشنا هستند و دوست دارن وب را آنطور که میخواهند ببینند.
شاید برای شما هم پیش اومده باشه که همیشه از یک سایت سرویس بگیرین یا خیلی بهش سر میزنین و دوست دارین امکانی که شما میخواین رو داشته باشه.
با یه مثال جلو برم: من از سایت mediafiredowns.com همیشه فیلمهای خوبی دانلود میکنم. ولی یه چیز توی این سایت من رو آزار میده و اون اینه که وقتی روی لینک دانلود کلیک میکنم، من رو میفرسته به یه قسمت که راهنمایی میکنه که چطور دانلود کنم و بعد من رو میفرسته به قسمت تبلیغات و بعد تازه میرسم به Media Fire و باید از اونجا دانلود کنم.
خیلی خوب میشد اگر این مراحل تکراری و خسته کننده کمتر بودن. از اونجا که به قول جادی من اولین نفری نیستم که به این مشکل بر خوردم، یه سرچ کوچیک من رو به یه اسکریپت خوب برای Grease Monkey رسوند که صفحهی تبلیغات رو بایپس میکرد. ولی خب من هنوز با اون صفحه راهنمای دانلود مشکل داشتم و توی یوزر اسکریپتهای Grease Monkey هم چیزی پیدا نکردم. این شد که خودم یکی نوشتم تا نفر بعدی که دنبال یه روش برای اصلاح این وضع میره، اولین نفر نباشه.
خب بد نیست روش کار رو توضیح بدم، شاید شما هم اسکریپتهایی نوشتین و در اختیار دیگران گذاشتین.
با این صفحه شروع میکنیم.
فیلم ۴ قسمت شده و بدیهیه که هر لینک باید آدرس مرحلهی بعد رو داشته باشه. آدرس قسمت ۱ اینطوره:
http://5ed2208c.linkbucks.com/url/http://mediafiredowns.info/download.php?link=aHR0cDovL3EuZ3Mvc1Ntag==
میبینیم که توی آدرس یه آدرس دیگه هست:
http://mediafiredowns.info/download.php?link=aHR0cDovL3EuZ3Mvc1Ntag==
ولی باز این همون آدرسی نیست که ما دنبالش هستیم و دقیقن آدرس همون صفحهی راهنمای دانلوده، ولی باید این آدرس یه طوری لینک نهایی یا یه روش برای رسیدن به اون رو توی خودش داشته باشه که به نظر میاد اون پارامتریه که ارسال میکنه:
aHR0cDovL3EuZ3Mvc1Ntag==
خب تجربه بهم میگه این روش کد گذاری رو میشناسم و اون دوتا مساوی انتها، نظر من رو که این یه کد Base64 هست رو پر رنگتر میکنه. پس یک بار امتحان میکنم. ترمینال لینوکس رو باز میکنم و مینویسم:
$ echo "aHR0cDovL3EuZ3Mvc1Ntag==" | base64 -d http://q.gs/sSmj
پس به نظر میاد حدس من درسته و این لینک صفحهی تبلیغاته که اون اسکریپت برای من بایپس میکرد.
پس روش کار معلوم شد. من باید برنامهای بنویسم که لینکهای صفحه رو بگرده و هرکدوم از این لینکها به این شکل بودن رو دیکد کنه و جایگزین لینک اصلی کنه. ولی خب من که صاحب Mediafiredowns نیستم! اینجاست که به سراغ Grease Monkey میرم و یه اسکریپت برای اون مینویسم.
گریسمانکی برای من اون اسکریپت رو روی آدرسهایی که من بهش میدم، اجرا میکنه پس چی از این بهتر.
تو Firefox از منوی Tools قسمت Greasemonkey گزینه New User Script رو انتخاب میکنم و نام و توضیح و چیزای دیگه رو هم پر میکنم.
تو قسمت include مینویسم:
http://*mediafiredowns.com/*
ویرایشگر متن باز میشه. اولین کار اینه که توضیحاتی رو بالای اون اضافه کنم.
// ==UserScript== // @name Mediafiredowns Links Changer // @namespace http://saarblog.wordpress.com // @description Change base64ed links in mediafiredowns.com to simple link. I recommend you to use iHatePaidLinks (greasemonkey user script #105301) beside this script. // @author Saar <saarblog [at] gmail [dot] com , identi.ca: @saar> // @version 0.1 // @license Gnu General Public License Version 3 // @run-at document-end // @include http://*mediafiredowns.com/* // ==/UserScript== /* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */
فک میکنم معلومه که این توضیحال چی هستن. این رو هم اضافه کنم که میشه چندین قسمت include داشت. و اون run-at مشخص میکنه که بعد از کامل شدن document (و نه load شدن!) این اسکریپت اجرا بشه.
قدم بعدی اینه که تمام لینکها رو پیدا کنیم:
var allLinks, thisLink; allLinks = document.getElementsByTagName('a');
و این که چک کنیم که آیا به همون سبکی که ما فکر میکردیم هست یا نه. چه چیز بهتر از عبارات با قاعده؟
var findLinkRegexp = /.*http:\/\/mediafiredowns\.[^\/]*\/download\.php\?link=(.*)/g; for (var i = 0; i < allLinks.length; i++) { if (allLinks[i].href && allLinks[i].href.match(findLinkRegexp)) thisLink = allLinks[i]; else continue; }
در نهایت باید قسمت کد شده رو پیدا کنیم و اون رو دیکد کنیم. خب از اونجا که من اولین نفری نیستم که به دیکد کردن base64 تو زبون جاوا اسکریپت نیاز دارم، پس گوگل میکنم و به این میرسم: http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html
از همین تابع استفاده میکنم:
var match = findLinkRegexp.exec(thisLink.href); if (match != null) { thisLink.href = decode64(match[1]); thisLink.style.color = "red"; }
برای این که متوجه بشم لینک اصلاح شده، رنگ اون رو هم قرمز کردم. کار تمومه و کد رو برای استفادهی دیگران منتشر میکنم. نسخهی نهایی هم به این شکله:
// ==UserScript== // @name Mediafiredowns Links Changer // @namespace http://saarblog.wordpress.com // @description Change base64ed links in mediafiredowns.com to simple link. I recommend you to use iHatePaidLinks (greasemonkey user script #105301) beside this script. // @author Saar // @version 0.1 // @license Gnu General Public License Version 3 // @run-at document-end // @include http://*mediafiredowns.com/* // ==/UserScript== /* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ //decode64 function from http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "wxyz0123456789+/" + "="; function decode64(input) { var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; // remove all characters that are not A-Z, a-z, 0-9, +, /, or = var base64test = /[^A-Za-z0-9\+\/\=]/g; if (base64test.exec(input)) { alert("There were invalid base64 characters in the input text.\n" + "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" + "Expect errors in decoding."); } input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); do { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 <> 4); chr2 = ((enc2 & 15) <> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = ""; } while (i < input.length); return unescape(output); } var allLinks, thisLink; allLinks = document.getElementsByTagName('a'); var findLinkRegexp = /.*http:\/\/mediafiredowns\.[^\/]*\/download\.php\?link=(.*)/g; for (var i = 0; i < allLinks.length; i++) { if (allLinks[i].href && allLinks[i].href.match(findLinkRegexp)) thisLink = allLinks[i]; else continue; var match = findLinkRegexp.exec(thisLink.href); if (match != null) { thisLink.href = decode64(match[1]); thisLink.style.color = "red"; } }
در انتها هم بگم که اگر متوجه نشدید که چطور قسمت کد شده از لینک رو بدست آوردم، این مطلب میتونه بهتون کمک کنه: Regex، ابزاری کاربردی در ویرایشگرهای متنی
