
قسمت دوم این مجموعه مربوط به برنامه نویسی خدمات خود Proxy Amazon است. به نظر می رسد بلندتر از آن است که واقعاً باشد زیرا پروکسی صرفاً یک اسکریپت PHP است . من می خواهم به مقاله قبلی برگردم ، که توضیح می دهد که پروکسی آمازون در واقع برای چه مواردی استفاده می شود ، چگونه کار می کند و چگونه می توانیم API Advertising Product Amazon را حل کنیم. بخش سوم این سریال درمورد سایت مشتری و اینکه چگونه می توانیم پروکسی آمازون را از طریق وب سایت یا مقاله ای از وردپرس خطاب کنیم.
اکنون من یک وبلاگ نگار هستم ، و نه یک برنامه نویس برای افزونه های وردپرس ، بنابراین اینجا را جستجو نکنید هیچ افزونه وردپرس آماده که فقط لازم است نصب کنید. اگرچه این برنامه کاربردی خواهد بود ، اما به هیچ وجه کامل نخواهد بود و باید به عنوان بستر اجرای پروکسی مطابق عقاید خودتان خدمت کنید.
آنچه لازم است؟
- دانش قبلی درباره قسمت 1
- دانش بنیادی در مورد HTML ، JavaScript ، Ajax و PHP
- البته ، وبلاگ وردپرس خود یا وب سایت دیگری [19659008] مؤلفه مشتری برای پروکسی آمازون – قسمت 3 [شناسهشریکآمازونوکلیددستیابیبهمحصولAPIآمازونکلیددسترسی
PHP AmaProx
برنامه نویسی شی گرا را دوست دارم – جایی که معقول است. اما این کار به قدری "ساده" است که من به تدریج آن را برنامه ریزی می کنم ، مهمانی. با این حال ، برای شفاف سازی ، برنامه را به 9 مرحله بعدی تقسیم می کنم ، که اکنون به صورت جداگانه در مورد آنها بحث می کنم. در پایان مقاله ، کل برنامه کپی کردن در یک قطعه شروع می شود. در زیر فرض بر این است که برنامه پروکسی آمازون amaprox.php نامیده می شود و در فهرست amaprox در زیر فهرست خانه اصلی قرار دارد. این همچنین می تواند با استفاده از WordPress یا دایرکتوری در پوشه موضوعی خود یا در پوشه wp-content انجام شود.
I. تعاریف
<؟ پی اچ پی $ access_key_id = "ABCDEFGHIJKLMNO"؛ $ secret_key = "AbCdEfGhIjKlMnOpQrStUvWxYz"؛ $ Associate_tag = "wwwmeasite-21"؛ $ endpoint = "webservice.amazon.de"؛ $ uri = "/ آنکا / xml"؛ $ bers_group = "بزرگ"؛ $ cachefolder = "حافظه نهان"؛ $ amaprox_homeURL = "https://www.my-site.com/amaprox"؛ موفق19659016] در اینجا متغیرهای متغیر متن را تعریف می کنیم. در ابتدا دو کلید به API تبلیغات محصول آمازون وجود دارد ، و
$ Associate_tag
چیزی بیشتر از شناسه شریک آمازون نیست. البته ، شما باید کلیدهای خود را به جای متغیرهایی در من وارد کنید.نقطه پایان $
و$ uri
ممکن است برای آمازون آلمان بماند ، و$ result_group
برای یک بار از بزرگ به خوبی ثبت شده است.$ cachefolder
دایرکتوری زیر فهرست برنامه AmaProx است که تصاویر محصول به طور موقت ریخته می شود. $ Amaprox_homeURL URL دایرکتوری برنامه AmaProx است. البته این نیز باید متناسب با شرایط شخصی شما باشد.دوم. پارامترها را
بگیرید اگر (صادر ($ _ دریافت ["template"]) و&! خالی ($ _ دریافت ["template"])) { $ قالب = $ _GET ["template"]؛ } دیگه $ قالب = "واید"؛ } if (صادر ($ _ دریافت ["asin"]) و& خالی ($ _ دریافت ["asin"])) { $ asin = $ _GET ["asin"]؛ } دیگه بازگشت؛ }
در این مرحله پارامترها ارزیابی می شوند. تصور کنید که فراخوانی سرورهای پروکسی از طریق HTTP (S) -GET به این شکل به نظر می رسد:
https://www.my-site.de/amaprox/amaprox.php؟asin=B00XLVXILI&template=widebox
بنابراین
] از دو پارامتر
به عنوان
والگو
عبور می کند. مورد دوم اختیاری است و اگر نشانه ای از دست نرود ، "Broadbox" است. از طرف دیگرasin
واجب است ، اگر در صورت عدم وجودasin
، فیلم نامه با بازگشت ساکت به پایان می رسد.
در اینجا می توانید پتانسیل بهبود در فیلمنامه را مشاهده کنید. مشکلی در استفاده از خطا وجود ندارد ، در صورت بروز خطا ، این برنامه به سادگی بسته می شود. به عنوان مثال ، ورودی های پرونده log نیز می توانند در اینجا ذخیره شوند یا یک پیام خطا بازگردانده شود.
سوم. پوشه حافظه پنهان
$ پرونده = glob ($ cachefolder. & # 39؛ / * & # 39؛) پاک کنید. foreach ($ پرونده به عنوان $ پرونده) { if (is_file (پرونده $) و& (زمان () - زمان فیلمبرداری (پرونده $)> 10)) { جدا کردن (پرونده $)؛ } }
سپس پوشه کش حذف شده است. برای این کار ،
glob
لیستی از پرونده های مشابهdir
یاls
را در لینوکس دریافت می کند. سپس این لیست حذف می شود و هر پرونده قدیمی تر از 10 ثانیه باحذف خواهد شد
حذف می شود. بنابراین فهرست کش همیشه پاک (خوب) است.IV. ایجاد پرس و جو
$ params = array () "خدمات" => "AWSECommerceService" ، "Operation" => "ArticleLookup" ، "AWSAccessKeyId" => $ access_key_id ، "AssociateTag" => $ Associate_tag ، "ArticleId" => $ asin ، "IdType" => "ASIN" ، "ResponseGroup" => $ bers_group )؛ if (! صادر ($ params ["Timestamp"]))) { $ params ["Timestamp"] = gmdate (& # 39؛ Y-m-d TH: i: s Z & # 39؛)؛ } ksort ($ Params)؛ جفت $ = آرایه ()؛ foreach ($ params به عنوان کلید $ => مقدار) { array_push (جفت $ ، rawurlencode (کلید $). "=". rawurlencode (مقدار $))؛ } $ canonical_query_string = بپیوندید ("&" ، $ جفت)؛ $ string_to_sign = "دریافت n". $ نقطه پایان " n" $ uri " n" $ canonical_query_string؛ $ Signature = base64_encode (hash_hmac ("sha256" ، $ string_to_sign ، $ secret_key ، true))؛ $ request_url = & # 39؛ https: //' ؛.$endpoint.$uri.'؛؟ & # 39؛ $ canonical_query_string. & # 39؛ & امضا = & # 39؛. Rawurlencode (امضای $)؛
اکنون یک درخواست برای API تبلیغات محصول آمازون است. متن این درخواست بی اهمیت نیست زیرا پارامترها جمع می شوند ، مهر می شوند ، مرتب سازی می شوند ، کدگذاری و امضا می شوند. خوشبختانه ، آمازون در حال حاضر این بخش از برنامه را در Scratchpad زیر در بخش هایی از کد به اشتراک می گذارد – من (تقریبا) 1: 1. را به دست گرفتم.
V پرس و جو از آمازون و دریافت پاسخ
$ پاسخ =file_get_contents ($ درخواست_url)؛
فرمول سوال آمازون خیلی زحمت کش بود ، پرس و جو از API خود بسیار ساده است. این مطابق با خط برنامه از
file_get_contents
است.VI. تجزیه و تحلیل پاسخ
اگر (پاسخ $ === FALSE) { بازگشت؛ } $ amaxml = Simplexml_load_string (پاسخ $)؛ if ($ amaxml === FALSE) بازگشت؛ } if ($ amaxml-> موارد-> درخواست-> IsValid! = "درست") { بازگشت؛ } if (! خالی ($ amaxml-> موارد-> درخواست-> خطا)) { بازگشت؛ } $ ama_id = $ amaxml-> OperationRequest-> RequestId؛ $ ama_titel = $ amaxml-> اشیاء-> موضوع-> موضوع متن -> عنوان؛ $ ama_medium = $ amaxml-> موارد-> مورد-> MediumImage؛ اگر (خالی ($ ama_medium)) { $ ama_medium = $ amaxml-> آیتم ها -> مورد -> ImageSets-> ImageSet-> MediumImage؛ } $ ama_page_url = $ amaxml -> موارد-> مورد-> جزئیاتPageURL؛ $ ama_price = $ amaxml-> موارد-> مورد-> پیشنهادات خلاصه-> کمترینNewPrice-> قالب بندی شده قیمت؛ اگر (خالی ($ ama_price)) { $ ama_price = $ amaxml-> موارد-> مورد-> پیشنهادات خلاصه-> کمترین قیمت استفاده شده - قیمت-> قالب بندی شده قیمت؛ } $ ama_description = $ amaxml-> موارد-> مورد-> تحریریه مرور-> سرمقاله بررسی-> محتوا؛ $ ama_feature = & # 39؛
& # 39 ؛؛ foreach ($ amaxml -> موارد-> مورد-> مورد- ویژگی ها -> ویژگی به عنوان $ ویژگی) { $ ama_feature. = & # 39؛
& # 39 ؛؛ اگر (خالی ($ ama_description)) { $ ama_description = $ ama_feature؛ } otherif (strlen ($ ama_description) <100) $ ama_description = & # 39؛- & # 39؛. ویژگی $ & # 39؛
& # 39 ؛؛ }؛ $ ama_feature. = & # 39؛
& # 39؛. $ ama_feature؛ }اکنون کار واقعی وجود دارد – از پاسخ API Amazon (به Scratchpad مراجعه کنید) ، که در
واقع شده است. پاسخ $
ما باید [1909015] داده ها را که مورد علاقه ما است ، حل کنیم. . اول ، یک مورد خطا درمان می شود که داده ها به هیچ وجه برنمی گردد ، و سپس ساختار داده XML XML توسط توسط [194590287] تبدیل شده توسطSimplexml_load_string
که استفاده از آن آسان است. تنها کاری که باید انجام دهید این است که بدانید معنی این چیست. و در اینجا دوباره کمک می کند Amazon Scratchpad . بیایید نمونه ای از قیمت هایی را که می توانید در زیر مشاهده کنید:$ amaxml-> آیتم ها -> مورد-> پیشنهاد- خلاصه-> کمترین قیمت-> قیمت فرمت شده؛
اما اگر هیچ قیمتی به عنوان استثنا ثبت نشده باشد ، مکان دوم وجود دارد که برنامه می تواند جستجو کند ، یعنی:
$ amaxml-> موارد-> مورد-> پیشنهاد - خلاصه -> کمترین قیمت-> قیمت قالب بندی شده؛
مشابه توضیحات محصول ، مکان مشخص شده است ، اما همیشه پر نمی شود. در این حالت ، این برنامه از خطوط ویژگی استفاده می کند که در یک لیست HTML جمع آوری می شوند.
یک کلمه دیگر در مورد نقاشی. این برنامه از MediumImage API Amazon استفاده می کند ، اما اندازه های تصویر دیگری را نیز ارائه می دهد ، که در صورت تمایل می توانید در برنامه Scratchpad برای شخصی سازی این برنامه پیدا کنید. ما به عکسها می چسبیم:
VII. بارگیری عکس ها
$ mediumImg = $ cachefolder. "/ متوسط -". $ Ama_id. ". JPG"؛ $ ch = curl_init ($ ama_medium-> URL)؛ $ targetfile = fopen ($ mediumImg "" در ")؛ curl_setopt ($ ch ، CURLOPT_FILE ، $ targetfile)؛ curl_setopt ($ ch ، CURLOPT_TIMEOUT ، 600)؛ curl_exec ($ ch)؛ fclose ($ targetfile)؛
برای ذخیره تصویر در سرور ، ابتدا نامی منحصر به فرد ایجاد می کنیم . برای این منظور ، این برنامه از درخواست درخواست استفاده می کند که آمازون صریحاً به هر تماس API اختصاص می دهد و ما قبلاً از داده های تحت
$ ama_id
حل کرده ایم. برای بارگیری MediumImage از طریق اینترنت ، از تابع PHP PHP استفاده می کنیم که می تواند از چنین دسترسی های از راه دور پشتیبانی کند و همچنین آنها را به زیبایی ذخیره کند. سپس تصویر در پوشه cache قرار دارد و$ mediumImg
به پرونده اشاره می کند.اکنون همه داده ها و تصویر داریم و می توانیم هر دو را برای بازگشت به مشتری آماده کنیم. Proxy Amazon یک قطعه کد HTML ایجاد می کند که می تواند مستقیماً به وب سایت تزریق شود.
VIII. ایجاد سوئیچ HTML
(قالب $) { مسکن "جعبه گسترده": $ a = "
"؛ $ a. = & # 39؛"؛ شکستن؛ "smallbox": شکستن؛ پرونده "پیوند": $ a = ""؛ $ a. = "عرض. "http://blog.helmutkarger.de/" height = "http://blog.helmutkarger.de/". $ ama_medium-> قد. "http: // blog. helmutkarger.de/" border = "0"> & # 39 ؛؛ $ a. = "
"؛ $ a. = ""؛ $ a. = ""؛ $ a. = ""؛ $ a. = & # 39؛ & # 39؛. $ ama_title. & # 39؛ & # 39 ؛؛ $ a. = "
"؛ $ a. = & # 39؛قیمت: & # 39؛. $ ama_price. & # 39؛
& # 39 ؛؛ $ a. = & # 39؛& # 39؛. $ ama_description. & # 39؛& # 39 ؛؛ $ a. = ""؛ $ a. = & # 39؛ & # 39 ؛؛ $ a. = ""؛ شکستن؛ به طور پیش فرض: $ A = "http://blog.helmutkarger.de/"؛ }یک سرور پروکسی آمازون می تواند نه تنها یک نوع قطعه کد ، بلکه انواع مختلفی را ایجاد کند که با نام های الگوها متمایز می شوند. بنابراین ، از طراحی
جعبه توزیع
برای پشتیبانی از بسیاری از قالب ها استفاده می شود. الگوهای زیر در دسترس است:
- widebox : این یک آگهی کامل تبلیغاتی با تصویر ، عنوان ، قیمت و توضیحات محصول است
- smallbox : این الگو هنوز ایجاد نشده است
- پیوند : نوار عنوان ساده با پیوندها و قابها
هنوز هم فضای اضافی وجود دارد
عملکرد همیشه یکسان است ، متغیر $ a
با استفاده از داده هایی که در بالا حل کردیم با متن HTML پر شده است. از ساخت XML و برخی از یک ظاهر طراحی شده از همه مهمتر ، پیوند تصویر به فهرست پستی پروکسی ، و نه به آمازون انجام می شود.
IX. هدر HTML را بارگذاری کنید
("نوع محتوا: text / html؛ charset = UTF-8")؛
echo $ a؛
؟>
ما یک قطعه کد HTML را بر اساس نام الگو و داده های آمازون ایجاد کردیم. شما فقط باید آن را به مشتری تماس گیرنده برگردانید. این بسیار ساده است ، ما هدر مناسب را تعیین می کنیم و قطعه کد را توسط echo echo
ارسال می کنیم.
کد تکمیل شد
برای کسانی که می خواهند کد PHP AmaProx را کپی کنند ، در اینجا دوباره در یک قطعه ظاهر می شود:
10)) {
جدا کردن (پرونده $)؛
}
}
// IV. یک سؤال ایجاد کنید
$ params = آرایه (
"خدمات" => "AWSECommerceService" ،
"Operation" => "ArticleLookup" ،
"AWSAccessKeyId" => $ access_key_id ،
"AssociateTag" => $ Associate_tag ،
"ArticleId" => $ asin ،
"IdType" => "ASIN" ،
"ResponseGroup" => $ bers_group
)؛
if (! صادر ($ params ["Timestamp"]))) {
$ params ["Timestamp"] = gmdate (& # 39؛ Y-m-d TH: i: s Z & # 39؛)؛
}
ksort ($ Params)؛
جفت $ = آرایه ()؛
foreach ($ params به عنوان کلید $ => مقدار) {
array_push (جفت $ ، rawurlencode (کلید $). "=". rawurlencode (مقدار $))؛
}
$ canonical_query_string = بپیوندید ("&" ، $ جفت)؛
$ string_to_sign = "دریافت n". $ نقطه پایان " n" $ uri " n" $ canonical_query_string؛
$ Signature = base64_encode (hash_hmac ("sha256" ، $ string_to_sign ،
$ secret_key ، true))؛
$ request_url = & # 39؛ https: //' ؛.$endpoint.$uri.'؛؟ & # 39؛ $ canonical_query_string.
& # 39؛ و امضا = & # 39؛ rawurlencode (امضای $).
// پرسش و پاسخ آمازون V.
پاسخ $ = @ file_get_contents ($ درخواست_url)؛
// VI. جواب را تحلیل کنید
if (پاسخ $ === FALSE)
بازگشت؛
}
$ amaxml = Simplexml_load_string (پاسخ $)؛
if ($ amaxml === FALSE)
بازگشت؛
}
if ($ amaxml-> موارد-> درخواست-> IsValid! = "درست") {
بازگشت؛
}
if (! خالی ($ amaxml-> موارد-> درخواست-> خطا)) {
بازگشت؛
}
$ ama_id = $ amaxml-> OperationRequest-> RequestId؛
$ ama_titel = $ amaxml-> اشیاء-> موضوع-> موضوع متن -> عنوان؛
$ ama_medium = $ amaxml-> موارد-> مورد-> MediumImage؛
اگر (خالی ($ ama_medium)) {
$ ama_medium = $ amaxml-> آیتم ها -> مورد -> ImageSets-> ImageSet-> MediumImage؛
}
$ ama_page_url = $ amaxml -> موارد-> مورد-> جزئیاتPageURL؛
$ ama_price = $ amaxml-> موارد-> مورد-> پیشنهادات خلاصه-> کمترینNewPrice-> قالب بندی شده قیمت؛
اگر (خالی ($ ama_price)) {
$ ama_price = $ amaxml-> موارد-> مورد-> پیشنهادات خلاصه-> کمترین قیمت استفاده شده - قیمت-> قالب بندی شده قیمت؛
}
$ ama_description = $ amaxml-> موارد-> مورد-> تحریریه مرور-> سرمقاله بررسی-> محتوا؛
$ ama_feature = & # 39؛ & # 39 ؛؛
foreach ($ amaxml -> موارد-> مورد-> مورد- ویژگی ها -> ویژگی به عنوان $ ویژگی) {
$ ama_feature. = & # 39؛ - & # 39؛. ویژگی $ & # 39؛
& # 39 ؛؛
}؛
$ ama_feature. = & # 39؛
& # 39 ؛؛
اگر (خالی ($ ama_description)) {
$ ama_description = $ ama_feature؛
} otherif (strlen ($ ama_description) <100)
$ ama_description = & # 39؛
& # 39؛. $ ama_feature؛
}
// VII. عکس بگیرید
$ mediumImg = $ حافظه پنهان. "/ متوسط -". $ ama_id ". jpg"؛
$ ch = curl_init ($ ama_medium-> URL)؛
$ targetfile = fopen ($ mediumImg "" در ")؛
curl_setopt ($ ch ، CURLOPT_FILE ، $ targetfile)؛
curl_setopt ($ ch ، CURLOPT_TIMEOUT ، 600)؛
curl_exec ($ ch)؛
fclose (پرونده مقصد)؛
// VIII. کد HTML تولید کنید
سوئیچ (قالب $)
مسکن "جعبه گسترده":
$ a = ""؛
$ a. = & # 39؛
عرض. "http://blog.helmutkarger.de/" height = "http://blog.helmutkarger.de/". $ ama_medium-> قد. "http: // blog. helmutkarger.de/" border = "0"> & # 39 ؛؛
$ a. = ""؛
$ a. = ""؛
$ a. = ""؛
$ a. = & # 39؛ & # 39؛. $ ama_title. & # 39؛ & # 39 ؛؛
$ a. = "
"؛
$ a. = & # 39؛ قیمت: & # 39؛. $ ama_price. & # 39؛
& # 39 ؛؛
$ a. = & # 39؛ & # 39؛. $ ama_description. & # 39؛ & # 39 ؛؛
$ a. = ""؛
$ a. = ""؛
$ a. = ""؛
شکستن؛
"smallbox":
شکستن؛
پرونده "پیوند":
$ a = ""؛
$ a. = & # 39؛ & # 39 ؛؛
$ a. = ""؛
شکستن؛
به طور پیش فرض:
$ A = "http://blog.helmutkarger.de/"؛
}
// IX. ارسال HTML
header ("نوع محتوا: text / html؛ charset = UTF-8")؛
echo $ a؛
؟>
آزمایش پروکسی
می توانیم پروکسی را مستقیماً با با URL زیر تماس بگیریم:
https://www.mysite.com/amaprox/amaprox.php؟asin= B00XLVXILI & model = widebox
البته ، دامنه و احتمالاً دایرکتوری باید سفارشی سازی شود. به نظر می رسد این تصویر صفحه است.

یا در حقیقت با برخی پیشرفت ها (به تصویر زیر مراجعه کنید) ، سپس:
پروکسی آمازون را بهبود بخشید
همانطور که گفته شد ، پروکسی آمازون یک طراحی نسبتاً اساسی است ، تا کاملاً واضح باشد در اینجا چند پیشنهاد در مورد چگونگی توسعه آن ارائه شده است:
- در استفاده از خطا: خطاهای رخ داده می توانند در پرونده ورود به سیستم ذخیره شوند
- اعلان نامه ، به عنوان مثال اگر محصول یا قیمت دیگر در دسترس نباشد
- قالبهای بیشتر برای سایر قالبهای نمایش
- تبلیغات آمازون با آرم آمازون
- با افزودن دکمه خرید
مقالات بیشتر در این گروه: