A legendária banda de rock’n'roll AC/DC irá pousar em solo brasileiro pela segunda vez em Novembro, para o que é considerado o show da década por aqui! Os ingressos para a única apresentação, vendidos pela Ticketmaster, se esgotaram em menos de 48 horas. Esse show será incrível!
Muita coisa aconteceu nessas 48 horas. O pessoal da Ticketmaster teve trabalho para manter o website no ar e, em razão da enorme carga, é possível que apenas poucos milhares de fãs tenham sido sortudos o bastante para comprar seus ingressos através da internet.
Além disso, a Ticketmaster admite que os e-mails de notificação podem não ser enviados, o que significa que não podemos depender deles para acompanhar nossos pedidos. Na verdade, eles até recomendam que seus clientes chequem os pedidos diariamente, na mão. Caramba…
Eu odeio fazer certas tarefas manualmente, especialmente as que podem ser automatizadas. Então, neste post eu mostrarei uma ferramenta escrita em Python que mostra a situação dos seus pedidos Ticketmaster na tela1, usando uma técnica conhecida como web scraping.
O código, que também está disponível no Github, pode ser visto abaixo:
#!/usr/bin/env python #-*- coding:utf-8 -*- import urllib import urllib2 import pynotify _BASE_URL = 'https://ticketing.ticketmaster.com.br' _LOGIN_URI = '%s/shwLogin.cfm' % _BASE_URL _ORDER_URI = '%s/shwCompraDetalhe.cfm?pedidoID=%%s' % _BASE_URL _ORDERS_LINK = '<a href="%s">More...</a>' % _LOGIN_URI _PRIORITY_LOW = pynotify.URGENCY_LOW _PRIORITY_NORMAL = pynotify.URGENCY_NORMAL _PRIORITY_CRITICAL = pynotify.URGENCY_CRITICAL _NOTIFICATION_TITLE = 'Ticketmaster Order %s' _STATUS_CODES = { 'Livre' : ('Not processed yet' , _PRIORITY_LOW), 'StdReserva' : ('Reserving your tickets' , _PRIORITY_NORMAL), 'StdCobranca': ('Charging your tickets' , _PRIORITY_NORMAL), 'VendaOk' : ('Billed' , _PRIORITY_CRITICAL), 'Recusada' : ('Rejected' , _PRIORITY_CRITICAL) } def initialize_notification_system(app_title): if not pynotify.init(app_title): import sys sys.exit(1) def display_message(title, message, priority=_PRIORITY_CRITICAL): message = pynotify.Notification(title, message) message.set_urgency(priority) message.show() def check_orders(email, password, order_ids): try: opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) login(opener, email, password) try: for order_id in order_ids: show_order_status(opener, order_id) except: title = _NOTIFICATION_TITLE % order_id display_message(title, 'Cannot check status') except: display_message('Ticketmaster', 'Login failed') def login(opener, email, password): params = urllib.urlencode({'email': email, 'senha': password}) response = opener.open('%s?tentaLogin=1' % _LOGIN_URI, params) # Invalid credentials check if response.read().find('senha incorreta') >= 0: raise Exception def show_order_status(opener, order_id): response = opener.open(_ORDER_URI % order_id) content = response.read() # Search for the order status codes for key, value in _STATUS_CODES.items(): if content.find(key) >= 0: title = _NOTIFICATION_TITLE % order_id message = '%s. %s' % (value[0], _ORDERS_LINK) display_message(title, message, value[1]) break else: display_message(_NOTIFICATION_TITLE % order_id, 'Status not found') def main(): initialize_notification_system("Ticketmaster Order Status") import optparse p = optparse.OptionParser() # Required command line options p.add_option('--email' , '-e', \ help='E-mail address used in your Ticketmaster credentials.') p.add_option('--password' , '-p', \ help='Password used in your Ticketmaster credentials.') p.add_option('--order-ids', '-o', \ help='Order IDs to be checked, separated by collons.') options = p.parse_args()[0] if not options.email or not options.password or not options.order_ids: p.print_help() else: order_ids = map(lambda s: s.strip(), options.order_ids.split(',')) check_orders(options.email, options.password, order_ids) if __name__ == '__main__': main()
A razão pela qual eu optei por web scrapping é porque a Ticketmaster não fornece uma API da mesma forma que o Flickr fornece, por exemplo. Ainda assim, o código é bastante simples.
Como você pode ver, ele primeiro envia uma requisição HTTP para a URI de login com o objetivo de validar as credenciais do usuário. Se a autenticação for bem sucedida, nosso opener receberá os cookies de sessão do servidor e os usará nas requisições seguintes, que buscam a situação de cada um dos pedidos informados.
Rodando o script agora:
Finalmente, inclua uma nova entrada no seu crontab para que o script rode sempre que necessário (ex: a cada 10 minutos):
*/10 * * * * python ticketmaster_order_status.py --email=seu@email.com --password=senha --order-ids=1234
Boa sorte e let there be rock!

Posts em Português
Posts in English
Pingback: Destaqueblog » Blog Archive » Python para S60: Trabalho em Andamento?
Pingback: Clojure Invade o Dev In Sampa | Destaqueblog