Trollie Wallie C64 disketti kiikarissa - eBay tehovalvontaan

Aiemmassa blogissani Yli 17 vuoden etsintä päättyi onnistumiseen mainitsin, että löysin viimeinkin Commodore 64 Blue Max UK diskettiversion, jota olin metsästänyt käsittämättömän pitkän ajan. Tuossa blogissa mainitsin myös, että etsin yhä edelleen Trollie Wallie diskettiversiota Commodore 64:lle. Uskon tehtävän olevan melkein mahdoton, mutta yrittänyttä ei laiteta.

Olen värkkäillyt Python-kielisen ohjelman ebaysearch, jonka avulla voi etsiä kohteita eBaystä automatisoidusti. Ohjelma on hyvin yksinkertainen, mutta elegantti. Sen sisään ei ole "kovakoodattu" mitään asetuksia, vaan se konfiguroidaan yksinkertaisella JSON-formaatissa olevalla tekstitiedostolla. Kirjoitin ohjelman Fedora Linux 27:ssä, mutta sen pitäisi toimia yhtä hyvin muissa Linuxeissa (esim. Debian ja Ubuntu), FreeBSD:ssä, NetBSD:ssä, OpenBSD:ssä, macOS:ssä ja OS X:ssä. Voi jopa olla, että se toimii Windowsissakin jos sinne saa SQLite3 tietokannan. En tiedä enkä välitä yhtään Windowista.

Ohjelmalle kerrotaan JSON-konfiguraatiotiedostossa seuraavat asetukset:

asetusarvo
ebay_app_idmerkkijono
ebay_siteslista merkkijonoja
ebay_search_keywordslista merkkijonoja
ebay_urls_dbfilemerkkijono
smtp_servermerkkijono
smtp_portmerkkijono
smtp_starttls_encryptionmerkkijono
smtp_authenticationmerkkijono
smtp_loginmerkkijono
smtp_passwordmerkkijono
email_sendermerkkijono
email_receivermerkkijono
email_subjectmerkkijono
email_person_namemerkkijono

Asetukset smtp_starttls_encryption ja smtp_authentication tulkitaan Boolen logiikan True tai False arvoiksi kun taas smtp_port muunnetaan lopulta numeroksi jossain Pythonin SMTP-sähköpostinlähetyskoodin syövereissä. Muut asetukset ovat arvoiltaan ihan merkkijonoja paitsi ebay_sites ja ebay_search_keywords, jotka ovat listoja, joissa on merkkijonoja.

Syy listojen käyttöön ebay_sites asetuksessa on yksinkertaisesti siinä, että haku halutaan usein kohdistaa vaikkapa kolmeen eri eBay-sivustoon: Saksa, UK ja USA. Niin ainakin minä haluan tehdä, sillä pelkkään USA:n sivustoon kohdistaminen ei useinkaan tuota kaikkia haluttuja tuloksia. Erityisesti Trollie Wallie peliä etsiessäni huomasin, että kasettiversioita on tarjolla neljä nimenomaan UK-sivustolla ja USA:n puolella vain yksi. Tämä selittyy sillä, että pelin julkaisi englantilainen pelifirma Interceptor Micros vuonna 1984 ja suurin osa pelin hankkineista on luultavasti ollut Englannissa tai ainakin Euroopassa. Ihmettelin ensin miksi eBayn www-sivujen kautta tehty manuaalinen haku tuotti tulokseksi viisi osumaa, mutta ohjelmani löysi vain yhden. Selitys oli siinä, että www-sivuston manuaalinen haku kohdistaa itsekseen hakuja eri maiden eBay-sivustoihin. Kun haku tehdään eBayn etsimisrajapinnan kautta ohjelmallisesti, pitää kohdesivustot luetella eksplisiittisesti itse!

Asetus ebay_search_keywords käyttää tietysti listaa sen takia, että hakuja voidaan haluta tehdä useilla erillisillä merkkijonojoukoilla.

