Text práce

Transkript

Text práce
Zadánı́ bakalářské práce
• Navrhněte a implementujte automatický přihazovacı́ program pro aukčnı́ portál ebay.com.
• Program bude sledovat zadanou aukci a v poslednich 5 sekundách přihodı́ v této aukci
zadanou cenu.
• Program musı́ umět hlı́dat vı́ce aukcı́ zároveň.
• Program musı́ běžet pod operačnı́m systémem Linux.
• GUI nenı́ vyžadováno, program lze ovládat přes přı́kazovou řádku.
1
2
České vysoké učenı́ technické v Praze
Fakulta elektrotechnická
Katedra počı́tačů
Bakalářská práce
Automatický přihazovacı́ systém pro e-bay.com
Ondřej Hrabal
Vedoucı́ práce: Ing. Jiřı́ Smı́tka
Studijnı́ program: Elektrotechnika a informatika, dobı́hajı́cı́, Bakalářský
Obor: Výpočetnı́ technika
10. března 2013
iv
v
Poděkovánı́
Velmi rád bych tı́mto poděkoval vedoucı́mu své bakalářské práce, Ing. Jiřı́mu Smı́tkovi, za
hodnotné rady a veškerý čas, který mi věnoval. Dále pak svým rodičům a kamarádům za
vynikajı́cı́ pasivnı́ podporu v dlouhodobé práci.
vi
vii
Prohlášenı́
Prohlašuji, že jsem práci vypracoval samostatně a použil jsem pouze podklady uvedené
v přiloženém seznamu.
Nemám závažný důvod proti užitı́ tohoto školnı́ho dı́la ve smyslu §60 Zákona č. 121/2000
Sb., o právu autorském, o právech souvisejı́cı́ch s právem autorským a o změně některých
zákonů (autorský zákon).
V Hranicı́ch dne 18. 5. 2010
.............................................................
viii
Abstract
The purpose and goal of my work is to design and implement an automatic bidding system
for (the auction portal) e-bay.com. The program will watch a given auction and make a bid in
last 5 seconds to win the auction and also has to be able watch more auctions simultaneosly.
The program must be compatible with Linux operating system. GUI is not required as the
program can be controlled via command line.
Abstrakt
Podstatou a cı́lem práce je navrhnout a implementovat automatický přihazovacı́ program
pro aukčnı́ portál e-bay.com.
Program bude sledovat zadanou aukci a v poslednı́ch 5 sekundách přihodı́ v této aukci
zadanou cenu, zároveň však musı́ umět hlı́dat vı́ce aukcı́ zároveň. Program musı́ běžet pod
operačnı́m systémem Linux, přičemž grafické uživatelské rozhranı́ (GUI) nenı́ vyžadováno,
ovládánı́ lze provést přes přı́kazovou řádku.
ix
x
Obsah
1 Úvod
1.1 Historie eBay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Princip on-line aukce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Současné trendy on-line nakupovánı́ . . . . . . . . . . . . . . . . . . . . . . .
1
1
2
2
2 Motivace
2.1 Cı́le práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Výsledek práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Existujı́cı́ implementace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
5
6
6
3 Analýza a návrh řešenı́
3.1 Programovacı́ jazyk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Použité prostředı́ pro tvorbu . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
9
9
4 Realizace
4.1 Implementace využı́vajı́cı́ eBay API . . . . . . . . . . .
4.2 Přihlášenı́ do systému . . . . . . . . . . . . . . . . . . .
4.2.1 Struktura XML . . . . . . . . . . . . . . . . . . .
4.3 Zı́skánı́ informacı́ o položce na eBay . . . . . . . . . . .
4.4 Přihozenı́ . . . . . . . . . . . . . . . . . . . . . . . . . .
4.4.1 Klasická přihazovacı́ aukce . . . . . . . . . . . .
4.4.1.1 Vytvořenı́ nabı́dky a přihozenı́ . . . . .
4.4.1.2 Monitorovánı́ aukcı́ . . . . . . . . . . .
4.4.1.3 Vyhodnocenı́ času přihozenı́ . . . . . .
4.4.1.4 Zrušenı́ monitorované aukce . . . . . .
4.4.1.5 Názorný popis celého procesu přihozenı́
4.4.2 Koupě položky za fixnı́ cenu . . . . . . . . . . . .
4.4.3 Poslánı́ nejlepšı́ nabı́dky . . . . . . . . . . . . . .
4.5 Poslánı́ požadavku PlaceOffer . . . . . . . . . . . . . . .
4.5.1 Struktura HTTP hlavičky . . . . . . . . . . . . .
4.5.2 Struktura XML požadavku . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
12
13
15
16
18
18
19
20
21
21
22
22
22
22
23
5 Testovánı́
25
5.1 Jednotkové testy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.2 Testy grafického uživatelského rozhranı́ . . . . . . . . . . . . . . . . . . . . . . 26
5.2.1 Mockovánı́ objektů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
xi
xii
OBSAH
5.3
5.4
5.5
Praktické testovánı́ testery . .
5.3.1 Výsledky testovánı́ . .
5.3.2 Čekacı́ dialogové okno
5.3.3 Resource bundle . . .
Funkčnost programu . . . . .
Zhodnocenı́ testovánı́ . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
28
28
29
30
30
6 Závěr
31
Literatura
33
A Seznam použitých zkratek
35
B Instalačnı́ a uživatelská přı́ručka
37
C Obsah přiloženého CD
43
Seznam obrázků
1.1
Oficiálnı́ internetová stránka eBay . . . . . . . . . . . . . . . . . . . . . . . .
2
2.1
Program JBidwatcher verze 2.1pre5 . . . . . . . . . . . . . . . . . . . . . . . .
6
3.1
3.2
Model požadavků přihazovacı́ho programu . . . . . . . . . . . . . . . . . . . .
Model přı́padů užitı́ přihazovacı́ho programu . . . . . . . . . . . . . . . . . .
7
8
4.1
4.2
4.3
4.4
4.5
Model nasazenı́ přihazovacı́ho programu . . . .
Sekvenčnı́ diagram uloženı́ přihlašovacı́ch údajů
Zı́skánı́ tzv. Item number u položky na eBay .
Okno zobrazujı́cı́ přihazovacı́ menu . . . . . . .
Bussiness model přihozenı́ . . . . . . . . . . . .
.
.
.
.
.
13
15
16
17
21
5.1
5.2
Graf výsledků dotaznı́ku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Informačnı́ dialogové okno . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
29
B.1
B.2
B.3
B.4
B.5
Hlavnı́ okno přihazovacı́ho programu . . . . . . . .
Okno zobrazujı́cı́ přihlašovacı́ údaje do eBay . . . .
Okno zobrazujı́cı́ uloženı́ nebo načtenı́ souboru . .
Okno zobrazujı́cı́ přihazovacı́ menu . . . . . . . . .
Okno zobrazujı́cı́ tabulku monitorovaných položek
.
.
.
.
.
38
39
40
41
42
C.1 Seznam přiloženého CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
xiii
. . . . .
do XML
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . .
souboru
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
xiv
SEZNAM OBRÁZKŮ
Kapitola 1
Úvod
V bakalářské práci se zabývám asi nejznámějšı́ americkou internetovou aukčnı́ sı́nı́ eBay[6].
Hlavnı́m tématem mé práce je vytvořit aplikaci schopnou automaticky sledovat vı́ce aukcı́
souběžně a v poslednı́ chvı́li probı́hajı́cı́ aukce přihodit předem nastavenou částku. Pokusı́m
se čtenáře krátce obeznámit s historiı́ a současnými trendy internetových aukcı́. Dále blı́že
specifikuji cı́le, vytvořı́m analýzu a návrh řešenı́, provedu realizaci, tedy implementaci řešenı́,
kterou řádně otestuji a na závěr zhodnotı́m splněnı́ cı́lů bakalářské práce a budu diskutovat
o jejı́m dalšı́m možném pokračovánı́.
1.1
Historie eBay
Obchodnı́ aukčnı́ portál eBay 1.1 (dále jen eBay) byl založen v San José 4. zářı́ 1995
počı́tačovým programátorem Pierrem Omidyarem jako AuctionWeb.1 AuctionWeb patřil
Omidyarově konzultačnı́ společnosti jménem Echo Bay Technology Group. Protože však
doménu echobuy.com tehdy vlastnila jedna kanadská těžebnı́ společnost, Sierr Omidyar
zkrátil název a v zářı́ 1997 zaregistroval doménu ebay.com.
Za tu dobu prošla řadou změn a vylepšenı́. Od roku 1999 eBay prožı́vá mezinárodnı́
expanzi2 a stal se největšı́ světovou aukčnı́ sı́nı́, která působı́ již ve čtyřech desı́tkách zemı́
na všech světových kontinentech. Dnes má vı́ce než 90 milionů uživatelů po celém světě.
eBay také úzce spolupracuje s dalšı́mi světovými softwarovými systémy[13] jako je PayPal,
MoneyBookers či BidPay nebo Skype, který v roce 2005 koupil a stal se tak jeho většinovým
vlastnı́kem.
Málokdo vı́, že je eBay průkopnı́kem v porovnávánı́ cen produktů od jednotlivých prodejců,
které je velmi populárnı́m a rozšı́řilo se do celého světa (u nás známe např. zbozi.cz).
Za zmı́nku také stojı́, že od roku 2008 funguje v Praze eBay Center of Excellence, marketingové a analytické centrum zaměřujı́cı́ se na evropské a asijské trhy. Úplnou novinkou je
oficiálnı́ expanze eBay k datu 25. března 2010 na český trh, což přinášı́ plnou lokalizaci do
českého jazyka[4].
1
2
Prvnı́ prodanou položku a tou bylo rozbité laserové ukazovátko, které se prodalo za cenu 14.83 dolarů.
Tržiště eIM tzv. elektronický mezinárodnı́ obchodnı́ portál.
1
2
KAPITOLA 1. ÚVOD
Obrázek 1.1: Oficiálnı́ internetová stránka eBay
1.2
Princip on-line aukce
Aktivně se účastnit aukce[3] mohou jen registrovanı́ uživatelé, ostatnı́ smı́ jen aukci pozorovat. Registrace je zdarma, přičemž se zpravidla vyžaduje jméno, přı́jmenı́, kontaktnı́ a
emailová adresa, na kterou je poté zaslán potvrzovacı́ email, který obsahuje odkaz, po jehož
kliknutı́ se dokončı́ registrace.
Aukce probı́hajı́ od zvolené částky a trvajı́ různě dlouho (zpravidla ne déle jak měsı́c).
Aukci vyhrává pochopitelně nejvyššı́ nabı́dka. Kromě klasického aukčnı́ho přihazovánı́“ ,
”
čemuž se na eBay oficiálně řı́ká Chinese auction, lze využı́t možnosti Buy it now, což znamená
nakoupit zbožı́ okamžitě za stanovenou fixnı́ cenu. Tyto dva typy aukcı́ je možno kombinovat
tak, že daná položka aukce je dražena tradičnı́m způsobem a přitom má nastavenu fixnı́ cenu.
Je zřejmé, že fixnı́ cena je vyššı́ než počátečnı́ cena nastavená klasickým přihazovánı́m. Dále
lze využı́t třetı́ho typu aukce, jenž se vyskytuje pouze společně s Buy it now aukcı́ a to je
tzv. Best offer. To znamená, že kromě možnosti koupě položky za fixnı́ cenu, je umožněno
prodejci udělat nabı́dku vlastnı́ ceny, kterou může a nemusı́ přijmout. Po skončenı́ aukce
má prodejce sedm dnı́ na vyřı́zenı́ obchodu, tedy výměny zbožı́ a peněz. Je užitečné mı́t
zaregistrovaný účet v systému PayPal, protože se ho dá u většiny aukcı́ využı́t. Nejlepšı́ je
mı́t účet ověřený, k čemuž stačı́ registrovaná platebnı́ karta s neblokovanou možnostı́ on-line
plateb.
1.3
Současné trendy on-line nakupovánı́
Internetová aukce se posléze stala celosvětovým hitem, jenž umožňuje lidem prodávat
a nakupovat široké spektrum zbožı́ a služeb on-line. Dı́ky velmi široké nabı́dce zbožı́ od
prodejců z celého světa lze přes eBay koupit či prodat prakticky cokoliv3 . Aukce eBay se
nachazı́ na několika doménách (ebay.com, ebay.de, ebay.ca, ebay.co.uk, ebay.cz, ebay.com.au
3
Jsou známy i přı́pady, kdy nespokojený manžel prodával v aukci svou manželku.
1.3. SOUČASNÉ TRENDY ON-LINE NAKUPOVÁNÍ
3
atd.), které jsou vzájemně propojeny, tudı́ž pro spokojené nakupovánı́ stačı́ jeden uživatelský
účet.
Pro informaci uvedu i jiné konkurenčnı́ aukčnı́ portály:
• http://www.amazon.com
• http://www.aukro.cz
• http://heureka.cz
• http://ikup.cz
Výhod internetových aukcı́ je nespočet, proto krátce uvedu jen ty hlavnı́. V prvé řadě je
to nabı́dka obrovského sortimentu zbožı́, které nemůže konkurovat žádný obchod na světě.
Dále jsou to nižšı́ ceny, jelikož aukčnı́ systém pružně reaguje na celkovou poptávku a nabı́dku
zbožı́, tudı́ž poskytuje rovnovážnou cenu. Z dalšı́ch výhod jmenujme např. snadnou komunikaci mezi prodejci a zákaznı́ky, fotografie a popisy zbožı́, dále pak vyhledávánı́ podle
klı́čových slov a v neposlednı́ řadě pohodlnost vyřı́zenı́ obchodu (poněvadž vše, co člověk
potřebuje, je zaregistrovaný účet na portálu a zařı́zenı́ připojené k internetu) a rychlost,
protože každý prodejce je povinen mı́t zbožı́ fyzicky k dispozici, tudı́ž nehrozı́ problém jako
v řadě internetových obchodů, kdy zbožı́ nenı́ skladem dostupné.
Existujı́ ovšem i nevýhody. A to kupřı́kladu placenı́ poštovného, jež se může prodražit v
přı́padě, že nakupujeme od vı́ce prodejců. Dalšı́ nevýhodou je nutnost bojovat“ se soupeři v
”
aukci, kteřı́ majı́ zájem o to samé zbožı́. Tento problém se pokusı́m vyřešit ve své bakalářské
práci.
4
KAPITOLA 1. ÚVOD
Kapitola 2
Motivace
Motivacı́ pro vytvořenı́ programu mi bylo zjištěnı́, že eBay poskytuje API pro některé své
služby.1 To se mi jevı́ jako velmi kladný přı́stup, z kterého mohou čerpat i ostatnı́ vývojáři.
Tato práce nenı́ rešeršnı́, což znamená, že se nesnažı́m popsat různé způsoby dosaženı́
téhož výsledku, ale naopak volı́m jeden, dle mého názoru nejlepšı́ a nejjednoduššı́ (na ostatnı́ řešenı́ přı́padně upozorňuji) a ten podrobně rozebı́rám. Vše jsem se snažil co možná
nejpraktičtěji vysvětlit a popsat, aby čtenář dokázal snadno proniknout do problematiky.
2.1
Cı́le práce
Hlavnı́m cı́lem této práce je na základě uvedených požadavků vytvořit fungujı́cı́ program,
a řádně ho otestovat.
• Popis řešeného problému, vymezenı́ cı́lů bakalářské práce a požadavků na implementovaný systém.
• Zhodnocenı́ existujı́cı́ch implementacı́.
• Analýza a návrh implementace.
• Vytvořenı́ programu a následný popis implementace.
• Testovánı́ aplikace.
• Zhodnocenı́ splněnı́ cı́lů bakalářské práce a vlastnı́ho přı́nosu.
• Diskuze dalšı́ho možného pokračovánı́ práce.
1
O tom později v analýze a návrhu řešenı́.
5
6
KAPITOLA 2. MOTIVACE
2.2
Výsledek práce
Jak vypadá konkrétnı́ podoba výsledného programu? Je to desktopová aplikace, která:
• po zadánı́ přihlašovacı́ch údajů vytvořı́ spojenı́ s aukčnı́m portálem eBay.com,
• podle ID přı́slušné aukce zobrazı́ informace o dané aukci,
• dokáže monitorovat vı́ce aukcı́ současně,
• zjistı́ oficiálnı́ čas aukčnı́ho portálu eBay.com pro synchronizaci přesného času přı́hozu“,
”
• po nastavenı́ finálnı́ částky přihodı́“ tuto sumu v poslednı́ch 5 sekundách aukce,
”
• funguje pod operačnı́m systémem Linux i Windows,
• má grafické uživatelské prostředı́ (GUI).
2.3
Existujı́cı́ implementace
V současné době je mi známa pouze jedna desktopová aplikace fungujı́cı́ na podobném
principu a to jBidwatcher[10]. Je to freeware program implementovaný v Javě, majı́cı́ za
úkol monitorovat a přihazovat částku v poslednı́m momentě aukce. Kromě toho umožňuje
vyhledávánı́ položek na eBay a časovou synchronizaci s eBay serverem. V době psanı́ této
práce se aplikace nacházela v pre-release stadiu, viz Obrázek 2.1.
Obrázek 2.1: Program JBidwatcher verze 2.1pre5
Dále existuje několik doplňků pro prohlı́žeč Mozilla Firefox[7], jež jsou většinou neaktuálnı́
a zastaralé s tı́m, jak eBay měnı́ své stránky a zabezpečuje se proti sniffingu[18] nebo jsou
tyto pluginy propojené s účty on-line aplikaci[2], které však vyžadujı́ registraci a majı́ jisté
omezenı́ či nevýhody, jako kupřı́kladu si vynucujı́ podı́l na vyhrané aukci nebo při zadánı́
monitorovánı́ nové aukce požadujı́ zaplacenı́ jednorázového poplatku apod.
Kapitola 3
Analýza a návrh řešenı́
Jaké požadavky jsou tedy kladeny na program? Vycházı́m z oficiálnı́ho zadánı́ práce a
dále pak požadavků běžného uživatele. Aplikace by měla být stabilnı́ a co se týká ovládánı́
uživatelsky přı́větivá. Z tohoto důvodu jsem se rozhodl implementovat GUI, ovšem při
podmı́nce zachovánı́ jednoduchosti. A to proto, že bych byl nerad, kdyby se GUI stalo
obtěžujı́cı́m faktorem, jenž uživateli znepřehledňuje činnost a zhoršuje schopnosti ovládat
program a orientovat se v něm. Co se týká stability programu jsou kladeny nároky předevšı́m
na chyby způsobené uživatelem, jako např. nevhodná forma vstupnı́ch dat i na chyby prostře”
dı́“ jako je např. náhlá ztráta internetového spojenı́. Jednou z důležitých a často opomı́jených
vlastnostı́ je také nenáročnost instalace programu a jeho spuštěnı́. Tady bych, i z
důvodů popsaných nı́že 3.1, preferoval programovacı́ jazyk Java, jenž má tu možnost vytvořit
spustitelný soubor - jar archiv, což je pro běžného uživatele pohodlnějšı́ než např. spouštět
bash skript či instalovat lokálnı́ server.
Obrázek 3.1: Model požadavků přihazovacı́ho programu
Vzhledem k tomu, že jsem si stanovil za cı́l, aby program byl schopný se autentifikovat
a autorizovat na eBay, bude nutné, aby uživatel vyplnil své přihlašovacı́ údaje. Tı́m vzniká
dalšı́ požadavek na program a nenı́ jı́m nic jiného než bezpečnost. Protože je standardem,
aby aplikace uměla přihlašovacı́ údaje načı́tat a ukládat, poněvadž vyplňovat je s každým
dalšı́m spuštěnı́m programu je nepohodlné, rozhodl jsem se, že tuto funkčnost implementuji
ve svém řešenı́. Za vhodný formát uloženı́ textových dat považuji stromovou strukturu, s nı́ž
se velmi dobře pracuje. Programovacı́ jazyk Java nabı́zı́ řadu technologiı́ pro práci s jazykem
7
8
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
XML. Proto jsem se rozhodl použı́t tento značkovacı́ jazyk, jenž splnı́ mé požadavky na
jednoduchost práce a stromovou strukturu. Pracovat budu s DOMem, poněvadž je mi bližšı́
než práce s SAX, i když ten má nesporné výhody v nižšı́ pamět’ové náročnosti a rychlosti
u většı́ch“ dokumentů. Já budu ovšem použı́vat jednoduchou stromovou strukturu, kde
”
výsledný dokument nebude velký“ 1 , tudı́ž pro řešenı́ mého problému mi vystačı́ použı́vat
”
DOM. Co se týká zmı́něné bezpečnosti, bude vhodné data ukládat v šifrované podobě a
při načı́tánı́ je dešifrovat. Nemyslı́m si, že je nezbytně nutné použı́t silné šifrovánı́ náročné na
výpočetnı́ výkon. Jde mi spı́še o to, vyfiltrovat možnost pouhého otevřenı́ souboru v textovém
režimu a zı́skánı́ tak veškerých přihlašovacı́ch údajů. Pro názornějšı́ představu jsem vytvořil
model přı́padů užitı́, který je zobrazen na následujı́cı́m obrázku 3.2.
Obrázek 3.2: Model přı́padů užitı́ přihazovacı́ho programu
Podle možnostı́ a času bych dále aplikaci rozšı́řil o dalšı́ schopnosti, jenž by z nı́ udělaly
mohutnějšı́ nástroj na spravovánı́ aukcı́ na eBay. Budu dávat přednost funkcionalitám, které
budou data z eBay zı́skávat a zpracovávat, nikoliv dodávat.
1
Strom nebude obsahovat vı́ce jak 20 uzlů.
3.1. PROGRAMOVACÍ JAZYK
3.1
9
Programovacı́ jazyk
Hledánı́ relevantnı́ch informacı́ o eBay mě zavedlo na pro mě určitě nejhodnotnějšı́
stránky eBay Developers Programu[5]. Neváhal jsem a po bezplatné registraci se připojil do
vývojářského centra2 . Prvnı́ rozhodnutı́, které jsem musel učinit, se týkalo programovacı́ho
jazyka, v kterém budu implementovat řešenı́ své bakalářské práce. Důležitá pro mě byla
znalost jazyka a jeho multiplatformnost. Developerský program eBay nabı́zı́ podporu pro
tato implementačnı́ prostředı́ a technologie:
• JavaScript Dev Center (JavaScript, JSON, AJAX)
• Flash Dev Center (ActionScript, Flex)
• PHP Dev Center (PHP, Perl, Python)
• Windows Dev Center (.NET, C#, ASP, VB)
• Java Dev Center (Java, JSP)
Hlavnı́ roli v mém rozhodnutı́ hrály osobnı́ zkušenosti s danými programovacı́mi jazyky.
Největšı́ zkušenosti mám s programovacı́m jazykem Java, o řád menšı́ potom s PHP a
JavaScriptem. Pro Javu jsem se rozhodl z několika dalšı́ch důvodů. Jednı́m z rozhodujı́cı́ch
faktorů byla možnost stáhnout kompletnı́ software developement kit (SDK) pro Javu včetně
dokumentace. Dalšı́ výhodou Javy oproti PHP či JavaScriptu je fakt, že pro běh aplikace nenı́
nutné mı́t nainstalovaný a funkčnı́ aplikačnı́ server. V neposlednı́ řadě Java nabı́zı́ možnost
vytvořenı́ spustitelného jar archivu. K vývoji programu je ovšem potřeba mı́t nainstalované
JDK[11] ve verzi 1.6 update 3 nebo vyššı́, ke spuštěnı́ pak JRE[11] a pochopitelně vlastnit
zařı́zenı́ připojené k internetu.
3.2
Použité prostředı́ pro tvorbu
Vzhledem k podmı́nce fungovánı́ programu v linuxovém prostředı́ jsem se rozhodl implementovat v Ubuntu 9.10 the Karmic Koala. Jako IDE jsem si vybral Eclipse 3.5 SR2, které
dostatečně vyhovuje požadavkům pro vývoj, testovánı́ i běh programu.
2
Doporučuji se registrovat, zı́skáte tı́m automaticky vygenerovaná ID a tokeny potřebné pro testovánı́ a
běh aplikace
10
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
Kapitola 4
Realizace
V této kapitole se zaměřı́m na popis implementace se zaměřenı́m na nestandardnı́ části
řešenı́, poněvadž aplikace je rozsáhlá a přijde mi nevhodné popisovat řekněme standardnı́“
”
součásti programu jako např. GUI nebo vysvětlovat rozšı́řené funkce programu oproti zadánı́,
které jsem se dobrovolně rozhodl implementovat. Dále odkazuji do kapitoly Úvod konkrétně
do bodu 1.2 Princip online aukce na vysvětlenı́ typů aukcı́ eBay a jejich možnými kombinacemi, nebot’ jsou tyto informace nezbytné pro pochopenı́ samotného kódu a použitých
výrazů v této kapitole.
4.1
Implementace využı́vajı́cı́ eBay API
Program je navržen s využitı́m eBay API, v době psanı́ tohoto textu v poslednı́ verzi
665. eBay API se skládá z několika dı́lčı́ch API, které spravujı́ svou určitou oblast, pracujı́ na
různých protokolech a podporujı́ různé formáty dat. eBay označuje množinu podporovaných
API jako eBay Web Services. Tato množina se potom dělı́ do pěti podmnožin, jimiž jsou
Search, Selling, Buying, Users a Alerts. Jednotlivé podmnožiny pak obsahujı́ konkrétnı́
API. Pro představu uvedu některé z nich spadajı́cı́ do výše zmı́něných skupin.
V podmnožině Search je to např.
• Finding API umožňujı́cı́ vyhledávat položky na eBay,
v Selling:
• Trading API zajišt’ujı́cı́ autentizovaný přı́stup k soukromým datům na eBay a spravujı́cı́ prodejnı́ management,
• Research API zprostředkovávajı́cı́ historické informace o eBay,
v Buying:
• Shopping API, které sloužı́ na vyhledávánı́ produktů, ovšem na rozdı́l od Finding
API je optimalizován na rychlost, použitelnost a menšı́ objem přenášených dat pro
přı́stup k veřejným read-only datům na eBay ve světě Web 2.0,
11
12
KAPITOLA 4. REALIZACE
v Users:
• Feedback API poskytujı́cı́ správu uživatelských účtů
a v Alerts:
• Server Notification API poskytujı́cı́ serverové oznámenı́ vhodné pro aplikace serverového typu, jenž mohou těmto notifikacı́m z eBay naslouchat.
Pro komunikaci s eBay API se využı́vá protokol HTTP (kromě Trading API, kde se využı́vá
zabezpečený HTTPS protokol v požadavku POST) v požadavcı́ch GET(REST[17]) a POST.
Pro formát dat se využı́vá XML, SOAP[19] a JSON[12].
Protože jednotlivé API jsou značně rozsáhlé a vydaly by na celou knihu, jsou popsány
detailněji pouze ty, které jsou v aplikaci prakticky využity a pro zı́skánı́ dalšı́ch informacı́
odkazuji[1] na detailnı́ popis a dokumentaci k jednotlivým API na internetových stránkách
eBay Developers Programu.
4.2
Přihlášenı́ do systému
Celý program pracuje jako celek a autentizuje se vůči eBay Trading Web Services zabezpečeným HTTPS protokolem. Tudı́ž je zapotřebı́ mı́t registrovaný účet na eBay, ale také v eBay
Developers Programu, jejichž účty jsou vzájemně propojeny. Účet v eBay Developers Programu poskytuje DeveloperID, ApplicationID, CetrificateID na základě nichž se vygeneruje
eBay token. Ten je následně použit pro veškerou dalšı́ komunikaci a má časově omezenou dobu
trvánı́, řádově asi rok. Všechny tyto identifikačnı́ údaje lze také plně využı́t pro připojenı́
do testovacı́ho prostředı́ eBay Developers Program Sandbox, kde je možno virtuálně spravovat svůj mini“ eBay. Podle toho se lišı́ i přihlašovacı́ údaje, viz Dodatek B. Pokud byla
”
vı́cekrát zadána špatná kombinace přihlašovacı́ho jména a hesla, může se server dotázat
na tzv. CAPTCHA. Tı́m se snažı́ předcházet slovnı́kovému útoku. Následujı́cı́ úsek kódu
popisuje přihlášenı́ na eBay:
ApiContext apiContext = new ApiContext();
ApiCredential apiCred = new ApiCredential();
this.apiContext.setApiCredential(apiCred);
ApiAccount account = new ApiAccount();
this.apiCred.setApiAccount(account);
ApiLogging apiLogging = new ApiLogging();
this.apiContext.setApiLogging(apiLogging);
this.apiContext.setApiServerUrl("apiServerURL");
this.apiContext.setEpsServerUrl("epsServerURL");
this.apiContext.setSignInUrl("signInURL");
4.2. PŘIHLÁŠENÍ DO SYSTÉMU
13
this.account.setDeveloper("developerID");
this.account.setApplication("applicationID");
this.account.setCertificate("certificateID");
this.apiCred.seteBayToken("token");
Ve skutečnosti tı́mto způsobem neprobı́há žádné přihlašovánı́. Pouze se do proměnné
apiContext nastavujı́ veškeré přihlašovacı́ údaje a adresy. Proměnná apiContext se použı́vá
pro všechnu komunikaci se serverem. API pak dále zajistı́ zvolenı́ názvu služby, ke které
přistupujeme. Vlastnı́ autorizace je provedena při prvnı́ komunikaci se serverem, odpadá tak
nutnost autorizovánı́ se při každé výměně dat.
Obrázek 4.1: Model nasazenı́ přihazovacı́ho programu
Na obrázku 4.1 se nacházı́ zjednodušený model nasazenı́. Zjednodušený proto, že se na
něm nevyskytujı́ všechny API, s kterými program komunikuje, ale pouze ty nejpoužı́vanějšı́.
Je tomu tak z důvodu přehlednosti a názornosti, poněvadž se všemi ostatnı́mi API komunikuje taktéž přes HTTP protokol.
4.2.1
Struktura XML
Program ukládá přihlašovacı́ údaje do souboru ve formátu XML, jehož stromová struktura je zobrazena nı́že. Třı́da StringEncrypter zašifrovává hodnoty uzlů Developer, Application, Certificate a Token, přičemž ostatnı́ položky šifrovány nejsou. Použit je open source
algoritmus Base64 s veřejným klı́čem a 8 bytovou solı́, který má tu výhodu, že výsledný
zakódovaný řetězec se skládá z tisknutelných znaků ASCII, a proto jej mohu zapsat do XML
souboru. Při nahrávánı́ přihlašovacı́ch údajů jsou dané položky zpět dešifrovány.
14
KAPITOLA 4. REALIZACE
Stromová struktura XML souboru:
<Configuration>
<ServerUrl>https://api.ebay.com/wsapi</ServerUrl>
<EpsServerUrl>https://api.ebay.com/ws/api.dll</EpsServerUrl>
<SignInUrl>https://signin.ebay.com/ws/eBayISAPI.dll?SignIn</SignInUrl>
<ApiCredential>
<Developer/>
<Application/>
<Certificate/>
</ApiCredential>
<eBayCredential>
<Token/>
</eBayCredential>
<RuName/>
<Proxy>
<Host/>
<Port/>
<Username/>
<Password/>
</Proxy>
</Configuration>
Celý proces uloženı́ přihlašovacı́ch údajů do XML souboru je názorně popsán sekvenčnı́m
diagramem (Obrázek 4.2). Uživatel se rozhodne uložit své údaje, vybere si absolutnı́ cestu,
kam je chce uložit, určı́ název souboru a stiskne tlačı́tko v GUI. To vyvolá akci, v nı́ž
třı́da Saver1 nasetuje uživatelem zadané přihlašovacı́ údaje do proměnných a předá je
třı́dě StringEncrypt k zašifrovánı́. Zašifrované údaje jsou předány třı́dě XML Builder, která
vytvořı́ výše zmı́něný stromový model XML souboru a zapı́še do něho zašifrované hodnoty.
Takto vytvořený model je uložen do XML souboru se zvoleným názvem a absolutnı́ cestou. Nakonec je uživatel informován o proběhnuté akci zobrazenı́m dialogového okna v GUI.
Načtenı́ přihlašovacı́ch údajů ze souboru funguje analogicky.
1
Názvy třı́d nekorespondujı́ přesně s názvy třı́d v implementaci z důvodu přehlednosti a názornosti diagramu.
4.3. ZÍSKÁNÍ INFORMACÍ O POLOŽCE NA EBAY
15
Obrázek 4.2: Sekvenčnı́ diagram uloženı́ přihlašovacı́ch údajů do XML souboru
4.3
Zı́skánı́ informacı́ o položce na eBay
Po přihlášenı́ a výběru akce z hlavnı́ho menu je v převážné většině nutné zadat item ID
dané položky, o nı́ž chce uživatel zjistit určité informace. Proto je vhodné vědět, kde je možné
item ID nalézt a jak s nı́m program dále pracuje. Item ID je jednoznačný identifikátor položky
na eBay označený jako Item number, což je dvanáctimı́stné čı́slo. Toto čı́slo je zobrazeno u
každé aukce na eBay, viz Obrázek 4.3 zakroužkováno červeně.
Po zadánı́ správného item ID program zobrazı́ informace o dané položce. K zı́skánı́ dat se
využı́vá třı́da z eBay Trading API GetItemCall, které se do konstruktoru předá apiContext.
Metoda této třı́dy getItem(itemID) vracı́ data v objektu typu ItemType. K takto zı́skaným
datům lze přistupovat volánı́m jednotlivých get metod, jak je zřejmé z následujı́cı́ho úseku
kódu. Zı́skané hodnoty se potom zobrazı́ v jednotlivých textboxech přı́padně tabulkách v
GUI aplikace.
ApiContext apiContext = new ApiContext();
GetItemCall api = new GetItemCall(apiContext);
String itemID = txtItemId.getText();
ItemType item = api.getItem(itemID);
item.getTitle();
item.getSellingStatus().getCurrentPrice().getValue()).toString());
item.getQuantity().toString();
item.getPrimaryCategory().getCategoryID();
16
KAPITOLA 4. REALIZACE
Obrázek 4.3: Zı́skánı́ tzv. Item number u položky na eBay
4.4
Přihozenı́
Podle zadaného item ID program rozhodne, o jaký typ aukce se u dané položky jedná tı́m,
že se zavolá metoda z eBay Trading API getListingType().value(), která do proměnné
typu String auktionType uložı́ hodnotu typu aukce.
String auctionType = item.getListingType().value();
Metoda getListingType().value() vracı́ tyto hodnoty:
• Chinese pro přihazovacı́“ typ aukce
”
• FixedPriceItem pro aukce typu Buy It Now
Pro zjištěnı́, zda daná aukce nabı́zı́ možnost vytvořit vlastnı́ nabı́dku, tzv. BestOffer,
sloužı́ metoda getBestOfferDetails(), která do objektu třı́dy BestOfferDeatilsType
uložı́ informace ohledně BestOffer aukci nebo null. Pokud objekt nenı́ null, zavolá se metoda
isBestOfferEnabled(), která do proměnné typu String bestOffer uložı́ hodnotu "Yes" v
přı́padě, že aukce podporuje BestOffer. V opačném přı́padě je v proměnné uložena hodnota
"No".
4.4. PŘIHOZENÍ
17
BestOfferDetailsType bod = item.getBestOfferDetails();
String bestOffer = "No";
if (bod != null) {
bestOffer = Utils.booleanToYesNo(bod.isBestOfferEnabled());
}
Aplikace tı́mto způsobem zjistı́, o jakou aukci přı́padně kombinaci typů aukcı́ se jedná
a zpřı́stupnı́ uživateli dalšı́ možnosti resp. tlačı́tka, co lze s aukcı́ provést2 a nastavı́ také
omezenı́ na finálnı́ cenu a kvantitu, kdy pro Snipe musı́ být nastavena výše finálnı́ částky
většı́, než je ta současná, pro Buy It Now musı́ být nastavená přesně Buy It Now Price částka
zjištěná pro danou položku a v Best Offer záležı́ na uživateli, jakou částku nabı́dne. Kvantita
musı́ být celočı́selná a vždy menšı́ nebo rovna kvantitě daného zbožı́ na eBay.
Obrázek 4.4: Okno zobrazujı́cı́ přihazovacı́ menu
2
Názvy tlačı́tek korespondujı́ s názvy typů aukcı́ v anglické verzi eBay, tedy Buy It Now, Best Offer a pro
Chinese aukci je to tlačı́tko Snipe.
18
KAPITOLA 4. REALIZACE
Tlačı́tkem Get IP se program pokusı́ zı́skat IP adresu počı́tače, na němž je spuštěn.
IP adresa se zjišt’uje poslánı́m POST požadavku na internetovou stránku whatismyip.com,
uloženou v proměnné strUrl, metodou executeMethod(post). Metoda getResponseBodyAs
String() vracı́ odpověd’ na požadavek, tedy pokud vše proběhne bez chyb, IP adresu
ve formátu String. V přı́padě chyby se zachytı́ výjimka. Metoda releaseConnection()
nakonec uvolnı́“ spojenı́.
”
String strURL = "http://whatismyip.com/automation/n09230945NL.asp";
PostMethod post = new PostMethod(strURL);
HttpClient httpclient = new HttpClient();
try {
httpclient.executeMethod(post);
this.txtIP.setText(post.getResponseBodyAsString());
} catch (Exception ex) {
loger.log(Priority.ERROR, ex);
} finally {
post.releaseConnection();
}
Pokud se nepodařı́ zı́skat IP adresu, je nutné, aby ji uživatel zadal ručně. V tomto
přı́padě je kontrolována validita IP adresy metodou validateIpAdress(String), které se
jako parametr předá proměnná typu String - ona IP adresa, a která metodou matches()
porovná podle regulárnı́ho výrazu vstupnı́ IP adresu a vyhodnotı́ jejı́ validitu. Regulárnı́
výraz kontroluje, zda se mezi třemi tečkami nacházı́ minimálně jedna, maximálně tři celočı́selné
hodnoty v uzavřeném intervalu nula až devět.
private boolean validateIpAddress(String iPaddress) {
final Pattern IP_PATTERN =
Pattern.compile("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}");
return IP_PATTERN.matcher(iPaddress.trim()).matches();
}
Takto zadané údaje jsou připraveny ke zpracovánı́, tedy přihozenı́ 4.4.1, koupi 4.4.2 nebo
vytvořenı́ nejlepšı́ nabı́dky 4.4.3.
4.4.1
4.4.1.1
Klasická přihazovacı́ aukce
Vytvořenı́ nabı́dky a přihozenı́
Před samotným přihozenı́m je nutné vytvořit nabı́dku. K tomu sloužı́ objekt offer třı́dy
OfferType, kterému se nastavı́ tři hodnoty. Těmi jsou částka, která má být přihozena, kvantita zbožı́, které chceme koupit a typ aukce. Částku i kvantitu určil uživatel, proto se metodami offer.setMaxBid(amount) respektive offer.setQuantity(item.getFinalQuantity())
4.4. PŘIHOZENÍ
19
zı́ská, přičemž částka nenı́ typu Integer nebo Double, jak by se mohl čtenář domnı́vat, ale
obaluje ji třı́da AmountType. Objektu amount této třı́dy musı́ být nastavena měna stejná, jako
je měna kupované položky, což se zaručı́ metodami amount.setCurrencyID(item.getCurren
cy()). Pro dokončenı́ nastavenı́ nabı́dky je nutné specifikovat typ aukce metodou offer.set
Action(BidActionCodeType.BID). V tomto přı́padě konstanta BID určuje klasickou přihazovacı́ aukci neboli Chinese auction.
Nynı́ je vytvořena nabı́dka. Dále je však nutné vytvořit požadavek přihozenı́. K tomu
sloužı́ třı́da z eBay Trading API PlaceOfferCall, které se jako parametr do konstruktoru předá několikrát zmı́něný apiContext. Objektu pf třı́dy PlaceOfferCall se nastavı́
metodou pf.setItemID(String.valueOf(item.getItemId())) item ID položky a metodou
pf.setEndUserIP(item.getIpAddress()) IP adresa koncového zařı́zenı́. Metoda pf.setBlo
ckOnWarning(false) určuje, zda se při varovánı́ má - hodnota true nebo nemá - hodnota
false blokovat poslánı́ nabı́dky. Nakonec se požadavek přihozenı́ odešle metodou pf.placeOf
fer().
AmountType amount = new AmountType();
amount.setCurrencyID(item.getCurrency());
amount.setValue(item.getFinalPrice().doubleValue());
OfferType offer = new OfferType();
offer.setMaxBid(amount);
offer.setQuantity(item.getFinalQuantity());
offer.setAction(BidActionCodeType.BID);
PlaceOfferCall pf = new PlaceOfferCall(item.getApiContex());
pf.setBlockOnWarning(false);
pf.setItemID(String.valueOf(item.getItemId()));
pf.setOffer(offer);
pf.setEndUserIP(item.getIpAddress());
pf.placeOffer();
4.4.1.2
Monitorovánı́ aukcı́
Dle zadánı́ má program monitorovat vı́ce aukcı́ současně a přihodit zadanou částku v
poslednı́ch pěti vteřinách před koncem aukce. Jak je toho docı́leno, bude popsáno v této
podkapitole. Základem je synchronizovaná kolekce tasks, která obsahuje veškerá data o
monitorovaných aukcı́ch. Synchronizovaná je proto, aby jejı́ operace probı́haly atomicky.
Samotné monitorovánı́ probı́há ve vlákně, které běžı́ v nekonečném while cyklu. Vlákno
je metodou Thread.sleep(1000) po vteřině uspáváno, přičemž s každou uplynuvšı́ vteřinou
se zvýšı́ o jedničku proměnná counter typu long. Podle hodnoty této proměnné docházı́ k
pravidelným aktualizacı́m dat monitorovaných položek co dvě minuty, což zajišt’uje podmı́nka
if (counter % 120 == 0) a vytvořenı́ nového vlákna new RefreshThread(tasks.get(i)).
start(), které automaticky zı́ská a uložı́ aktuálnı́ data o všech položkách v kolekci3 . Podmı́nka
if(counter == Long.MAX VALUE) sloužı́ k ošetřenı́ situace, že dojde k přetečenı́ rozsahu
typu Long.
3
Zı́skánı́ dat o položce bylo popsáno v kapitole 4.3.
20
KAPITOLA 4. REALIZACE
4.4.1.3
Vyhodnocenı́ času přihozenı́
Pro všechny prvky kolekce se zjistı́ přesné datum konce aukce s pěti sekundovým předstihem
metodou new Date(tasks.get(i).getEndTime().getTime() - 5000), která ho uložı́ do
nového objektu endDate typu Date. Čas konce aukce je v podmı́nce if(endDate.before(date)
&& tasks.get(i).isFinished() == false) porovnáván s aktuálnı́m časem. Pokud je podmı́nka splněna, označı́ se aukce metodou tasks.get(i).setFinished(true) jako skončená,
aby neproběhlo opětovné přihozenı́ a v podmı́nce if(tasks.get(i).getFinalPrice().compa
reTo(tasks.get(i).getCurrentPrice()) == 1) se vyhodnocuje, zda nastavená finálnı́ hodnota ceny přı́hozu je většı́ než aktuálnı́ cena položky. Pokud ano, vytvořı́ se nové vlákno new
SnipeThread(tasks.get(i)).start(), které provede přihozenı́, dle nastavených parametrů.
Pokud nenı́ splněna podmı́nka, nenı́ uživatel nijak upozorněn, že program nepřihodil a to
proto, at’ nenı́ obtěžován vyskakujı́cı́mi okny apod. Pouhým zkontrolovánı́m výsledku aukce
pozná, že finálnı́ hodnota částky přihozenı́ je vyššı́, než byla jı́m nastavená hodnota, tudı́ž
nebylo možné aukci vyhrát.
private static List<SnipeTask> tasks =
Collections.synchronizedList(new LinkedList<SnipeTask>());
private long counter = 0;
public void run() {
while (true) {
for (int i = 0; i < tasks.size(); i++) {
Date endDate = new Date(tasks.get(i).getEndTime().getTime() - 5000);
Date date = new Date();
if (endDate.before(date) && tasks.get(i).isFinished() == false) {
tasks.get(i).setFinished(true);
if (tasks.get(i).getFinalPrice().compareTo(tasks.get(i).
getCurrentPrice()) == 1)
new SnipeThread(tasks.get(i)).start();
}
else {
if (counter % 120 == 0)
new RefreshThread(tasks.get(i)).start();
}
}
tasks.removeAll(toDelete);
try {
Thread.sleep(1000);
counter++;
if(counter == Long.MAX_VALUE)
counter = 0;
}
}
}
4.4. PŘIHOZENÍ
4.4.1.4
21
Zrušenı́ monitorované aukce
Aby nedocházelo k časově závislým chybám, je položka, kterou chce uživatel smazat
z monitorovaných aukcı́, nejdřı́ve přidána metodou toDelete.add(tasks.get(index)) do
kolekce toDelete a až mimo for cyklus zmı́něný výše smazána metodou tasks.removeAll(to
Delete). Pokud by se ono mazánı́ položky vyskytovalo uvnitř for cyklu, došlo by k náhlé
změně hodnoty tasks.size() omezujı́cı́ počet iteracı́ cyklu a nastala by výjimka.
private static List<SnipeTask> toDelete = new ArrayList<SnipeTask>();
public void removeFromTasksList(int index) {
toDelete.add(tasks.get(index));
}
4.4.1.5
Názorný popis celého procesu přihozenı́
Jak probı́há celý postup od spuštěnı́ aplikace až po přihozenı́ částky popisuje iterativně obrázek 4.5. Po přihlášenı́ uživatele se zjistı́ informace o položce, vytvořı́ se nabı́dka
zadánı́m hodnoty ceny, která má být přihozena. Pokud je vše nastavené správně, dojde k
potvrzenı́ nabı́dky a jejı́mu přihozenı́. Pokud přihozenı́ proběhlo bez chyb, oznámı́ se nejvyššı́
přihazujı́cı́.
Obrázek 4.5: Bussiness model přihozenı́
22
KAPITOLA 4. REALIZACE
4.4.2
Koupě položky za fixnı́ cenu
Koupě položky za fixnı́ cenu se oproti klasické přihazovacı́ aukci lišı́ pochopitelně v typu
nastavené aukce. V tomto přı́padě je potřeba změnit BidActionCodeType na PURCHASE.
Dále se musı́ nastavit přesně určená hodnota ceny Buy It Now položky na eBay. Metodami
amount.setValue(item.getBuyItNowPrice()) se do objektu amount třı́dy AmountType
uložı́ hodnota této ceny, aby se následně mohla vytvořit nabı́dka metodou setMaxBid(amount).
Nastavenı́ IP adresy, měny, kvantity a ID kupované položky zůstává stejné jako v přı́padě
klasické přihazovacı́ aukce.
offer.setAction(BidActionCodeType.PURCHASE);
AmountType amount = new AmountType();
amount.setValue(item.getBuyItNowPrice());
OfferType offer = new OfferType();
offer.setMaxBid(amount);
4.4.3
Poslánı́ nejlepšı́ nabı́dky
Vytvořenı́ nejlepšı́ nabı́dky se oproti koupi položky za fixnı́ cenu lišı́ pochopitelně v typu
nastavené aukce. V tomto přı́padě je potřeba nastavit BidActionCodeType na OFFER. Nastavenı́ ostatnı́ch hodnot je stejné.
offer.setAction(BidActionCodeType.OFFER);
4.5
Poslánı́ požadavku PlaceOffer
EBay Developers Program poskytuje na svých stránkách testovacı́ prostředı́ eBay API
tzv. API Test Tool[20], kde je developerům umožněno testovat jednotlivá API a jejich metody
a to jak pro sandbox tak i pro produkčnı́ verzi eBay. Práce s třı́dou PlaceOffer, která se stará
o vytvořenı́ a přihozenı́ nabı́dky, už byla popsána v kapitole 4.4. Nynı́ bude vysvětleno, jak
probı́há komunikace. Cı́lový počı́tač4 posı́lá HTTP POST požadavek eBay serveru. HTTP
požadavek ze skládá z HTTP hlavičky a těla v XML formátu (oněch vytvořených dat).
4.5.1
Struktura HTTP hlavičky
HTTP hlavička se skládá z atributů X-EBAY-API-COMPATIBILITY-LEVEL označujı́cı́ verzi
eBay API, X-EBAY-API-DEV-NAME, X-EBAY-API-APP-NAME a X-EBAY-API-CERT-NAME, které
obsahujı́ Developer ID, Application ID a Certificate ID, X-EBAY-API-SITEID udávajı́cı́ kód
státu5 a atribut X-EBAY-API-CALL-NAME, který určuje název požadavku.
4
5
Cı́lovým počı́tačem je myšleno koncové zařı́zenı́ uživatele.
V ukázce je hodnota 0, která označuje stránky eBay náležejı́cı́ Spojeným státům americkým.
4.5. POSLÁNÍ POŽADAVKU PLACEOFFER
23
X-EBAY-API-COMPATIBILITY-LEVEL:665
X-EBAY-API-DEV-NAME:a83980e8-72b0-4ec5-9c04-f20accc48e8d
X-EBAY-API-APP-NAME:Ccece4dc5-8cb1-4a1a-80a6-a7ac622be0e
X-EBAY-API-CERT-NAME:066d0133-0ae9-4144-8e07-f509b800068c
X-EBAY-API-SITEID:0
X-EBAY-API-CALL-NAME:PlaceOffer
4.5.2
Struktura XML požadavku
Tělo HTTP požadavku obsahuje XML data. Jak si může pozorný čtenář všimnout, jsou
to právě ta data, jejichž vytvořenı́ bylo popsáno v kapitole 4.4. Uzel RequesterCredentials
respektive jeho potomek eBayAuthToken obsahuje token uživatele. Zde je vidět, že k datové
komunikaci stačı́ opravdu pouze token a nenı́ nutné se znovu autorizovat vůči eBay serveru,
jak již bylo zmı́něno v kapitole 4.2. Uzel Offer tedy jeho potomci obsahujı́ data vztahujı́cı́
se ke konkrétnı́mu požadavku přı́hozu6 . Hodnota v uzlu Action určuje druh aukce podle těchto klı́čových slov: Bid|Purchase|Accept|Counter|Decline|Offer. V uzlu MaxBid
je nastavena hodnota částky přihozenı́, v uzlu Quantity pak kvantita kupovaného zbožı́.
Uzel UserConsent obsahuje klı́čová slova true|false, které v přı́padě, že daná položka
vyžaduje potvrzenı́ licenčnı́ch práv, popisujı́, zda s nimi uživatel souhlası́ či nikoliv. Uzel
Message umožňuje poslat zprávu prodejci ve formátu String. Pokud aukce podporuje i
vytvořenı́ nejlepšı́ nabı́dky, může se v požadavku vyskytnout uzel BestOfferID, označujı́cı́
ID této nabı́dky. Poslednı́ zmı́něné tři uzly jsou pouze volitelné, zatı́mco všechny ostatnı́ jsou
vyžadovány. Uzel ItemID nese informaci o ID položky a uzel EndUserIP obsahuje IP adresu
cı́lového zařı́zenı́.
<?xml version="1.0" encoding="utf-8"?>
<PlaceOfferRequest xmlns="urn:ebay:apis:eBLBaseComponents">
<RequesterCredentials>
<eBayAuthToken></eBayAuthToken>
</RequesterCredentials>
<Offer ComplexType="OfferType">
<Action>Bid|Purchase|Accept|Counter|Decline|Offer</Action>
<MaxBid> AmountType </MaxBid>
<Quantity> int </Quantity>
<UserConsent> boolean </UserConsent>
<Message> string </Message>
<BestOfferID></BestOfferID>
</Offer>
<ItemID ComplexType="ItemIDType"></ItemID>
<EndUserIP> string </EndUserIP>
</PlaceOfferRequest>
Na konkrétnı́ požadavek v přı́padě, že nenastane chyba, pošle API následujı́cı́ odpověd’.
O úspěchu komunikace informuje uzel Ack svojı́ hodnotou Success. Uzel Timestamp infor6
Za přihozenı́ se považuje i koupě položky za fixnı́ cenu a vytvořenı́ nejlepšı́ nabı́dky. Nenı́ to sice
přihazovánı́ v pravém slova smyslu, ale jedná se o jednorázové přihozenı́.
24
KAPITOLA 4. REALIZACE
muje o času poslánı́ odpovědi na požadavek, uzly Version a Build označujı́ aktuálnı́ verzi
a vývojové sestavenı́ API. Uzel SellingStatus informuje o stavu prodeje. Atributy uzlů
ConvertedCurrentPrice a CurrentPrice currencyID informujı́ o druhu měny a výši hodnoty současné ceny v aukci. Uzel HighBidder respektive jeho potomek UserID označuje ID
aktuálnı́ho nejvyššı́ho přihazujı́cı́ho a uzel MinimumToBid udává minimálnı́ hodnotu dalšı́ho
přı́hozu v dané měně.
<?xml version="1.0" encoding="UTF-8"?>
<PlaceOfferResponse xmlns="urn:ebay:apis:eBLBaseComponents">
<Timestamp>2010-05-22T23:53:28.571Z</Timestamp>
<Ack>Success</Ack>
<Version>665</Version>
<Build>E665_CORE_BUNDLED_11160767_R1</Build>
<UsageData>MTMyOTgxNjM3LzE0NzUxOw**</UsageData>
<SellingStatus>
<ConvertedCurrentPrice currencyID="USD">10.0</ConvertedCurrentPrice>
<CurrentPrice currencyID="USD">10.0</CurrentPrice>
<HighBidder>
<UserID>testuser_ondras</UserID>
</HighBidder>
<MinimumToBid currencyID="USD">10.5</MinimumToBid>
</SellingStatus>
</PlaceOfferResponse>
V přı́padě chyby se v uzlu Ack vracı́ hodnota Failure a uzel Errors s jeho potomky
ShortMessage, LongMessage, ErrorCode, SeverityCode a ErrorClassification popisuje
detailně chybové hlášenı́.
<Ack>Failure</Ack>
<Errors>
<ShortMessage>Please specify a query!</ShortMessage>
<LongMessage>Please specify a query!</LongMessage>
<ErrorCode>10.1</ErrorCode>
<SeverityCode>Error</SeverityCode>
<ErrorClassification>RequestError</ErrorClassification>
</Errors>
Pro ucelenı́ poznatků o poslánı́ nabı́dky a průběhu komunikace cı́lového počı́tače s eBay
Trading API odkazuji[14] na referenčnı́ přı́ručku.
Kapitola 5
Testovánı́
Celou aplikaci bylo nutné pokrýt jednotkovými testy a testy grafického uživatelského
rozhranı́. Pouze s tı́m jsem se však nespokojil a vytvořil jsem dotaznı́k, který jsem společně
s programem rozeslal skupině1 lidı́ k testovánı́. Spektrum osob, které mou aplikaci testovalo,
jsem se snažil vybrat co nejširšı́. Od naprostých laiků, až po kolegy znalé softwarových
technologiı́, od mladšı́ch až po osoby střednı́ho věku. Tuto metodu testovánı́ jsem zvolil z
důvodu objektivnosti a různých nároků jednotlivých uživatelů a pak také proto, abych mohl
pružně reagovat na opravu chyb, dodělánı́ nedostatků apod.
5.1
Jednotkové testy
Jednotkové neboli unit testy pokrývajı́ bussiness logiku programu. Testovat bussiness
logiku eBay API je kontraproduktivnı́, poněvadž součástı́ zdrojů jsou Perf testy a Sanity
testy, které pokrývajı́ celé eBay API. Testoval jsem proto pouze vlastnı́ kód. Na přı́kladu
uvádı́m unit test šifrovánı́, kdy v proměnné encode je text, který se má zašifrovat a v
proměnné expectedCorrectResult je očekávaný text po zašifrovánı́. Na objektu třı́dy String
Encrypter se zavolá metoda encrypt(String), která má být tı́mto unit testem pokryta, a
které se předá jako parametr obsah proměnné encode, tedy text k zašifrovánı́. Zašifrovaný
text se uložı́ do proměnné encrypted, která se porovnává v metodě assertEquals(String,
String) na rovnost s proměnnou expectedCorrectResult, v nı́ž je očekávaný výsledek po
zašifrovánı́.
@Test
public void testEncrypt() {
StringEncrypter encrypter = new StringEncrypter();
String encode = "123456abcdEFGH";
String expectedCorrectResult = "RSoGc1TNhZlfUO5ZxcKI6g==";
String encrypted = encrypter.encrypt(encode);
assertEquals(encrypted, expectedCorrectResult);
}
1
Skupinou zde rozumı́m 10 testerů
25
26
KAPITOLA 5. TESTOVÁNÍ
Ukázka popisuje očekávaný výstup, ale dále se testujı́ chybové stavy, nepovolené, meznı́,
nedefinované, minimálnı́ a maximálnı́ hodnoty, prázdná a neúplná vstupnı́ data apod.
5.2
Testy grafického uživatelského rozhranı́
GUI testy, jak už z jejich zkratky vypovı́dá, testujı́ grafické uživatelské rozhranı́ programu.
K tomuto účelu je použit framework UISpec4J[9], který napomáhá testovánı́ GUI Java
aplikacı́ založených na Swingu2 .
5.2.1
Mockovánı́ objektů
Technika zvaná mockovánı́ objektů se snažı́ řešit závislost testovaného kódu na ostatnı́m
kódu tak, že závislost je nahrazována modelovými implementacemi tzv. mock objekty. Tyto
objekty jsou propojeny s testovaným kódem, a tak lze tento kód testovat tzv. zevnitř.
Nahrazenı́m závislosti mock objekty je zaručena izolovanost testu vůči ostatnı́mu kódu.
Ve třı́dě DialogGeteBayOfficialTimeCallMock se nacházı́ metoda geteBayOfficialTi
me(), která vracı́ instanci třı́dy typu Calendar. Instance tohoto objektu je právě mock
objektem, s kterým se potom dále pracuje.
public class DialogGeteBayOfficialTimeCallMock extends GeteBayOfficialTimeCall {
@Override
public Calendar geteBayOfficialTime() throws Exception {
return Calendar.getInstance();
}
}
V metodě testGeteBayOfficialTime() se testuje správné zobrazenı́ zı́skaných dat, v
tomto přı́padě oficiálnı́ho času eBay a výskyt komponent knihovny Swing. Jelikož oficiálnı́
čas eBay se neustále měnı́ a účelem nenı́ testovat, zda správně funguje zı́skávánı́ času ze
serveru eBay, je zde použit právě onen vytvořený mock objekt, tedy instance třı́dy Calendar.
Tı́m se docı́lı́ pouze testovánı́ GUI, což je v tomto přı́padě požadavkem. Vytvořı́ se objekt
mock, který je instancı́ třı́dy DialogGeteBayOfficialTimeCallMock. Na tomto objektu se
zavolá výše zmı́něná metoda geteBayOfficialTime(), jejı́ž návratová hodnota se uložı́ do
proměnné expected.
Framework UISpec4J je využit k testovánı́ výskytu grafických komponent Swingu. Testuje se, zda se na komponentě Panel vyskytuje komponenta TextBox, a komponenta Button
s daným názvem.
Komponentě TextBox se metodou setText(String) nastavı́ obsah proměnné expected,
což se projevı́ zobrazenı́m zı́skaného času (mock objektu) v dané komponentě. Potom se zavolá metoda getText(), která zı́ská zobrazený čas a uložı́ jej do proměnné showed. Proměnné
expected a showed porovnáme metodou assertEquals(String, String) na rovnost a tı́m
se zjistı́, zda čas, který byl předán komponentě TextBox se zobrazil správně.
2
Knihovna Swing poskytuje aplikačnı́ rozhranı́ pro tvorbu a obsluhu klasického grafického uživatelského
rozhranı́ na platformě Java.
5.3. PRAKTICKÉ TESTOVÁNÍ TESTERY
27
public void testGeteBayOfficialTime() throws Exception {
Frame frame = new Frame();
DialogGeteBayOfficialTime dE =
new DialogGeteBayOfficialTime(frame, null, true);
DialogGeteBayOfficialTimeCallMock mock =
new DialogGeteBayOfficialTimeCallMock();
String expected = mock.geteBayOfficialTime().toString();
Panel p = new Panel(dE);
TextBox t = p.getInputTextBox();
t.setText(expected);
Button b = p.getButton("GeteBayOfficialTime");
String showed = t.getText();
assertEquals(showed, expected);
}
5.3
Praktické testovánı́ testery
Za nejdůležitějšı́ považuji praktické otestovánı́ aplikace v reálném provozu. Proto jsem
svůj program uvolnil k veřejnému testovanı́. S cı́lem zı́skat co nejvı́ce relevantnı́ch dat a
informacı́, vytvořil jsem dotaznı́k, v němž bylo položeno následujı́cı́ch osm otázek:
1 Je instalačnı́ a uživatelský manuál srozumitelný?
2 Podařilo se Vám bez problémů spustit program?
3 Přihlásili jste se bez problému přes program na eBay?
4 Je grafické uživatelské prostředı́ přehledné a srozumitelné?
5 Funguje program správně? Pokud ne, co je špatně?
6 Nastal nějaký problém během testovánı́? Pád“ programu, zaseknutı́“ apod.?
”
”
7 Přihodil program finálnı́ částku ve správný čas?
8 Nezatěžovala aplikace přı́liš počı́tač?
V implementaci programu je použita vlastnı́ konfigurace pluginu Apache Log4J, který
sloužı́ k výpisu chybových (i jiných) hlášenı́ do souboru log4j.log. Vyžádal jsem si proto
tento soubor spolu s vyplněným dotaznı́kem od jednotlivých testerů, abych mohl přesně
identifikovat a opravit chyby.
28
KAPITOLA 5. TESTOVÁNÍ
5.3.1
Výsledky testovánı́
Výsledky jsem zpracoval do přehledného grafu:
Obrázek 5.1: Graf výsledků dotaznı́ku
U otázek 5 a 6 se vyskytly následujı́cı́ slovnı́ odpovědi (uvedu jen několik, protože se
opakovaly): Program vykonává něco“ na pozadı́ a uživatel nenı́ upozorněn. Po stisknutı́
”
tlačı́tka nastává dlouhá prodleva, než se objevı́ výsledek. Dlouhé čekánı́ na dokončenı́ operace.
Některé labely nejsou celé korektně zobrazeny. Upravit velikost textboxů na vkládánı́ údajů.
Pouze anglický jazyk. Chybı́ varovný dialog při uzavı́ranı́ celé aplikace.
Jak ukazujı́ výsledky, jednı́m z nedostatků je informovánı́ uživatele, že probı́há nějaká
výpočetnı́ činnost a že by měl být trpělivý. Z detailnějšı́ch dotazů jsem se dozvěděl, že někteřı́
testeři byli ochotni chvı́li čekat a následně okno zavřeli, poněvadž si mysleli, že nastala blı́že
nespecifikovaná chyba. Tento nedostatek jsem pružně opravil, viz 5.3.2. Dalšı́m z nedostatků,
které vyplynuly z dotaznı́ku, je pouze anglická lokalizace programu. Neuvědomil jsem si, že
někteřı́ uživatelé majı́ minimálnı́ nebo zcela žádný základ znalostı́ anglického jazyka. Opı́ral
jsem se o skutečnost, že znalost anglického jazyka je všeobecně považována za standart.
To byla chyba! Řešenı́ je nasnadě - vytvořit resource bundle[16] pro můj program 5.3.3.
Drobné nedostatky jako chybějı́cı́ varovný dialog při uzavı́ranı́ celé aplikace byly odstraněny
a nebudou v této kapitole popsány.
5.3.2
Čekacı́ dialogové okno
Vytvořil jsem nové dialogové okno, viz Obrázek 5.2, které se objevı́ pokaždé, kdy je
nutné čekat na dokončenı́ zpracovánı́ požadavků uživatele. Toto okno nelze násilně zavřı́t.
Tı́m je zaručeno, že uživatel neukončı́ právě probı́hajı́cı́ činnost a vědomě se dočká kýženého
výsledku.
V kódu se to potom projevilo vytvořenı́m nové třı́dy pojmenované Waiter.java. V
každé třı́dě, kde docházı́ ke komunikaci s internetovým serverem eBay a tı́m pádem k delšı́m
časovým prodlevám při zobrazenı́ výsledků, bylo nutné přidat tyto řádky kódu:
5.3. PRAKTICKÉ TESTOVÁNÍ TESTERY
29
Obrázek 5.2: Informačnı́ dialogové okno
void btnGetItem_actionPerformed(ActionEvent e) {
JDialog dialog = new Waiter(DialogGetItem.this);
Doer doer = new Doer(dialog);
new Thread(doer).start();
dialog.setVisible(true);
}
private class Doer implements Runnable {
private JDialog waiter;
public Doer(JDialog waiter) {
this.waiter = waiter;
}
public void run() {
.
.
Vytvořenı́ podtřı́dy v každé takové třı́dě mi umožnilo elegantně oddělit grafickou část
kódu a bussiness logiku, tak jak je to v aplikacı́ch vhodné a účelné. Podtřı́da se spouštı́ v
novém vlákně paralelně se zobrazeným čekacı́m“ dialogem.
”
5.3.3
Resource bundle
Správně napsaná aplikace by neměla obsahovat texty přı́mo v kódu. Proto je použita
třı́da Messages.java, která se stará o lokalizaci podle třı́dy ResourceBundle, konkrétně
metody getBundle(BUNDLE NAME).
public class Messages {
private static final String BUNDLE_NAME = "ebay.messages";
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
.getBundle(BUNDLE_NAME);
30
KAPITOLA 5. TESTOVÁNÍ
private Messages() {
}
public static String getString(String key) {
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return ’!’ + key + ’!’;
}
}
}
V kódu se pak odkazuje na texty jen pomocı́ klı́čů, a konkrétnı́ text se dohledává
podle specifikovaného Locale. Defaultnı́ Locale je nastaven na anglický jazyk. V souboru
messages.properties jsou uloženy všechny klı́če, které jsou pojmenovány podle třı́d, v
nichž se vyskytujı́, a hodnoty.
AboutBox.2=Copyright (c) 2010
AboutBox.3=based on eBay SDK
DialogSnipe.1=ItemID:
DialogSnipe.10=Current Price:
DialogSnipe.11=Buy It Now Price:
.
.
Součástı́ programu je pouze anglický jazyk. Rozšı́řenı́ o dalšı́ lokalizace je primitivnı́
záležitostı́, kdy stačı́ vytvořit nový soubor podle souboru messages.properties a pouze
přepsat hodnoty klı́čů do žádaného jazyku.
5.4
Funkčnost programu
Program pracuje bez omezenı́ v Sandbox verzi eBay. Aby byl plně funkčnı́3 i v produkčnı́
verzi eBay, musı́te administrátora eBay požádat emailem o povolenı́ aplikaci použı́vat, což
je podmı́něno sepsánı́m smlouvy a dalšı́ch náležitostı́. Každopádně se musı́te stát partnerem
eBay. Jinak se při přihozenı́ (ostatnı́ funkce programu nejsou omezeny) zobrazı́ dialogové
okno s chybou This call, or certain logic flows within the call, are restricted to specific
applications. Tato problematika je řešena i na oficiálnı́m fóru eBay, a proto uvádı́m odkaz[8],
kde se dočtete vı́ce, přı́padně přı́mo zde[15], kde jsou popsány detaily a podmı́nky.
5.5
Zhodnocenı́ testovánı́
Testovánı́ mi pomohlo odhalit chyby, či drobné nedostatky, které jsem v průběhu vývoje
postupně odstranil a umožnilo mi lépe pochopit svůj vlastnı́ kód. Současně přispělo k lepšı́mu
návrhu aplikace či přı́padnému refaktorovánı́ již implementovaného zdrojového kódu.
3
Tı́m mám na mysli, aby fungovalo přihozenı́.
Kapitola 6
Závěr
Implementovánı́m programu jsem splnil požadavky na jednoduchý přihazovacı́ program
na eBay. Jelikož jsem použil eBay API, bylo možné rozšı́řit funkčnost programu nad rámec
zadánı́ o vyhledávánı́ položek na eBay, zobrazenı́ a smazánı́ zpráv uživatele, zjištěnı́ informacı́
o uživateli a dalšı́. Implementoval jsem rovněž grafické uživatelské prostředı́. K automatickému ukládánı́ a načı́tánı́ přihlašovacı́ch údajů sloužı́ XML soubor, do kterého jsou data
z důvodu bezpečnosti šifrována. Všechny funkce jsou pokryty jednotkovými testy a grafické
uživatelské prostředı́ je otestováno s pomocı́ frameworku UISpec4J. Za výhodu považuji, že
je aplikace implementována na základě eBay API, tudı́ž při vydánı́ nové verze nenı́ nutné
modifikovat kód. Tı́m je program přizpůsoben změnám eBay.
Jako možné pokračovánı́ práce bych doporučil rozšı́řit funkčnost programu směrem od
”
uživatele k eBay“. Tı́m mám na mysli implementaci např. vytvořenı́ nové aukce, registrovánı́
na eBay, přidánı́ komentářů nebo obrázků k aukci apod. eBay API všechny zmı́něné funkce
podporuje a přı́mo se nabı́zı́ této podpory využı́t a implementovat kompletnı́ program pro
správu aukcı́ na eBay. Vzhledem k tomu, že mým úkolem bylo naprogramovat přihazovacı́
program, tak jsem data o aukcı́ch potřeboval pouze zı́skávat, a proto jsem se rozhodl implementovat dalšı́ funkce programu pouze směrem z eBay k uživateli“. Pomocı́ resource bundlu
”
lze lokalizovat program do vı́ce jazykových verzı́ tak, jak jsem na tuto skutečnost poukazoval
v kapitole testovánı́. Dále by bylo vhodné obohatit funkčnost programu o uloženı́ monitorovaných aukcı́ před vypnutı́m programu a jejich načtenı́ při startu programu.
31
32
KAPITOLA 6. ZÁVĚR
Literatura
[1] eBay Web Services Overview.
http://developer.ebay.com/products/overview, stav z 3. 5. 2010.
[2] Online aplikace pro nakupovánı́ přes eBay.
http://www.auctionsniper.com, stav z 5. 3. 2010,
http://www.esnipe.com, stav z 5. 3. 2010,
http://www.bidnapper.com, stav z 5. 3. 2010.
[3] Informace o nakupovánı́ na eBay.
http://www.ebayaukce.cz, stav ze 5. 3. 2010.
[4] eBay: Mezinárodnı́ obchodnı́ portál.
http://www.eim.ebay.cz, stav z 2. 4. 2010.
[5] eBay Developer Program homepage.
http://developer.ebay.com, stav z 5. 3. 2010.
[6] Oficiálnı́ stránky eBay.
http://www.ebay.com, stav z 5. 3. 2010.
[7] Rozšı́řenı́ do Mozilly Firefoxu.
https://addons.mozilla.org/en-US/firefox/addon/5202, stav z 5. 3. 2010,
https://addons.mozilla.org/en-US/firefox/addon/5571, stav z 5. 3. 2010.
[8] eBay Developers Forum.
http://dev-forums.ebay.com/thread.jspa?threadID=500005636&messageID=
500017584, stav z 11. 6. 2008.
[9] UISpec4J: Java/Swing GUI testing.
http://www.uispec4j.org, stav z 20. 5. 2010.
[10] JBidwatcher: eBay sniping, bidding & monitoring software.
http://www.jbidwatcher.com, stav z 20. 6. 2009.
[11] Oracle Sun Developer Network (SDN).
http://java.sun.com/javase/downloads/index.jsp, stav z 5. 3. 2010.
[12] Úvod do JSON.
http://www.json.org, stav z 3. 5. 2010.
33
34
LITERATURA
[13] Oficiálnı́ stránky Paypalu, MoneyBookers a BidPay.
https://www.paypal.com/cz, stav z 1. 5. 2009,
http://www.moneybookers.com/app/index.pl?l=CZ, stav z 1. 5. 2009,
http://www.authorize.net/bidpay, stav z 1. 5. 2009.
[14] PlaceOffer - referenčnı́ přı́ručka.
http://developer.ebay.com/devzone/xml/docs/reference/ebay/PlaceOffer.
html, stav z 20. 5. 2010.
[15] PlaceOffer Best Practices.
http://developer.ebay.com/DevZone/XML/docs/WebHelp/wwhelp/wwhimplcommon/
html/wwhelp.htm?context=eBay_XML_API&file=PlaceOfferCall-PlaceOffer_
Best_Practices.html, stav z 20. 5. 2010.
[16] Java Internationalization: Localization with ResourceBundles.
http://java.sun.com/developer/technicalArticles/Intl/ResourceBundles,
stav z 20. 5. 2010.
[17] REST: architektura pro webové API.
http://zdrojak.root.cz/clanky/rest-architektura-pro-webove-api,
3. 5. 2010.
stav
[18] ITBiz Sniffing: Odposlech datové komunikace.
http://www.itbiz.cz/sniffing-odposlech-datove-komunikace, stav z 6. 3. 2009.
[19] W3C: SOAP.
http://www.w3.org/TR/soap, stav z 3. 5. 2010.
[20] API Test Tool.
https://developer.ebay.com/DevZone/build-test/test-tool/Default.aspx,
stav z 20. 5. 2010.
z
Přı́loha A
Seznam použitých zkratek
API Application Programming Interface
ASCII American Standard Code for Information Interchange
CAPTCHA Completely Automated Public Turing test to tell Computers and Humans
Apart
CD Compact Disc
DOM Document Object Model
eIM eBay International Market
GUI Graphical User Interface
HTML HyperText Markup Language
HTTP Hypertext Transfer Protocol
HTTPS Hypertext Transfer Protocol
ID Identification
IDE Integrated Development Environment
IP Internet Protocol
JDK Java Development Kit
JRE Java Runtime Environment
JSON JavaScript Object Notation
PHP Hypertext Preprocessor
REST Representational State Transfer
SAX Simple API for XML
35
36
SDK Software Development Kit
SOAP Simple Object Access Protocol
URL Uniform Resource Locator
XML Extensible Markup Language
..
.
PŘÍLOHA A. SEZNAM POUŽITÝCH ZKRATEK
Přı́loha B
Instalačnı́ a uživatelská přı́ručka
Požadavky programu na hardware a software
Program ke svému běhu vyžaduje JRE[11], k vývoji JDK[11] ve verzi 1.6 update 3 nebo
vyššı́. Celý program pracuje jako celek a autentizuje se vůči eBay Trading Web Services.
Tudı́ž je zapotřebı́ mı́t registrovaný účet na eBay, ale také v eBay Developers Programu,
jejichž účty jsou vzájemně propojeny. Účet v eBay Developers Programu poskytuje DeveloperID, ApplicationID, CetrificateID a eBay token, jenž jsou při prvnı́m připojenı́ ověřovány.
Tyto údaje lze také plně využı́t pro připojenı́ do testovacı́ho prostředı́ eBay Developers Program Sandbox, kde je možné virtuálně spravovat svůj mini“ eBay tı́m, že registrujete fiktivnı́
”
prodávajı́cı́ a nakupujı́cı́.
Dalšı́m požadavkem je rozlišenı́ obrazovky - doporučuji alespoň 1024 x 768 - i když
program umožňuje změnu velikosti oken. Program nenı́ nijak náročný na hardware. Postačı́
běžný stolnı́ počı́tač či notebook. Aplikace vytvářı́ jen minimum nových souborů (pouze logy
do souboru), proto nejsou velké nároky na pamět’ový prostor na pevném disku - postačı́
20MB volného mı́sta. Nutnostı́ je stálé internetové připojenı́.
Prvnı́ spuštěnı́ programu
Nejdřı́ve je nutné mı́t nainstalované JDK a JRE. Na přiloženém CD v adresáři /data/java/
naleznete instalačnı́ soubory pro operačnı́ systémy Linux a Windows v 32 i 64 bitových
verzı́ch. Pokud potřebujete stáhnout jinou verzi JDK či JRE nebo zjistit vı́ce informacı́ o
instalaci, naleznete ji ke staženı́ zde[11]. V době psanı́ tohoto dokumentu byla aktuálnı́ verze
1.6 u20. V tomtéž adresáři se vyskytujı́ i licence, s kterými musı́te souhlasit, abyste mohli
JDK a JRE použı́vat.
V adresáři /data/jar program/ naleznete spustitelný jar archiv s programem - Ebay.jar,
soubor Config.xml, který obsahuje přihlašovacı́ údaje - URL k eBay. Pokud se tento soubor
v adresáři nevyskytne nebo je jeho obsah nesprávný, objevı́ se při spuštěnı́ varovné dialogové okno. Funkčnost programu však nijak neomezı́. Dále se v adresáři vyskytuje soubor
log4j.config, který sloužı́ k výpisům dat do souboru a taktéž nenı́ jeho existence nutná.
Po nainstalovánı́ prostředı́ Javy by mělo být možné program spustit podobně jako běžný
.exe soubor, tedy dvojitým kliknutı́m levého tlačı́tka myši. Nebo je možné program spustit v
37
38
PŘÍLOHA B. INSTALAČNÍ A UŽIVATELSKÁ PŘÍRUČKA
terminálu přı́kazem: java -jar /cesta k souboru/Ebay.jar. Pokud vše proběhlo bez chyb, mělo
by se Vám zobrazit následujı́cı́ okno, viz Obrázek B.1.
Obrázek B.1: Hlavnı́ okno přihazovacı́ho programu
Kliknutı́m na tlačı́tko Config Account se Vám zobrazı́ okno s nastavenı́m přihlašovacı́ch
údajů, viz Obrázek B.2. Nastavte přihlašovacı́ údaje dle bodu Možnosti nastavenı́ připojenı́
38. Program Vás na to upozornı́ v přı́padě, že budete chtı́t vyvolat nějakou funkci z nabı́dky
a nebudete je mı́t nastavené. Abyste nemuseli při každém spuštěnı́ programu zadávat znova a
znova veškeré přihlašovacı́ údaje, můžete tyto údaje uložit do XML souboru a to vyvolánı́m
nabı́dky File - Save Account (Obrázek B.3). Přihlašovacı́ údaje se zapisujı́ do souboru
šifrované, proto nenı́ vhodné vytvářet tento XML soubor ručně“. Při dalšı́m přihlášenı́ stačı́
”
jen vyvolat nabı́dku File - Load Account (Obrázek B.3) a veškeré údaje z Vámi vybraného
souboru se rozšifrujı́ a zapı́šı́ do programu.
Možnosti nastavenı́ připojenı́
Program umožňuje se připojit do produkčnı́ verze eBay a testovacı́ eBay Sandbox. Podle
toho se lišı́ i přihlašovacı́ údaje1 .
Pro eBay (produkčnı́ verze):
1
Je zřejmé, že při zadanı́ přihlašovacı́ch údajů pro produkčnı́ verzi eBay bude program pracovat pouze
s položkami v produkčnı́ verzi eBay, nikoliv však s položkami v sandbox verzi. To samé intuitivně platı́ při
zadánı́ přihlašovacı́ch údajů pro sandbox verzi eBay.
39
Obrázek B.2: Okno zobrazujı́cı́ přihlašovacı́ údaje do eBay
• DeveloperID: vaše DevID
• ApplicationID: vaše AppID
• Certificate: vaše CertID
• Token: váš User token
• EPS Server URL: https://api.ebay.com/ws/api.dll
• API Server URL: https://api.ebay.com/wsapi
• Sign-In URL: https://signin.ebay.com/ws/eBayISAPI.dll?SignIn
Pro eBay Sandbox (sandbox verze):
• DeveloperID: vaše DevID
• ApplicationID: vaše AppID
• Certificate: vaše CertID
40
PŘÍLOHA B. INSTALAČNÍ A UŽIVATELSKÁ PŘÍRUČKA
Obrázek B.3: Okno zobrazujı́cı́ uloženı́ nebo načtenı́ souboru
• Token: váš User token
• EPS Server URL: https://api.sandbox.ebay.com/ws/api.dll
• API Server URL: https://api.sandbox.ebay.com/wsapi
• Sign-In URL: https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?SignIn
Po vyplněnı́ přihlašovacı́ch údajů už můžete, kliknutı́m na přı́slušné tlačı́tko z nabı́dky,
vyvolat jednotlivé funkce, jenž zı́skávajı́ informace z eBay. Ve většině přı́padů je nutné zadat nejdřı́ve nějakou hodnotu jako např. item ID, text pro vyhledávánı́ apod2 . Pokud se
tak nestane, objevı́ se dialogové okno s varovánı́m. Ovládánı́ je jinak jednoduché a veskrze
intuitivnı́. Pro ukončenı́ aplikace klikněte na křı́žek nebo v menu File - Exit.
Popis funkce Snipe
Jak bylo zmı́něno výše, je nejdřı́ve nutné zadat item ID k dané položce na eBay (Obrázek
B.4). Poté program chvı́li pracuje - zobrazı́ informativnı́ okno, které záměrně nelze zavřı́t poté zobrazı́ zı́skané údaje o položce. Podle zadaného item ID aplikace zjistı́, jakého typu
je daná aukce a podle toho Vám zpřı́stupnı́ dalšı́ možnosti resp. tlačı́tka3 , co lze s danou
2
Pro názornost detailně popı́ši nı́že funkci Snipe
Názvy tlačı́tek korespondujı́ s názvy typů aukcı́ v anglické verzi eBay, tedy Buy It Now, Best Offer a pro
Chinese aukci je to tlačı́tko Snipe.
3
41
Obrázek B.4: Okno zobrazujı́cı́ přihazovacı́ menu
aukcı́ provést a nastavı́ také omezenı́ na finálnı́ cenu a kvantitu. Tedy pro Snipe musı́ být
nastavena výše finálnı́ částky většı́, než je ta současná, pro Buy It Now musı́ být nastavená
přesně Buy It Now Price částka zjištěná pro danou položku a v Best Offer je na Vás, jakou
částku nabı́dnete. Kvantita musı́ být vždy menšı́ nebo rovna kvantitě daného zbožı́ na eBay.
Tlačı́tkem Get IP se program pokusı́ zı́skat Vaši IP adresu, pokud se mu to nepodařı́, je
nutné, abyste ji zadali ručně.
Pokud jste vše nastavili správně, aplikace danou položku koupı́ za fixnı́ cenu, vytvořı́ nejlepšı́ nabı́dku a nebo přidá položku do seznamu monitorovaných položek, což se projevı́ zobrazenı́m nového okna (Obrázek B.5). V tomto okně lze ono monitorovánı́ sledovat, přı́padně
pokud se rozhodnete položku ze seznamu odebrat, označte ji a stiskněte klávesu delete. Pokud
byste chtěli změnit finálnı́ cenu přihozenı́ nebo počet kusů daného zbožı́ ke koupi, musı́te tuto
položku ze seznamu smazat a poté znova přidat jejı́ nové monitorovánı́. Chtěl bych upozor-
42
PŘÍLOHA B. INSTALAČNÍ A UŽIVATELSKÁ PŘÍRUČKA
nit na to, že všechna okna v celé aplikaci můžete bez problémů zavřı́t, aniž byste zrušili
probı́hajı́cı́ monitorovánı́ položek. Až ukončenı́m programu, tedy hlavnı́ho okna, přijdete o
všechny monitorované aukce, na což budete upozorněni dialogovým oknem. Proto program
jako takový musı́ běžet! Pokud byste chtěli jen zobrazit okno s právě probı́hajı́cı́m monitorovánı́m, vyvolejte z nabı́dky v hlavnı́m menu ViewSniffedItems. Pokud dojde k dočasné
ztrátě internetového spojenı́, program čeká, dokud nenı́ spojenı́ opět navázáno.
Obrázek B.5: Okno zobrazujı́cı́ tabulku monitorovaných položek
Důležité upozorněnı́: Program funguje bez omezenı́ v sandbox verzi eBay. Aby byl plně
funkčnı́4 i v produkčnı́ verzi eBay, musı́te administrátora eBay požádat emailem o povolenı́
aplikaci použı́vat, což je podmı́něno sepsánı́m smlouvy a dalšı́ch náležitostı́. Každopádně se
musı́te stát partnerem eBay. Jinak se při přihozenı́ (ostatnı́ funkce programu nejsou omezeny)
zobrazı́ dialogové okno s chybou This call, or certain logic flows within the call, are restricted
to specific applications. Tato problematika se řešila i na oficiálnı́m fóru eBay, a proto uvádı́m
odkaz[8], kde se dočtete vı́ce, přı́padně přı́mo zde[15], kde jsou popsány detaily a podmı́nky.
4
Tı́m mám na mysli, aby fungovalo přihozenı́.
Přı́loha C
Obsah přiloženého CD
Obrázek C.1: Seznam přiloženého CD
43

Podobné dokumenty