توییتر پلاتفرم رایگانی را برای همه جهت پست هر چیزی در سایتشان فراهم آورده است. این امر می تواند از منظر مالی برای هر فرد مشهوری ارزشمند یا بی ارزش باشد تا افکارش را شرح دهد. از آنجایی که این مقاله اساسا بر روی خود رسانه، به جای محتویاتش، تمرکز دارد شروع به بحث می نماییم. لطفا در توییتر ثبت نام نمایید تا خود را در معرض دسته ای از رمزهای خصوصی لازم جهت دسترسی به رابط کاربری توییتر قرار دهید.
این رمزها می تواند در ابتدا کاملا گیج کننده باشد زیرا بسیاری از آنها با اسامی مشابه وجود دارند. در ابتدا شما به رمزهای زیر برای امکان استفاده از رابط کاربری توییتر دارید:
- رمز مشتری
- رمز مخفی مشتری
- رمز دسترسی
- رمز مخفی دسترسی
مهم ترین نکته درباره استفاده از رابط کاربری توییتر :
اگر شما با کلید های عمومی و خصوصی مورد استفاده در ثبت دیجیتال آشنا می باشید پس کار راحتی پیش رو دارید. رمز مشتری و رمز مشتری مخفی کلید های عمومی و خصوصی جهت شناسایی رابط کاربری توییتر شما می باشند. اپلیکیشن توییتر، به زبان ساده تعریفی از خدمت و یا دستیابی شما به رابط کاربری توییتر است.
رمز دسترسی و رمز مخفی دسترسی کلیدهای عمومی و خصوصی جهت شناسایی شما به عنوان “کاربر توییتر” هستند که به اصطلاح توییتر “user auth” یا “user context” نامیده می شوند. بر اساس این رمز دسترسی، رابط کاربری توییتر می تواند تشخیص دهد که چه کسی به آن دسترسی پیدا کرده است.
رمز دیگری به نام رمز حامل وجود دارد که اجازه دسترسی “بی نام” جهت استفاده از رابط کاربری توییتر می دهد. این روش به نام “app auth” یا “app context” می باشد. بدون “user context” بعضی از رابط های کاربری توییتر قابل دسترسی نمی باشند که به وضوح در مرجع رابط کاربری توییتر درج شده است.
برای کسانی که می توانند با زبان های برنامه نویسی دیگری کدنویسی نمایند، احتمال دارد که کتابخانه توییتر به عنوان مرجع مفید باشد. منابع زیادی در آن وجود دارد تا دید وسیعی در اجرای جزئیاتی که گاهی اوقات از خوانش مطالب مربوط به رابط کاربری به راحتی مشخص نیست را فراهم کند.
بیشتر بخوانید : 3 ویژگی منحصر به فرد MQL5 | آشنایی بیشتر با ویژگی های زبان MQL5
رابط کاربری توییتر و اجازه دسترسی
ما به استفاده از رمزهای فوق الذکر تمرکز می کنیم:
- رمز مشتری
- رمز مخفی مشتری
- رمز دسترسی
- رمز مخفی دسترسی
بسیاری از راهنمایی ها و یا آموزش ها در سایت you tube جهت دسترسی به این رمزها وجود دارد.
کد OAuth استاندارد مقبول و پر کاربردی برای اعتبار بخشی و اجازه دسترسی رابط کاربری مبتنی بر وب می باشد که در رابط کاربری توییتر نیز استفاده می شود. به زبان ساده، OAuth یک امضای دیجیتال است یعنی روشی برای ثبت محتوای دیجیتال می باشد به گونه ای که هرگونه تلاش در جهت دستکاری محتوای آن را نامعتبر می سازد.
برای تایید محتوا و امضا صحیح آن، روش ها و پروسه های مخصوص آن باید به دقت دنبال شود. مجددا، مرجع رابط کاربری توییتر کار بزرگی در ارائه کل این پروسه نموده است.
- ایجاد امضا
- تایید یک درخواست
به منظور ساده سازی این پروسه، رابط کاربری توییتر نیاز به یک روش درخواست کد گذاری ویژه تحت HTTP دارد. این روش در فصل بعد توضیح داده خواهد شد.
کدگذاری URL و مرتب سازی پارامتر
به منظور اطمینان از صحت کامل محتوای ثبت شده دیجیتالی، خود محتوا باید به خوبی تعریف شود. به همین خاطر، رابط کاربری توییتر (باید دقیق باشد، روش OAuth) نیازمند پارامترها HTTP POST و یا HTTP GET می باشد تا مراحل کار قبل از ثبت دیجیتال به خوبی تعریف شوند.
- کد گذاری URL
- پارامترهای مرتب شده بر اساس حروف الفبا
می بایست پارامترهای HTTP POST/HTTP GET به شرح زیر کد گذاری شوند:
- تمامی کاراکترها به غیر از حروف الفبا و عدد (0-9، A-Z، a-z) و کاراکترهای ویژه (-، _،~) باید “کد گذاری درصدی (%XX)” شوند.
- مقدار HEX “کد گذاری درصدی” باید از حروف بزرگ (A B C D E F، 0-9) استفاده کند.
لطفا مرجع و مستندات راجع به کاراکترهای “%” و “+” را ملاحظه فرمایی که باید آنها نیز به درستی کد گذاری شوند.
همچنین توجه داشته باشید که درباره مرتب سازی پارامترهای مندرج در اینجا با توجه به مستندات مرجع به شرح زیر است:
- خصوصیت OAuth spec بیان می دارد که باید به صورت واژه ای مرتب سازی شود که در اکثر کتابخانه ها به صورت پیش فرض الفبایی مرتب می شود.
- در رابطه با دو پارامتر با کلیدهای کد گذاری شده مشابه، OAuth spec می گوید که مرتب سازی را بر اساس مقدار ادامه دهید. با این وجود، توییتر کلیدهای تکراری در درخواست های رابط کاربری را نمی پذیرد.
یک اجرا از این درخواست به شرح زیر است:
string hex(int i) { static string h="0123456789ABCDEF"; string ret=""; int a = i % 16; int b = (i-a)/16; if(b>15) StringConcatenate(ret,ret,hex(b),StringSubstr(h,a,1)); else StringConcatenate(ret,ret,StringSubstr(h,b,1),StringSubstr(h,a,1)); return (ret); } string URLEncode(string toCode) { int max=StringLen(toCode); string RetStr=""; for(int i=0; i<max; i++) { string c = StringSubstr(toCode,i,1); ushort asc = StringGetCharacter(c, 0); if((asc >= '0' && asc <= '9') || (asc >= 'a' && asc <= 'z') || (asc >= 'A' && asc <= 'Z') || (asc == '-') || (asc == '.') || (asc == '_') || (asc == '~')) StringAdd(RetStr,c); else { StringConcatenate(RetStr,RetStr,"%",hex(asc)); } } return (RetStr); } string arrayEncode(string &array[][2]) { string ret=""; string key,val; int l=ArrayRange(array,0); for(int i=0; i<l; i++) { key = URLEncode(array[i,0]); val = URLEncode(array[i,1]); StringConcatenate(ret,ret,key,"=",val); if(i+1<l) StringConcatenate(ret,ret,"&"); } return (ret); } void sortParam(string&arr[][2]) { string k1, k2; string v1, v2; int n = ArrayRange(arr,0); // bubble sort int i, j; for(i = 0; i < n-1; i++) { // Last i elements are already in place for(j = 0; j < n-i-1; j++) { int x = j+1; k1 = arr[j][0]; k2 = arr[x][0]; if(k1 > k2) { // swap values v1 = arr[j][1]; v2 = arr[x][1]; arr[j][1] = v2; arr[x][1] = v1; // swap keys arr[j][0] = k2; arr[x][0] = k1; } } } } void addParam(string key,string val,string&array[][2]) { int x=ArrayRange(array,0); if(ArrayResize(array,x+1)>-1) { array[x][0]=key; array[x][1]=val; } }
یک مثال از استفاده توابع بالا به شرح زیر است:
string params[][2]; addParam("oauth_callback", "oob", params); addParam("oauth_consumer_key", consumer_key, params); sortParam(params);
نکته:
به منظور ساده سازی، مرتب سازی پارامترها ناقص می باشد یعنی اینکه پارامترهای با کلید مشابه چندگانه را در نظر نمی گیرد. ممکن است شما بخواهید در هنگام استفاده از پارامترهایی با کلید مشابه، مانند دکمه های را دید یا دکمه های تاییدی بر روی برگه html خود، این مسئله را بهبود ببخشید.
HMAC-SHA1 به راحتی هر چه تمام تر
مانع دیگر قبل از اینکه بتوانیم یک امضا OAuth بسازیم، نقص HMAC-SHA1 اصلی در پشتیبانی MQL می باشد. این امر مشخص می کند که MQL Crypt Encode() از موارد کم کاربرد است چرا که فقط از ساختن SHA1-HASH پشتیبانی می کند. در نتیجه پرچم آن CRYPT_HASH_SHA1 می باشد.
پس بیایید تا HMAC-SHA1 خود را به کمک دستور crypt encode() کدگذاری می کنیم:
string hmac_sha1(string smsg, string skey, uchar &dstbuf[]) { // HMAC as described on: // https://en.wikipedia.org/wiki/HMAC // uint n; uint BLOCKSIZE=64; uchar key[]; uchar msg[]; uchar i_s[]; uchar o_s[]; uchar i_sha1[]; uchar keybuf[]; uchar i_key_pad[]; uchar o_key_pad[]; string s = ""; if((uint)StringLen(skey)>BLOCKSIZE) { uchar tmpkey[]; StringToCharArray(skey,tmpkey,0,StringLen(skey)); CryptEncode(CRYPT_HASH_SHA1, tmpkey, keybuf, key); n=(uint)ArraySize(key); } else n=(uint)StringToCharArray(skey,key,0,StringLen(skey)); if(n<BLOCKSIZE) { ArrayResize(key,BLOCKSIZE); ArrayFill(key,n,BLOCKSIZE-n,0); } ArrayCopy(i_key_pad,key); for(uint i=0; i<BLOCKSIZE; i++) i_key_pad[i]=key[i]^(uchar)0x36; ArrayCopy(o_key_pad,key); for(uint i=0; i<BLOCKSIZE; i++) o_key_pad[i]=key[i]^(uchar)0x5c; n=(uint)StringToCharArray(smsg,msg,0,StringLen(smsg)); ArrayResize(i_s,BLOCKSIZE+n); ArrayCopy(i_s,i_key_pad); ArrayCopy(i_s,msg,BLOCKSIZE); CryptEncode(CRYPT_HASH_SHA1, i_s, keybuf, i_sha1); ArrayResize(o_s,BLOCKSIZE+ArraySize(i_sha1)); ArrayCopy(o_s,o_key_pad); ArrayCopy(o_s,i_sha1,BLOCKSIZE); CryptEncode(CRYPT_HASH_SHA1, o_s, keybuf, dstbuf); for(int i=0; i < ArraySize(dstbuf); i++) StringConcatenate(s, s, StringFormat("%02x",(dstbuf[i]))); return s; }
برای تایید صحت آن می توانیم با کد ساخته شده در مرجع رابط کاربری توییتر مقایسه کنیم:
uchar hashbuf[]; string base_string = "POST&https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521"; string signing_key = "kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE"; string hash = hmac_sha1(base_string, signing_key, hashbuf); Print(hash); // 842b5299887e88760212a056ac4ec2ee1626b549 uchar not_use[]; uchar base64buf[]; CryptEncode(CRYPT_BASE64, hashbuf, not_use, base64buf); string base64 = CharArrayToString(base64buf); Print(base64); // hCtSmYh+iHYCEqBWrE7C7hYmtUk=
کد Web Request برای رهایی
باید از Web Request() تشکر کرد. با این کد دیگر به راحتی می توان به هر رابط کاربری REST از طریق وب و بدون استفاده از DLL خارجی دسترسی داشت.
کد زیر دسترسی به رابط کاربری توییتر با استفاده از Web Request() را ساده می کند.
#define WEBREQUEST_TIMEOUT 5000 //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ string SendRequest(string method, string url, string headers="", string params="", int timeout=WEBREQUEST_TIMEOUT) { char data[]; char result[]; string resp_headers; ResetLastError(); StringToCharArray(params, data); ArrayResize(data, ArraySize(data)-1); int res = WebRequest(method, url, headers, timeout, data, result, resp_headers); if(res != -1) { string resp = CharArrayToString(result); if(verbose) { Print("***"); Print("Data:"); Print(CharArrayToString(data)); Print("Resp Headers:"); Print(resp_headers); Print("Resp:"); Print("***"); Print(resp); } return resp; } else { int err = GetLastError(); PrintFormat("* WebRequest error: %d (%d)", res, err); if(verbose) { Print("***"); Print("Data:"); Print(CharArrayToString(data)); } if (err == 4014) { string msg = "* PLEASE allow https://api.tweeter.com in WebRequest listed URL"; Print(msg); } } return ""; }
لطفا مستندات Web Request() را بخوانید.
نکته:
برای استفاده از تابع Web Requeat()، آدرس سرورهای لازم را درون فهرست های URLهای مجاز در نمایه “پیشنهاد حرفه ای” (Expert Advisor) درون بخش “گزینه ها” (Options) ویندوز اضافه کنید. ورودی سرور به صورت خودکار بر اساس پروتکل مشخص شده، 80 برای ” http:// ” و 443 “https://” انتخاب می شوند.
توابع کمک کننده برای ساختن رابط کاربری REST توییتر
در زیر تعدادی از توابع کمک کننده مفید در ساختن امضا رابط کاربری توییتر آمده است.
string getNonce() { const string alnum = "abcdef0123456789"; char base[]; StringToCharArray(alnum, base); int x, len = StringLen(alnum); char res[32]; for(int i=0; i<32; i++) { x = MathRand() % len; res[i] = base[x]; } return CharArrayToString(res); } string getBase(string¶ms[][2], string url, string method="POST") { string s = method; StringAdd(s, "&"); StringAdd(s, URLEncode(url)); StringAdd(s, "&"); bool first = true; int x=ArrayRange(params,0); for(int i=0; i<x; i++) { if(first) first = false; else StringAdd(s, "%26"); // URLEncode("&") StringAdd(s, URLEncode(params[i][0])); StringAdd(s, "%3D"); // URLEncode("=") StringAdd(s, URLEncode(params[i][1])); } return s; } string getQuery(string¶ms[][2], string url = "") { string key; string s = url; string sep = ""; if(StringLen(s) > 0) { if(StringFind(s, "?") < 0) { sep = "?"; } } bool first = true; int x=ArrayRange(params,0); for(int i=0; i<x; i++) { key = params[i][0]; if(StringFind(key, "oauth_")==0) continue; if(first) { first = false; StringAdd(s, sep); } else StringAdd(s, "&"); StringAdd(s, params[i][0]); StringAdd(s, "="); StringAdd(s, params[i][1]); } return s; } string getOauth(string¶ms[][2]) { string key; string s = "OAuth "; bool first = true; int x=ArrayRange(params,0); for(int i=0; i<x; i++) { key = params[i][0]; if(StringFind(key, "oauth_")!=0) continue; if(first) first = false; else StringAdd(s, ", "); StringAdd(s, URLEncode(key)); StringAdd(s, "=""); StringAdd(s, URLEncode(params[i][1])); StringAdd(s, """); } return s; }
اسکریپت نمونه
اکنون برای ارسال اولین درخواست رابط کاربری توییتر خود آماده هستیم.
void verifyCredentials() { string _api_key = consumer_key; string _api_secret = consumer_secret; string _token = access_token; string _secret = access_secret; string url = "https://api.twitter.com/1.1/account/verify_credentials.json"; string params[][2]; addParam("oauth_consumer_key", _api_key, params); string oauth_nonce = getNonce(); addParam("oauth_nonce", oauth_nonce, params); addParam("oauth_signature_method", "HMAC-SHA1", params); string oauth_timestamp = IntegerToString(TimeGMT()); addParam("oauth_timestamp", oauth_timestamp, params); addParam("oauth_token", _token, params); addParam("oauth_version", "1.0", params); sortParam(params); string query = getQuery(params, url); string base = getBase(params, url, "GET"); uchar buf[]; string key = URLEncode(_api_secret); StringAdd(key, "&"); StringAdd(key, URLEncode(_secret)); uchar hashbuf[], base64buf[], nokey[]; string hash = hmac_sha1(base, key, hashbuf); CryptEncode(CRYPT_BASE64, hashbuf, nokey, base64buf); string base64 = CharArrayToString(base64buf); addParam("oauth_signature", base64, params); sortParam(params); string o = getOauth(params); string headers = "Host:api.twitter.comrnContent-Encoding: identityrnConnection: closern"; StringAdd(headers, "Authorization: "); StringAdd(headers, o); StringAdd(headers, "rnrn"); string resp = SendRequest("GET", query, headers); Print(resp); // if everything works well, we shall receive JSON-response similar to the following // NOTE: Identity has been altered to protect the innocent. // {"id":122,"id_str":"122","name":"xxx","screen_name":"xxx123","location":"","description":"", ... }
یک نمونه متقاضی توییتر بر روی جدول MT5
تصویر زیر متقاضی توییتری را نشان می دهد که توییت های یک کانال خبری کشور اندونزی را نمایش می دهد. اینجانب در حال تهیه مقالات بعدی بیشت درباره اجرای رابط کاربری توییتر هستم که امیدوارم در اسرع وقت آنها را منتشر نمایم.
تصویر صفحه نمایش دیگری در زیر آمده است که از ترمینال MT5 می باشد:
توسعه در آینده
روش فوق الذکر به اندازه خودش خوب است، اگر چه با پوشش تمامی رابط های کاربری کاملا فاصله دارد. این روش به عنوان تمرین خوبی برای افرادی که می خواهند بیشتر در مورد رابط کاربری توییتر بدانند، می باشد. تعداد بیشتری از جزئیات در مورد پست رسانه شامل جداول تصویر صفحه نمایش در مقاله بعدی توضیح داده خواهد شد.
ممکن است شما برای ساختن یک کلاس رابط کاربری توییتر و یا حتی یک کلاس متقاضی OAuth عمومی تمایل داشته باشید.
نکته ای برای تایید 3-legged و مبتنی بر PIN
شاید بخواهید درباره تاییدیه 3-legged و همچنین تاییدیه مبتنی بر PIN بیشتر بدانید. این موارد خارج از بحث های این مقاله است، لطفا در صورت نیاز به راهنمایی بیشتر با بنده تماس بگیرید.
نتیجه گیری
توییتر یک پلاتفرم مقبول است تا هرکسی هرچیزی که بخواهد در آن منتشر کند.
با این مقاله و کدهای ذکر شده، امیدوارم با انجمن MQL همکاری داشته باشم تا در نتیجه درباره OAuth در دسترسی به رابط کاربری توییتر مطالب بیشتری دریابم.
منتظر پیشنهادات و انتقادات سازنده شما هستم. آزادانه می توانید از تمام کدهای تهیه شده در پروژه های رایگان و تجاری خود استفاده نمایید.
در اینجا جا دارد از Grzegorz Korydei به خاطر تهیه کدهای کتابخانه که الهام بخش من در ساختن تابع HMAC-SHA1 بوده اند، تشکر نمایم.
بیایید تا برای سرگرمی و سود بهتر توییت نماییم.
لذت ببرید.
این مقاله ترجمه شده توسط تیم آکادمی ایران ام کیو ال می باشد.
پاسخها