Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Telefonszámok kezelése

Telefonszámok kezelése

Sokszor van szükség telefonszámok kezelésére, amelyek különböző adatforrásokból, vagy CRM rendszerekből érkeznek. Hogy tároljuk ezeket és hogyan ellenőrizetjük ezeket egyszerűen Python-al.

Bence Faludi

October 03, 2012
Tweet

More Decks by Bence Faludi

Other Decks in Technology

Transcript

  1. Miért is beszélünk erről? „Mi ebben a nehéz? Csak kiteszünk

    a felületre egy (szám) mezőt és készen vagyunk.” Nem egészen!!! Elsőre tűnik csak triviálisnak, de hamar rájövünk hogy nem ennyire egyszerű. Gondoljuk át hogy mire használjuk, és mi a célunk vele, és csak utána fejlesszünk.
  2. Változó világ • Okostelefonok száma a világ minden pontján nagyon

    gyorsan növekszik. • USA-ban okostelefonok aránya az összes mobil telefonhoz viszonyítva: – 2008. január: 10% 2011. január: 40% – 2009. január: 16% 2012. január: 48% – 2010. január: 24% jelenleg: >50% • A fejlődő országokban a mobil telefonok több mint fele immáron internet képes. Ezek a készülékek mindig velünk vannak.
  3. Változó világ Mobil telefonok térnyerésével 1. Böngésző háború erősödik, terjed

    a HTML5, és CSS3 támogatása. 2. Felhasználók érzékenyebbek a felületekre (UI), és a felhasználói élményre (UX). 1. Egyaránt működő megoldások desktop-on és mobil-on. 2. Jobban elmosódnak az országhatárok a mobilitásnak köszönhetően. 3. Egyre több szolgáltatás követeli meg telefonszámok megadását, megjelenítését. 3. Direkt marketing kampányok átalakulnak, az eDM új virágkorát éli Telemarketing és Mobil marketing kampányokkal kiegészítve. Piaccal lépést kell tartani, a régi módszerek már kevesek!
  4. 1,) Böngésző háború • Gyorsabb frissítési ciklus. • Ön-frissítő böngészők

    (Mozilla Firefox, Google Chrome) • WebKit dominanciája a mobil (85%*) és desktop (48%**) piacon (Google Chrome, Apple Safari) • A HTML5 és CSS3 funkciók gyors implementálása. • Folyamatosan gyorsuló JavaScript feldolgozók. Egyre kevesebb a régi böngészők aránya, és több nagy vállalat már visszamenőleg csak az utolsó két böngésző verziót támogatja fejlesztéseiknél. (pl.: Google***) * http://www.netmarketshare.com/browser-market-share.aspx?qprid=1&qpcustomb=1 ** http://www.w3schools.com/browsers/browsers_stats.asp *** http://googleenterprise.blogspot.hu/2011/06/our-plans-to-support-modern-browsers.html
  5. 2,) Felhasználók érzékenyek UI, UX-ra • Minden legyen logikus, egyszerű,

    természetes. Soha ne kínáljunk olyan felületet, ahol akár egy pillanatra elbizonytalanodik a felhasználó. – Felhasználók saját maguk tagolják a telefonszámaikat az alapján, ahogy számukra legkönnyebb megjegyezni. Soha ne korlátozzuk őket egy konkrét formátumra, és mindig engedélyezzük a speciális karakterek és a vágólap használatát. (pl.: 06 (30) 1234-387-et könnyebb megjegyezni, mint +36 30 123 4387-et) * – Soha ne korlátozzuk a telefonszámot egy országra, az emberek mobilisak, és semmi nem garantálja hogy nem külföldi veszi igénybe a szolgáltatást, vagy csak külföldi telefonja van.** – Ne vezessük félre, vagy tegyük egyértelművé, hogy hova mit írhat, vagy adjunk számára példát. *** * Nagyobb eséllyel hibázik a telefonszám megadásakor, és nehezebben ellenőrzi. ** Hamis telefonszámot fog megadni, mivel nem adunk lehetőséget. *** Rossz formátumú telefonszámot ad meg, ami inkonzisztenciát okoz az adatbázisban konvertálás nélkül.
  6. 2,) Felhasználók érzékenyek UI, UX-ra Inspirálhat Így inkább ne csináljuk

    Korlátozott formátum, Csak szám karakterek, Vágólap nem működik, … Bizonytalanság: “+36”, “06” vagy “0036”-al kezdjem? Beüthetek egyáltalán “+”-ot, vagy csak szám szerepelhet? ”0”-val kezdődhet, vagy levágják, sőt “06”-ról tudják majd hogy mi, ha az az oldal nyelve angol, de a cég magyar? mentés után facebook.com gmail.com
  7. 2,) Felhasználók érzékenyek UI, UX-ra Nézzük meg az előbbi megoldást

    a Google-től. és a HTML5 kódot*: <input type="tel" tabindex="0" name="RecoveryPhoneNumber" id="RecoveryPhoneNumber" value="”> * iOS-en és Android-on a telefonszám tárcsázó billentyűzet jelenik meg, ez által a felület mobil kompatibilis is.
  8. 2,) Felhasználók érzékenyek UI, UX-ra Honlap felületeken megjelenő telefonszámok formázása

    minden esetben az adott ország hivatalos nemzetközi formázásával egyezzen meg! • Ezt felismerik az okostelefonok, így közvetlen hívás is kezdeményezhető a honlapról. • Felhasználók ismerik a saját formázásukat, nem lesz idegen számukra, és egységessé teszik a megjelenő adatokat. import phonenumbers pn = phonenumbers.parse( '301234655', 'HU' ) print phonenumbers.format_number( pn, phonenumbers.PhoneNumberFormat.INTERNATIONAL ) # +36 30 123 4655 Lehetőség van telefonszámok nemzetközi, helyi, és E164 formázására, és parse- olására függetlenül a telefonszámban szereplő karakterektől. Ország átadása nélkül megpróbálja behatárolni az országot, azonban UI és UX szempontok alapján ezt a felületről érdemes bekérni.
  9. 3,) Telefonos direkt marketing “A direkt marketing a nem-bolti kiskereskedelem

    illetve az értékesítés-ösztönzés fontos formája. Valamely reklámeszköz felhasználásával a megcélzott személyekkel történő közvetlen (direkt) kapcsolatfelvételre és (marketing)kommunikációra törekszik.” – Wikipédia Sok formája ismert, korábban a levélcsomag, telemarketing és az email marketing volt a legjelentősebb. Új kategóriaként jelent meg a mobil marketing. Utóbbi formái: • SMS: Marketing kommuniációs üzenet SMS-ben kerül kiküldésre az ügyfél mobiltelefonjára. • MMS: Az üzenetek képeket, videókat, hangokat tartalmazhatnak kommunikáció gyanánt. • Mobil alkalmazások: Okostelefonok alkalmazásai számos típusú üzenetet támogatnak. (pl.: Push Notifications, Rich Push Notifications, Interactive Ads) • Helyszíni marketing: Üzenetek közvetlenül az ügyfél mobiltelefonjára küldődnek megadott helszíneken. • QR kód: 2D-s bárkód amely pl. speciális kedvezményeket, termék adatokat tartalmazhat kódolt URL formájában.
  10. 3,) Telefonos direkt marketing Telemarketing és Mobil marketing kampányok fontosak

    az ügyfelek számára, ezért fontos hogy minimalizáljuk a hibás és rossz formátumú telefonszámokat. Számokat továbbá szét kell választani országkód, és vezetékes- vagy mobiltelefonszám alapján. Utóbbira a felhasználókat ne kérjük meg, túl sok hibás adathoz vezet. SMS kampányoknál a fizetés legtöbbször feladás alapján történik, felesleges költségek csökkentéseként, igyekezni kell a nem valós számokat megjelölni, és a jövőben telefonszám ellenőrzéskor kizárni őket. (pl.: +36 30 111 1111) Adatbázisban E164 formátumban érdemes a számokat tárolni!
  11. Tehát mit is csinálunk? 1. Felületet adunk a telefonszám kitöltésére.

    1. Kiválasztja a felületről a nemzetközi hívószámot (pl.: “Magyarország (+36)”) 2. Beüti, vagy bemásolja tetszőleges formátumban a telefonszámot. (pl.: “(20) 123- 45/67” 2. Űrlap küldéskor konvertálunk és ellenőrzünk. 1. Normalizáljuk a telefonszámot E164-re. 2. Ellenőrizzük, hogy megfelelő hosszú és létező körzetszámmal rendelkezik. 3. Besoroljuk, hogy vezetékes- vagy mobiltelefonszám. 4. Ellenőrizzük, hogy nem szerepel-e már az adatbázisban elutasított státusszal. 5. Hiba esetén visszajelzünk a felületnek, különben eltároljuk. 3. Tároljuk adatbázisban. 1. A E164 formátumban tároljuk direkt marketing kiküldések és felületi megjelenítés miatt. 2. Tároljuk a besorolás típusát (vezetékes, mobil, …) 3. Tároljuk, hogy ellenőrzött vagy elutasított telefonszámról van-e szó.
  12. Tehát mit is csinálunk? 4. Tároljuk az ország hívó kódot

    (akár FK, akár VARCHAR-ként). 5. Minden telefonszámot külön rekordként tárolunk, és FK-vel kötjük a megfelelő felhasználóhoz. 4. Felületen formázottan jelenítjük meg 1. Felületen hivatalos nemzetközi formátumra formázzuk a tárolt számokat. 5. Telemarketing és mobil marketing kampánynál ellenőrzünk 1. Ha a telefonszámra nem tudunk SMS-t küldeni, vagy hívást kezdeményezni elutasítottnak kell jelölni a rekordot. 2. Sikeres megkeresés esetén ellenőrzött-nek kell jelölni a rekordot. 3. Kiküldéseket elutasított címekre soha sem szabad kezdeményezni. 4. Űrlap kitöltéskor és tároláskor nem szabad sem már elutasított telefonszámú személyt felvenni. 5. Kiküldéskor csak aktív elemekre szabad a kiküldést elvégezni.
  13. Mi kell hozzá? Java, C++ alapú csomagot készített a Google,

    amely feldolgoz, formáz, tárol és ellenőriz nemzetközi telefonszámokat. Java csomagot az Android framework-ben is használják a 4.0-ás (Ice Cream Sandwich) verzió óta. Neve: libphonenumber 2011. közepe óta elérhető portolása Python nyelvben. https://github.com/daviddrysdale/python-phonenumbers Azóta sok javításon esett át, és már alkalmazás fejlesztések alapjául is szolgálhat!
  14. python-phonenumbers • Feldolgozása, formázása, ellenőrzése telefonszámoknak világszerte minden országban. •

    Telefonszámok típusának meghatározása (Mobil, Vezetékes, Prémium díjas, VoIP, …) • Két telefonszám összehasonlítása. • Példa telefonszám kérése, akár típus alapján. • Telefonszám ellenőrzése régió, hossz, körzet alapján. • Telefonszám formázása gépelés közben. • Telefonszámok keresése szövegben. • Telefonszám körzetek helyeinek meghatározása.
  15. 1,) Felületet adunk a kitöltésre import phonenumbers from babel import

    Locale locale, regions = Locale( 'HU' ), [] for territory in phonenumbers.SUPPORTED_REGIONS: if territory not in locale.territories: continue regions.append({ 'text': '%(territory)s (+%(ccode)d)' % { 'territory': locale.territories[ territory ], 'ccode': phonenumbers.country_code_for_valid_region( territory ) }, 'value': territory }) regions.sort( lambda x,y: cmp( x['text'], y['text'] ) ) <label for="mobilephone">Mobile phone:</label> <select name="mobilephone_region"> {% for region in regions %} <option value="{{ region.value }}">{{ region.text }}</option> {% endfor %} </select> <input type="tel" name="mobilephone_number" id="mobilephone" />
  16. 2,) Űrlap küldéskor konv. és ellenőrzés import phonenumbers mobilephone_number =

    '201234447' mobilephone_region = 'HU' # Telefonszam parsolasa mp_prototype = phonenumbers.parse( mobilephone_number.strip(), mobilephone_region ) # Nem valos formatumu, es regiokodu telefonszam eseten jelzunk if not phonenumbers.is_valid_number( mp_prototype ): raise ValueError('Not valid mobile phone') # Lekerdezzuk a telefonszam besorolasat phone_type = phonenumbers.number_type( mp_prototype ) # Nem mobil szam esete jelzunk if phone_type != phonenumbers.PhoneNumberType.MOBILE: raise ValueError('Not mobile number!') # Normalizaljuk, E164-re konvertalunk normalized_mobilephone = phonenumbers.format_number( mp_prototype, phonenumbers.PhoneNumberFormat.E164 ) print phone_type, normalized_mobilephone
  17. 3,) Tároljuk adatbázisban Oszlop neve Típusa Megjegyzés id INT4 Elsődleges

    kulcs, szekvencia user_id INT4 Idegen kulcs, amely egy felhasználó elsődleges kulcsára hivatkozik territory VARCHAR(3) Régió neve, pl.: HU, FR e164 VARCHAR(15) E164 formátumú, normalizált telefonszám type INT4 Telefonszám típusa, number_type függvény visszatérési értéke. validated BOOL Sikeres üzenet küldés esetén TRUE, sikertelen esetén FALSE. Amíg nem történt kiküldés alapértelmezetten NULL. active BOOL Telefonszám aktív állapotú-e. Alapértelmezetten TRUE értékkel hozzuk létre. date_of_validation TIMESTAMP Ellenőrzés utolsó ideje. Minden üzenet küldéskor frissül. Telefonszámokat érdemes külön táblában tárolni, előzményként. Régi telefonszámokat nem töröljük, csak az active állapotukat módosítjuk.
  18. 3,) Tároljuk adatbázisban • Nem engedünk már aktív állapottal szereplő

    telefonszámmal regisztrálni felhasználókat az oldalra, így elkerülhető a telefonszám duplikáció. • Nem engedünk elutasított telefonszámmal rendelkező felhasználókat az oldalra regisztrálni, így kordában tartható a rossz számok aránya. • Ha egy telefonszám ellenőrzésének dátuma kellően rég, levesszük az elutasított (pl.: 1 év) és ellenőrzött (pl.: 0,5 év) állapotát. • Az E164 mezőben egységes formában tároljuk így a telefonszámokat, konzisztens adatszerkezetet hozunk ez által létre. • A Territory, Type, Validated oszlopokat másodlagos indexekkel kell ellátni. • Egy felhasználóhoz lehetőségünk van több telefonszámot kezelni, de korlátozhatjuk akár típus alapján is (pl.: 1 vezetékes, 1 mobil szám). • Nem aktív telefonszámok kezelésével, és az azokhoz tartozó ellenőrzés állapotának tárolásával pontosabb eredményeink vannak hibás (nem létező) telefonszámok regisztrációjának megakadályozásához. (pl.: +36 30 111 1111)
  19. 4,) Felületen formázottan mutatjuk import phonenumbers # Ilyen telefonszam adatok

    lesznek az adatbazisban tarolva (E164) phonenumbers_lst = [{ 'phonenumber': phonenumbers.format_number( phonenumbers.example_number( territory ), phonenumbers.PhoneNumberFormat.E164 ), 'territory': territory } for territory in phonenumbers.SUPPORTED_REGIONS ] # Ha feluleten meg kell jeleniteni for phonenumber in phonenumbers_lst: print phonenumbers.format_number( phonenumbers.parse( phonenumber['phonenumber'], phonenumber['territory'] ), phonenumbers.PhoneNumberFormat.INTERNATIONAL ) Példa formázásokra.: +1 340-642-1234, +354 410 1234, +98 21 2345 6789, +374 10 123456, +39 02 1234 5678, +84 210 1234 567, +599 545 1234
  20. 5,) Kampánynál ellenőrzünk • Adatbázisból könnyen letudjuk válogatni, hogy melyik

    ország milyen csatornájára szeretnénk üzenetet küldeni. (pl.: Magyar Mobil) • Leválogatásnál csak az aktív, nem elutasított (NULL, vagy TRUE értékű) telefonszámokat szabad figyelembe venni. • Sikeres üzenet küldésnél ellenőrzött státuszt kap, sikertelen küldésnél elutasítottat. Mentjük az ellenőrzés idejét is adatbázisba. De miért is kell ilyen szigorúnak lennünk?