Tällä hetkellä olen ajastanut ebaysearch ohjelmani etsimään "Trollie Wallie" merkkijonoa kolmesti tunnissa. Ohjelma ei ole ns. Unix-daemoni eli ohjelma ei pysy koko ajan ajossa taustalla. Se oli minulta ihan tietoinen suunnittelupäätös, sillä halusin pitää Python-koodin mahdollisimman yksinkertaisena. Ohjelma ei siis itse tajua ajastuksista yhtään mitään, vaan ajastuksen hoitaa Linuxissa crond-niminen serveriohjelmisto, jonka yksinomainen tehtävä on suorittaa tehtäviä ajastetusti. Näin siis kyseessä on selvä tehtävänjako kahden eri ohjelmistokomponentin välillä ja se heijastelee samalla sitä perinteistä Unix-filosofiaa: yksi ohjelma tekee yhden asian ja tekee sen kunnolla.

Olisin voinut yksinkertaistaa ohjelmaa vielä entisestäänkin. Nythän ebaysearch osaa itsenäisesti lähettää sähköpostiviestejä kun se raportoi uusista löydöistään. Koska ohjelmaa ajetaan crond:n kutsumana, olisin voinut vain tulostaa raportin stdout-virtaan, jolloin crond poimisi sen itselleen ja lähettäisi automaattisesti sähköpostitse. Halusin kuitenkin, että sähköpostitoiminnallisuus mahdollistaa ulkoisen SMTP-palvelimen käyttämisen. Jos olisin antanut crond:n hoitaa postituksen, Linuxissa pitäisi olla oma postinvälitysohjelma konfiguroituna laittamaan viestit eteenpäin. Nyt ebaysearch on vähän viisaampi ja se osaa esimerkiksi laittaa viestit Googlen postipalvelimien kautta autentikoitumalla kunhan asetukset smtp_server, smtp_port, smtp_starttls_encryption, smtp_authentication, smtp_login ja smtp_password on asetettu oikein.

Jos käyttää tuossa autentikoitua postinvälitystä, niin ei tietysti ole kovin eleganttia, että salasana on konfiguraatiotiedostossa selväkielisenä. Sen vuoksi onkin hyvä luoda joku feikkitunnus gmailiin ja käyttää sitä vain ebaysearch ohjelman käytössä. Näin ei ole väliä vaikka salasana pääsisi vuotamaan. Minä olen vielä eristänyt ohjelman kokonaan omaan Fedora Linux 27 virtuaalikoneeseensa, joka ei tee mitään muuta kuin toimii alustana ebaysearch ohjelman ajamiselle. Ohjelmassani ei ole tietoturvareikiä, mutta se käyttää Pythonin ohjelmakirjastoja ja esimerkiksi ebaysdk-kirjasto tuli pip3-ohjelman kautta eikä Fedora Linux 27:n omista pakettivarastoista. Varmuuden vuoksi siis ajattelin, että olkoon koko hökötys omassa virtuaalikoneessaan eristettynä.

Ohjelman virheenkäsittely ei ole ihan täydellistä, mutta julkaisin sen silti muidenkin käyttöön. Ohjelman voit imuroida ohjelmointisivuiltani:


Automated eBay searching using ebaysearch script


Ohjelmassa on myös yksi pieni bugi tai se voi olla myös feature, riippuen katsantokannasta. Kun ebaysearch tallentaa SQLite-tietokantaan tietoa löytämistään kohteista, se tallentaa kantaan eBayn URL:in eli linkin kohteeseen. Olen havainnut, että mikäli myyjä muuttaa myymänsä kohteen kuvauksen otsikkoa, eBayn käyttämä URL vaihtuu vaikka kohde pysyy samana. Näin ebaysearch löytää uusilla hakukerroilla saman kohteen uudelleen mikäli sen otsikkoa on menty muuttamaan. Tämä ongelma olisi helppoa korjata tallentamalla tietokantaan URL:in sijasta kohteen uniikki id-numero. Se ei käsittääkseni vaihdu ollenkaan.

Katsoin kuitenkin muutoksen olevan tarpeeton, sillä henkilökohtaisesti vastaanotan ihan mielelläni uusia raportteja jos kohteiden kuvauksen otsikko vaihtuu. Muutos voi olla oleellinen tieto parempaankin suuntaan, jolloin aiemmin nähty, sivuutettu kohde voikin muuttua kiinnostavammaksi. Vastaavasti jos kohteen kuvauksessa todetaan, että vaikka kelanauhassa onkin testauksen jälkeen ilmennyt vikoja, niin sekin tieto voi olla arvokas. Sen vuoksi pidin edelleen sen linjan, että tietokannassa saa olla URL:eja.