#!/usr/bin/perl -w =pod =head1 Nome e versa~o ad - Ajustes Directos - 0.1.0 =head1 Autor Rui Miguel Silva Seabra =head1 Como usar De momento, apenas correr na consola: ./ad.pl NUMPAG em que NUM e' o numero de pagina =head1 Descric,a~o O site para os Contractos Pu'blicos Online, Base, http://www.base.gov.pt/ na~o tem um mecanismo adequado de pesquisa, feeds RSS, completas ou por keywords. O objectivo deste programa e' vir a providenciar uma forma externa de facilitar esse tipo de dados u'teis. =head1 Estado Actual De momento, apenas interpreta a primeira pa'gina dos ajustes directos, e cada Ajuste Directo nela contido. =head1 Problemas Conhecidos Ainda na~o percebi como mudar de pa'gina. =head1 Licenc,a (PORTUGUE^S) Este programa e' software livre: pode ser redistribui'do e/ou modificado sob os termos da GNU General Public License tal como publicado pela Free Software Foundation, seja na versa~o 3 da Licenc,a ou (`a sua escolha) uma outra qualquer versa~o mais recente. Este programa e' distribui'do com a esperanc,a que seja u'til mas SEM QUALQUER GARANTIA; nem sequer a garantia impli'cita de MERCANTILIZAC,A~O ou ADEQUAC,A~O PARA UM DETERMINADO PROPO'SITO. Veja a GNU General Public License para mais mais detalhes. Devera' ter recebido uma co'pia da GNU General Public License junto com este programa. Sena~o, veja em . (ENGLISH) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . =cut my $DEBUG=1; my %AD = (); use LWP; use HTTP::Cookies; use utf8; # este valor é substituido no CONTENT do POST $PAGE=$ARGV[0]; # separador de resultados $SEP='#'; $ua = LWP::UserAgent->new(); $ua->agent("AjustesDirecotr/0.1"); my $req = new HTTP::Request POST => 'http://www.base.gov.pt/_layouts/ccp/AjusteDirecto/List.aspx'; $req -> content_type ('application/x-www-form-urlencoded'); $req -> content("__SPSCEditMenu=true&MSOWebPartPage_PostbackSource=&MSOTlPn_SelectedWpId=&MSOTlPn_View=0&MSOTlPn_ShowSettings=False&MSOGallery_SelectedLibrary=&MSOGallery_FilterString=&MSOTlPn_Button=none&MSOAuthoringConsole_FormContext=&MSOAC_EditDuringWorkflow=&MSOSPWebPartManager_DisplayModeName=Browse&__EVENTTARGET=&__EVENTARGUMENT=&MSOWebPartPage_Shared=&MSOLayout_LayoutChanges=&MSOLayout_InDesignMode=&MSOSPWebPartManager_OldDisplayModeName=Browse&MSOSPWebPartManager_StartWebPartEditingName=false&__VIEWSTATE=%2FwEPDwUJOTcxNjYwNzIxD2QWAmYPZBYCAg0PZBYIAgEPZBYCAgIPDxYEHgRUZXh0BQ9JbmljaWFyIHNlc3PDo28eB1Zpc2libGVnFgIeBXN0eWxlBQ5kaXNwbGF5OmJsb2NrO2QCAw9kFgICAQ8WAh8BaBYCZg9kFgQCAg9kFgYCAQ8WAh8BaGQCAw8WAh8BaGQCBQ8WAh8BaGQCAw8PFgIeCUFjY2Vzc0tleQUBL2RkAgcPZBYCAgEPDxYCHwFoZBYEAgEPDxYCHwFoZGQCAw8PFgIfAWhkFgICAQ8PFgIfAWdkFgQCAQ8PFgIfAWdkFhwCAQ8PFgIfAWdkZAIDDxYCHwFnZAIFDw8WAh8BZ2RkAgcPFgIfAWdkAgkPDxYCHwFnZGQCCw8PFgIfAWdkZAINDw8WAh8BZ2RkAg8PDxYEHgdFbmFibGVkZx8BZ2RkAhEPDxYCHwFnZGQCEw8PFgQfBGcfAWdkZAIVDw8WAh8BZ2RkAhcPFgIfAWdkAhkPFgIfAWdkAhsPDxYCHwFnZGQCAw8PFgIfAWdkFgYCAQ8PFgIfAWdkZAIDDw8WAh8BZ2RkAgUPDxYCHwFnZGQCCQ9kFgYCBQ8PFgIfAAUBMmRkAgcPDxYCHwAFBWRlIDM2ZGQCEQ88KwAJAQAPFgYeDVJlcGVhdENvbHVtbnMCAR4IRGF0YUtleXMWAB4LXyFJdGVtQ291bnQCPGQWeGYPZBYCZg8VAwMyMjYSQXJzZW5hbCBkbyBBbGZlaXRlIlJlYm9iaW5hZ2VtIGRlIHVtIG1vdG9yIGVsw6ljdHJpY29kAgEPZBYCZg8VAwQxMTE3OEFTQUUg4oCTIEFVVE9SSURBREUgREUgU0VHVVJBTsOHQSBBTElNRU5UQVIgRSBFQ09Ow5NNSUNBeUFRVUlTScOHw4NPIERFIEVTVEFNUElMSEFTIEZJU0NBSVMgUEFSQSBCRUJJREFTIEVTUElSSVRVT1NBUzogTW9kZWxvIEExIDEuOTY4LjAwMDsgTW9kZWxvIEEyIDI0MC4wMDA7IE1vZGVsbyBCMCAzLjAwMC4wMDBkAgIPZBYCZg8VAwM3MDM4QVNBRSDigJMgQVVUT1JJREFERSBERSBTRUdVUkFOw4dBIEFMSU1FTlRBUiBFIEVDT07Dk01JQ0FMQVFVSVNJw4fDg08gREUgMyBBUkNBUyBDT05HRUxBRE9SQVMgVkVSVElDQUlTIFBBUkEgQVJNQVpFTkFNRU5UTyBERSBBTU9TVFJBU2QCAw9kFgJmDxUDAzcwNDhBU0FFIOKAkyBBVVRPUklEQURFIERFIFNFR1VSQU7Dh0EgQUxJTUVOVEFSIEUgRUNPTsOTTUlDQTxBUVVJU0nDh8ODTyBERSAyNiBURVJNw5NNRVRST1MgQ09NIFNPTkRBUyBQQVJBIEFMSU1FTlRBw4fDg09kAgQPZBYCZg8VAwQxMzY3GEFzc2VtYmxlaWEgZGEgUmVww7pibGljYZoBRW5jZW5hw6fDo28gZGUgcGXDp2EgZGUgdGVhdHJvIGludGl0dWxhZGEg4oCcQSBDYXNhIGRhcyBsdXplcyAtIGRhIEbDqSDDoCBSYXrDo2%2FigJ0sIGEgYXByZXNlbnRhciBubyDDom1iaXRvIGRhcyBKb3JuYWRhcyBFdXJvcGVpYXMgZG8gUGF0cmltw7NuaW8gZGUgMjAwOGQCBQ9kFgJmDxUDBDExNzEYQXNzZW1ibGVpYSBkYSBSZXDDumJsaWNhPVByb2R1w6fDo28gZGUgNzUwIGV4ZW1wbGFyZXMgZG8gbGl2cm8g4oCcR3VlcnJhIFBlbmluc3VsYXLigJ1kAgYPZBYCZg8VAwMxMTEYQXNzZW1ibGVpYSBkYSBSZXDDumJsaWNhcVJlbW%2FDp8OjbyBkZSBkdWFzIHVuaWRhZGVzIGRlIGNsaW1hdGl6YcOnw6NvIG5vIEdhYmluZXRlIGRvIERyLiBNb3RhIEFtYXJhbCAtIEFuZGFyIE5vYnJlIGRvIFBhbMOhY2lvIGRlIFMuIEJlbnRvZAIHD2QWAmYPFQMDMTAyGEFzc2VtYmxlaWEgZGEgUmVww7pibGljYWBQcm9qZWN0byBkZSBSZWZvcsOnbyBTw61zbWljbyBkYSBTYWxhIGRvIFNlbmFkbyBlIGRhIFNhbGEgZGFzIFNlc3PDtWVzIGRvIFBhbMOhY2lvIGRlIFPDo28gQmVudG9kAggPZBYCZg8VAwIyMjdBc3NlbWJsZWlhIExlZ2lzbGF0aXZhIGRhIFJlZ2nDo28gQXV0w7Nub21hIGRvcyBBw6dvcmVzXEZvcm5lY2ltZW50byBkZSB1bSBqYW50YXIg4oCcY29ja3RhaWwgQnVmZmV04oCdIHBhcmEgY2VyY2EgZGUgMjIwIHBlc3NvYXMsIG5vIGRpYSAxMS0wOC0yMDA4ZAIJD2QWAmYPFQMEMjA2NjJBc3NvY2lhw6fDo28gZGUgTXVuaWPDrXBpb3MgZGEgUmVnacOjbyBkZSBTZXTDumJhbFZBcXVpc2nDp8OjbyBkZSBzZXJ2acOnb3MgcGFyYSBhY29tcGFuaGFtZW50byBkbyBwcm9jZXNzbyBkZSBkZXNlbnZvbHZpbWVudG8gZG8gUEVERVBFU2QCCg9kFgJmDxUDBDIwNjcyQXNzb2NpYcOnw6NvIGRlIE11bmljw61waW9zIGRhIFJlZ2nDo28gZGUgU2V0w7piYWyNAUFxdWlzacOnw6NvIGRlIHNlcnZpw6dvcyBwYXJhIGNvbmNlcMOnw6NvIGUgZGVzaWduIGRlIHN0YW5kIGl0aW5lcmFudGUgcGFyYSB2ZWljdWxvIGNvbSBjYWl4YSB2ZXJzdXMgY2FyIGUgcHJvZHXDp8OjbyBkZSBtYXRlcmlhaXMgZGUgc3Vwb3J0ZWQCCw9kFgJmDxUDAzYxNDJBc3NvY2lhw6fDo28gZGUgTXVuaWPDrXBpb3MgZGEgUmVnacOjbyBkZSBTZXTDumJhbHFGb3JuZWNpbWVudG8gZSBtb250YWdlbSBkZSBjYWl4YSB2ZXJzdXMgY2FyIGNvbSBpbnRlcmlvciBwcmVwYXJhZG8gcGFyYSBzdGFuZCBpdGluZXJhbnRlIGV4dGVuc8OtdmVsIGRlIDMwIGEgNDBtMmQCDA9kFgJmDxUDAzEwMDJBc3NvY2lhw6fDo28gZGUgTXVuaWPDrXBpb3MgZGEgUmVnacOjbyBkZSBTZXTDumJhbGFBcXVpc2nDp8OjbyBkZSBzZXJ2acOnb3MgZGUgcGVxdWVuYSByZXBhcmHDp8OjbyBlIGNvbnNlcnZhw6fDo28gZGFzIGluc3RhbGHDp8O1ZXMgZGEgU2VkZSBkYSBBTVJTZAIND2QWAmYPFQMCNjIyQXNzb2NpYcOnw6NvIGRlIE11bmljw61waW9zIGRhIFJlZ2nDo28gZGUgU2V0w7piYWz1AUFxdWlzacOnYW8gZGUgc2VydmnDp29zIHBhcmEgYSByZWFsaXphw6fDo28gZGUgZXN0dWRvIOKAnEFjdHVhbGl6YcOnw6NvIGRhIENhcmFjdGVyaXphw6fDo28g4oCcTUFDUk9FQ09Ow5NNSUNB4oCdIGRhIFBlbsOtbnN1bGEgZGUgU2V0w7piYWwgQXByZXNlbnRhZGEgbm8gUEVERVBFU%2BKAnSBlIOKAnEF2YWxpYcOnw6NvIGRvIEdyYXUgZGUgSW1wbGVtZW50YcOnw6NvIGRhcyBNZWRpZGFzIFByb3Bvc3RhcyBubyBQRURFUEVT4oCdZAIOD2QWAmYPFQMCNjAyQXNzb2NpYcOnw6NvIGRlIE11bmljw61waW9zIGRhIFJlZ2nDo28gZGUgU2V0w7piYWyEAUFxdWlzacOnw6NvIGRlIHNlcnZpw6dvcyBwYXJhIGFwb2lvIGxvZ8Otc3RpY28gZSBvcmdhbml6YcOnw6NvIGRvIGVuY29udHJvIHJlZ2lvbmFsIOKAnFVNQSBSRUdJw4NPLCBVTSBQUk9KRUNUT%2BKApiBNRUxIT1IgIEZVVFVST%2BKAnWQCDw9kFgJmDxUDAzQ3MDVBc3NvY2lhw6fDo28gZGUgTXVuaWPDrXBpb3MgZGFzIFRlcnJhcyBkZSBTYW50YSBNYXJpYV9Gb3JuZWNpbWVudG8gZGUgU2VndXJvIE11bHRpcnJpc2NvcyBlIGRlIFJlY2hlaW8gcGFyYSBvIENhbmlsIEludGVybXVuaWNpcGFsIGRhIEFNVFNNIChDSUFNVFNNKWQCEA9kFgJmDxUDBDEzNjMtQXNzb2NpYcOnw6NvIEluZHVzdHJpYWwgZG8gRGlzdHJpdG8gZGUgQXZlaXJv5wFFeGVjdcOnw6NvIGRlIDMwMDAgYnJvY2h1cmFzIG5vIGZvcm1hdG8gMjF4MjMsNWNtLCBpbnRlcmlvciBjb20gNCBww6FnaW5hcyBlbSBwYXBlbCBjb3VjaMOpIG1hdGUgMTcwIGdycy4rY2FwYXMgaW1wcmVzc2FzIGEgNC80Y29yZXMgZW0gY2FydG9saW5hIGNvdWNow6kgbWF0ZSAyNTAgZ3JzLCBwbGFzdGljaXphZGEgbWF0ZSBuYSBmcmVudGUuIEFncmFmYWRhIGNvbSBkb2lzIHBvbnRvcyBkZSBhcmFtZS5kAhEPZBYCZg8VAwQxMzY1LUFzc29jaWHDp8OjbyBJbmR1c3RyaWFsIGRvIERpc3RyaXRvIGRlIEF2ZWlyb7QCRXhlY3XDp8OjbyBkZSA1MDAgZXhlbXBsYXJlcyBkbyBMaXZybyBkYSBNaXNzw6NvIEVtcHJlc2FyaWFsIGEgTW%2FDp2FtYmlxdWUtZm9ybWF0byBmZWNoYWRvIEE1LCBjb20gdW0gbsO6bWVybyBkZSBww6FnaW5hcyBlbnRyZSA4MCBhIDEwMCwgaW1wcmVzc2FzIGEgNCBjb3JlcyBlbSBwYXBlbCBJT1IgOTAgZ3JzK2NhcGFzIGltcHJlc3NhcyBhIDQvJCBjb3JlcyBlbSBjYXJ0b2xpbmEgY291Y2jDqSBtYXRlIDI1MCBncnMsIGNvbSB2ZXJuaXogZGUgc29icmVpbXByZXNzw6NvIG5hIGZyZW50ZS4gQWNhYmFtZW50byBjb3ppZG8gYSBmaW8gZSBkAhIPZBYCZg8VAwI3Ni1Bc3NvY2lhw6fDo28gSW5kdXN0cmlhbCBkbyBEaXN0cml0byBkZSBBdmVpcm%2FRAUFwb2lvIGUgYWNvbXBhbmhhbWVudG8gdMOpY25pY28gZXNwZWNpYWxpemFkbywgbnVtIHBlcsOtb2RvIHDDs3PigJBtaXNzw6NvLCDDoHMgUE1FIHBhcmEgZGVmaW5pw6fDo28gZGUgdW0NClBsYW5vIGRlIEFjw6fDo28gSW50ZXJuYWNpb25hbCBJbmRpdmlkdWFsaXphZG87IEF2YWxpYcOnw6NvIGRvcyByZXN1bHRhZG9zIGRhcyBtaXNzw7VlcyBlbXByZXNhcmlhaXMuZAITD2QWAmYPFQMCNzctQXNzb2NpYcOnw6NvIEluZHVzdHJpYWwgZG8gRGlzdHJpdG8gZGUgQXZlaXJvlwJDcmlhw6fDo28gZGUgcGxhdGFmb3JtYSBvbmxpbmUgZGUgcHJvbW%2FDp8OjbyBlIG5lZ8OzY2lvIHBhcmEgYXMgZW1wcmVzYXMgcG9ydHVndWVzYXMgbm8gZXh0ZXJpb3IsIGNvbSBvDQpvYmplY3Rpdm8gZGUgY2FwaXRhbGl6YXIgbyBzZXUgcG90ZW5jaWFsIGRlIGV4cG9ydGHDp8OjbzsgRGVzZW52b2x2aW1lbnRvIGRlIGNvbnRlw7pkb3MgdsOtZGVvOyBQdWJsaWNpZGFkZSBlDQpkaXZ1bGdhw6fDo28gb24gbGluZTsgZW50cmV2aXN0YXMgY29tIGVtcHJlc8OhcmlvcyBubyBleHRlcmlvci5kAhQPZBYCZg8VAwMzMDgbQXV0b3JpZGFkZSBkYSBDb25jb3Jyw6puY2lhQVB1YmxpY2l0YcOnw6NvIGRlIEFudW5jaW8gcGFyYSBSZWNydXRhbWVudG8gZGUgUXVhZHJvcyBTdXBlcmlvcmVzZAIVD2QWAmYPFQMEMTgwMCVBdXRvcmlkYWRlIGRlIEdlc3TDo28gZG8gUFJPREVSIC0gR1BQNFNlcnZpw6dvcyBkZSBDb25zdWx0b3JpYSBlbSBTaXN0ZW1hcyBkZSBJbmZvcm1hw6fDo29kAhYPZBYCZg8VAwQxODY5KEF1dG9yaWRhZGUgTmFjaW9uYWwgZGUgUHJvdGVjw6fDo28gQ2l2aWxsUHJlc3Rhw6fDo28gZGUgU2VydmnDp29zIGRlIENvbnN1bHRvcmlhIHBhcmEgYXBvaW8gw6AgYWRqdWRpY2HDp8OjbyBkbyBTaXN0ZW1hIE5hY2lvbmFsIGRlIFZpZGVvY29uZmVyw6puY2lhZAIXD2QWAmYPFQMEMTE3NCRCYXNlIEHDqXJlYSBOLsK6IDEg4oCTIEZvcsOnYSBBw6lyZWE5QklPTUJPUyBFTSBBTFVNSU5JTyBQQVJBIEFMT0pBTUVOVE8gREUgUFJBw4dBUyBNQVNDVUxJTk9TZAIYD2QWAmYPFQMEMTg5NC9CYXNlIEHDqXJlYSBOLsK6IDEg4oCTIEZvcsOnYSBBw6lyZWEgUG9ydHVndWVzYU5QSU5UVVJBIERPUyBRVUFSVE9TIE5PUyBBTE9KQU1FTlRPUyBERSBTQVJHRU5UT1MgREEgQkFTRSBBw4lSRUEgTi7CuiAxLCBTSU5UUkFkAhkPZBYCZg8VAwMzNTggQmlibGlvdGVjYSBOYWNpb25hbCBkZSBQb3J0dWdhbCCMAUFxdWlzacOnw6NvIGRlIHNlcnZpw6dvcyBkZSBjb25jZXDDp8OjbyBlIGRlc2Vudm9sdmltZW50byBkZSBzb2x1w6fDtWVzIHRlY25vbMOzZ2ljYXMgbm8gw6JtYml0byBkYSBCaWJsaW90ZWNhIE5hY2lvbmFsIERpZ2l0YWwgZSBkYSBQT1JCQVNFZAIaD2QWAmYPFQMEMTQxORJCcmlnYWRhIEZpc2NhbCBHTlISQWx1Z2VyIGRlIHZpYXR1cmFzZAIbD2QWAmYPFQMDNzA3IEPDom1hcmEgIE11bmljaXBhbCBkZSBNaXJhbmRlbGEgalByZXN0YcOnw6NvIGRlIHNlcnZpw6dvcyBkZXN0aW5hZG9zIMOgIHJlYWxpemHDp8OjbyBkbyB0cmFuc3BvcnRlIGRlIGFsdW5vcyBwYXJhIGEgRUIxIGUgSiBJIGRlIENhcnZhbGhhaXNkAhwPZBYCZg8VAwQxODY2HEPDom1hcmEgTXVuaWNpcGFsIGRhIEFtYWRvcmFEQXF1aXNpw6fDo28gZGUgdW0gZXNwZWN0w6FjdWxvIGRlIG3DunNpY2EgQmx1ZXMgZGEgY2FudG9yYSBMaXNhIERvYnlkAh0PZBYCZg8VAwQxOTA0HEPDom1hcmEgTXVuaWNpcGFsIGRhIEFtYWRvcmF%2BRm9ybmVjaW1lbnRvIGUgTW9udGFnZW0gZGUgRXN0cnV0dXJhcyBlbSBNYWRlaXJhIGUgUGFpbsOpaXMgTURGIOKAkyAxOcK6LiBGZXN0aXZhbCBJbnRlcm5hY2lvbmFsIGRlIEJhbmRhIERlc2VuaGFkYSBkYSBBbWFkb3JhZAIeD2QWAmYPFQMDMzIyHEPDom1hcmEgTXVuaWNpcGFsIGRhIEdvbGVnw6PaAUZvcm5lY2ltZW50byBkZSB0ZW5kYXMsIGNvbSBjYXJhY3RlcsOtc3RpY2FzIGRpdmVyc2FzLCBkZXN0aW5hZGFzIMOgIFggTW9zdHJhIGRlIEdhc3Ryb25vbWlhIFJpYmF0ZWphbmEgZSAywrogU2Fsw6NvIGRvIFZpbmhvLCBkbyBWaW5hZ3JlIGUgZG9zIEF6ZWl0ZXMgZG8gUmliYXRlam8sIGEgcmVhbGl6YXIgZW50cmUgb3MgZGlhcyAxMSBlIDE0IGRlIFNldGVtYnJvIGRlIDIwMDguZAIfD2QWAmYPFQMEMTEwORtDw6JtYXJhIE11bmljaXBhbCBkYSBHdWFyZGEyRXN0dWRvIEVjb27Ds21pY28tIEZpbmFuY2Vpcm8gcGFyYSBUYXhhcyBlIFRhcmlmYXNkAiAPZBYCZg8VAwQxMzg0GkPDom1hcmEgTXVuaWNpcGFsIGRhIEhvcnRhpwFGb3JuZWNpbWVudG8gZGUgNzYuMDAwIGxpdHJvcyBkZSBnYXPDs2xlbywgZSBmb3JuZWNpbWVudG8gZSBpbnN0YWxhw6fDo28gZGUgdGFucXVlLCBncnVwbyBlIGRlbWFpcyB1dGVuc8OtbGlvcyBuZWNlc3PDoXJpb3MgYW8gYXJtYXplbmFtZW50byBlIGNvbnRyb2xvIGRvIGNvbWJ1c3TDrXZlbGQCIQ9kFgJmDxUDBDIwMTAbQ8OibWFyYSBNdW5pY2lwYWwgZGEgTG91c8OjY0NvbnRyYXRhw6fDo28gZGUgdW0gc2VydmnDp28gcGFyYSBkZXNlbnZvbHZpbWVudG8gZGUgZnVuY2lvbmFsaWRhZGVzIGRlIFNpc3RlbWEgZGUgTWFwYSBJbnRlcmFjdGl2b2QCIg9kFgJmDxUDBDE4ODkbQ8OibWFyYSBNdW5pY2lwYWwgZGEgTG91c8OjJ0FxdWlzacOnw6NvIGRlIGVxdWlwYW1lbnRvIGluZm9ybcOhdGljb2QCIw9kFgJmDxUDBDE4OTAbQ8OibWFyYSBNdW5pY2lwYWwgZGEgTG91c8OjH0RvY8OqbmNpYSBkZSBhdWxhcyBkZSBuYXRhw6fDo29kAiQPZBYCZg8VAwQxODkxG0PDom1hcmEgTXVuaWNpcGFsIGRhIExvdXPDox9Eb2PDqm5jaWEgZGUgYXVsYXMgZGUgbmF0YcOnw6NvZAIlD2QWAmYPFQMEMTg5MhtDw6JtYXJhIE11bmljaXBhbCBkYSBMb3Vzw6MfRG9jw6puY2lhIGRlIGF1bGFzIGRlIG5hdGHDp8Ojb2QCJg9kFgJmDxUDAjMyG0PDom1hcmEgTXVuaWNpcGFsIGRhIExvdXPDo5MBRWxhYm9yYcOnw6NvIGRhcyBmaWNoYXMgZGUgbcOjby1kZS1vYnJhLCBkZSBtw6FxdWluYXMgZSB2aWF0dXJhcywgcGFyYSBwb3N0ZXJpb3IgaW5zZXLDp8OjbyBuYSBhcGxpY2HDp8OjbyBpbmZvcm3DoXRpY2Eg4oCTIENvbnRhYmlsaWRhZGUgZGUgQ3VzdG9zZAInD2QWAmYPFQMEMTM0NRlDw6JtYXJhIE11bmljaXBhbCBkYSBNYWlhhAFQcmVzdGHDp8OjbyBkZSBTZXJ2acOnb3MgZGUgQ29sb2Nhw6fDo28gZGUgT3V0ZG9vcnMgZSBQcm9kdcOnw6NvIGRlIEltYWdlbnMgZW0gVmluaWwgZSBMb25hIHBhcmEgYSBDYW1wYW5oYSDigJxOw6NvIMOgcyBQb3J0YWdlbnPigJ1kAigPZBYCZg8VAwQxMzEyGUPDom1hcmEgTXVuaWNpcGFsIGRhIE1haWF8UFJFU1RBw4fDg08gREUgU0VSVknDh09TIERFIFBST0RVw4fDg08gRE8gQ09OQ0VSVE8gREUgTcOaU0lDQSBMSUdFSVJBIFBPUlRVR1VFU0EgLSDigJxGRVJOQU5ETyBUT1JETyAmIFNUQVJEVVNUIE9SQ0hFU1RSQeKAnWQCKQ9kFgJmDxUDAzc0OBlDw6JtYXJhIE11bmljaXBhbCBkYSBNYWlh3QFQUkVTVEHDh8ODTyBERSBTRVJWScOHT1MgREUgQUxVR1VFUiwgTU9OVEFHRU0gRSBERVNNT05UQUdFTSBERSAzMyBUQVNRVUlOSEFTIERFIEVYVEVSSU9SLCBTRU5ETyBVTUEgU0VNIEJBTkNBLCBFIDEyIFNUQU5EUyBNT0RVTEFSRVMgUEFSQSBFWFBPU0nDh8OVRVMgQ09NIExPTkEgRSBGRUNITyBQQVJBIEEgRkVJUkEgREUgREVTUE9SVE8gRSBEQVMgQ09MRUNUSVZJREFERVMgREEgTUFJQWQCKg9kFgJmDxUDAzUwNRlDw6JtYXJhIE11bmljaXBhbCBkYSBNYWlhelByZXN0YcOnw6NvIGRlIHNlcnZpw6dvcyBkZSBhbHVndWVyIGRlIGVxdWlwYW1lbnRvIGRlIGx1eiBlIHNvbSBwYXJhIGEgSUkgRmVpcmEgZG8gRGVzcG9ydG8gZSBkYXMgY29sZWN0aXZpZGFkZXMgZGEgTWFpYSAuZAIrD2QWAmYPFQMDMTI0GUPDom1hcmEgTXVuaWNpcGFsIGRhIE1haWFnUmVwYXJhw6fDo28gZGEgdW5pZGFkZSBkZSBjbGltYXRpemHDp8OjbyBkb3MgQmFsbmXDoXJpb3MgZG8gQ29tcGxleG8gTXVuaWNpcGFsIGRlIHBpc2NpbmFzIGRlIEd1ZWlmw6Nlc2QCLA9kFgJmDxUDBDE5NTEaQ8OibWFyYSBNdW5pY2lwYWwgZGEgTW9pdGFUUmVtb2RlbGHDp8OjbyBkbyBQw6F0aW8gRXh0ZXJpb3IgZGEgRXNjb2xhIELDoXNpY2EgZG8gMcK6IENpY2xvIGRlIFNhcmlsaG9zIFBlcXVlbm9zZAItD2QWAmYPFQMDMzMxGkPDom1hcmEgTXVuaWNpcGFsIGRhIE1vaXRhckFsdWd1ZXIgZGUgTcOzZHVsb3MgUHLDqS1GYWJyaWNhZG9zIHBhcmEgZm9ybmVjaW1lbnRvIGRlIHJlZmVpw6fDtWVzIG5hIEVCMS9KSSBkYSBNb2l0YSBlIEVCMS9KSSBuwroyIEFsaG9zIFZlZHJvc2QCLg9kFgJmDxUDAzE2NBpDw6JtYXJhIE11bmljaXBhbCBkYSBNb2l0YTVSZWN1cGVyYcOnw6NvIGUgTW9udGFnZW0gZGUgVW0gQ2FpcyBGbHV0dWFudGUgbm8gR2Fpb2QCLw9kFgJmDxUDAjYxGkPDom1hcmEgTXVuaWNpcGFsIGRhIE1vaXRhNFJlY29uZGljaW9uYW1lbnRvIGRhcyBDYWxkZWlyYXMgZGEgUGlzY2luYSBNdW5pY2lwYWxkAjAPZBYCZg8VAwM0NjYcQ8OibWFyYSBNdW5pY2lwYWwgZGEgTXVydG9zYRhGb3JuZWNpbWVudG8gZGUgZ2Fzw7NsZW9kAjEPZBYCZg8VAwMyOTIcQ8OibWFyYSBNdW5pY2lwYWwgZGEgTXVydG9zYVZGb3JuZWNpbWVudG8gZGUgZG9pcyBlc3BlY3TDoWN1bG9zIHBpcm90w6ljbmljb3MgaW50ZWdyYWRvcyBuYXMgZmVzdGFzIGRlIFMuIFBhaW8gMjAwOGQCMg9kFgJmDxUDAzI5NBxDw6JtYXJhIE11bmljaXBhbCBkYSBNdXJ0b3NhRkNvbnRyYXRhw6fDo28gZGUgZXNwZWN0w6FjdWxvcyBtdXNpY2FpcyBwYXJhIGFzIGZlc3RhcyBkZSBTLiBQYWlvIDIwMDhkAjMPZBYCZg8VAwMyMzAcQ8OibWFyYSBNdW5pY2lwYWwgZGEgTXVydG9zYT5Gb3JuZWNpbWVudG8gZSBpbnN0YWxhw6fDo28gZGUgSWx1bWluYcOnw7VlcyBlIE9ybmFtZW50YcOnw7Vlc2QCNA9kFgJmDxUDBDE0MzAcQ8OibWFyYSBNdW5pY2lwYWwgZGEgTmF6YXLDqTBQYXZpbWVudGHDp8OjbyBkYSBSdWEgZG9zIFJhcG9zb3Mg4oCTIEZhbWFsaWPDo29kAjUPZBYCZg8VAwQxNDMxHUPDom1hcmEgTXVuaWNpcGFsIGRhIE5hemFyw6kgVFBhdmltZW50YcOnw6NvIGRhIFJ1YSAyNSBkZSBBYnJpbCwgVHJhdmVzc2EgU29icmVhbm8gZSBSdWEgZG8gQ2x1YmUgRXN0cmVsYSBkbyBOb3J0ZWQCNg9kFgJmDxUDBDEzMjgdQ8OibWFyYSBNdW5pY2lwYWwgZGEgTmF6YXLDqSBWUGF2aW1lbnRhw6fDo28gZGUgdW0gdHJvw6dvIGRvIHJlY2ludG8gZGFzIEZlc3RhcyBlbSBIb25yYSBkZSBOb3NzYSBTZW5ob3JhIGRhIE5hemFyw6lkAjcPZBYCZg8VAwQxMzI5HUPDom1hcmEgTXVuaWNpcGFsIGRhIE5hemFyw6kgR1N1YnN0aXR1acOnw6NvIGRvIHRlY3RvIGRvIHJlZmVpdMOzcmlvIGRhIEUuQi4gMiwzIGRlIEFtYWRldSBHYXVkw6puY2lvZAI4D2QWAmYPFQMEMTMzMB1Dw6JtYXJhIE11bmljaXBhbCBkYSBOYXphcsOpIFtGb3JuZWNpbWVudG8gZGUgcGF2aW1lbnRvIGFtb3J0ZWNlZG9yIGVtIGJvcnJhY2hhIHBhcmEgbyByZWNpbnRvIGV4dGVyaW9yIGRhIEUuQi4gZG8gU8OtdGlvZAI5D2QWAmYPFQMEMTQ3MR1Dw6JtYXJhIE11bmljaXBhbCBkYSBOYXphcsOpIEZBcXVpc2nDp8OjbyBkZSBtYW51YWlzIGVzY29sYXJlcywgbm8gw6JtYml0byBkYSBhY8Onw6NvIHNvY2lhbCBlc2NvbGFyZAI6D2QWAmYPFQMDMzM0HUPDom1hcmEgTXVuaWNpcGFsIGRhIE5hemFyw6kgdlByZXN0YcOnw6NvIGRlIHNlcnZpw6dvcyBkZSBhcG9pbyBkZSBsdXogZSBzb20gYW8gZXZlbnRvIOKAnE5hemFyw6kgRW0gRmVzdGHigJ0g4oCTIGRpYXMgNSwgOSwgMTAsIDExIGUgMTQgZGUgU2V0ZW1icm9kAjsPZBYCZg8VAwM2ODgdQ8OibWFyYSBNdW5pY2lwYWwgZGEgTmF6YXLDqSA9U0VSVknDh08gREUgVklHSUzDgk5DSUEgQU8gUEFSUVVFIEFUTMOCTlRJQ08sIFPDjVRJTywgTkFaQVLDiWQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgQFGmN0bDAwJFBsYWNlSG9sZGVyTWFpbiRpbWcxBRpjdGwwMCRQbGFjZUhvbGRlck1haW4kSW1nMgUaY3RsMDAkUGxhY2VIb2xkZXJNYWluJEltZzMFGmN0bDAwJFBsYWNlSG9sZGVyTWFpbiRJbWc0uWn4bl8w9g2Bk7FrwVGVLM2D5Sc%3D&ctl00%24PlaceHolderMain%24hddnPage=$PAGE&ctl00%24PlaceHolderMain%24hddnPageLast=36&ctl00%24PlaceHolderMain%24Img3.x=10&ctl00%24PlaceHolderMain%24Img3.y=8&__EVENTVALIDATION=%2FwEWBwLtmbDDDwKl9LvSDwLr5fH4AwKwtIkyAtCNw4oLAtCNx4oLAtCN24oLf6S0WZJ32IdBEGPt2iCs32LgSBs%3D"); my $res = $ua->request($req); if ( $res->is_success ) { $last = ad_find_pages($res); if($last >0) { #print "Há $last páginas\n" if $DEBUG; ad_get_data($res, $last); ad_dump_data(); } else { print "Erro: há $last páginas.\n" if $DEBUG; } } else { print $res->status_line, "\n"; } sub ad_find_pages { my ($res) = @_; if( $res->content =~ /ctl00_PlaceHolderMain_lblNumberPagesMax\"\>de (\d+)\content; $content =~ s{href=\'Detail.aspx\?idAjusteDirecto=(\d+)\' .*?\>(.*?)\<}{ ad_fill_data($1,$2); }sexgm; } sub ad_fill_data { my ($id, $name) = @_; my $req = HTTP::Request->new(GET => "http://www.base.gov.pt/_layouts/ccp/AjusteDirecto/Detail.aspx?idAjusteDirecto=$id"); my $res = $ua->request($req); if ( $res->is_success ) { if(ad_empty_detail($res)) { ad_fill_data($id, $name); } else { ad_load_data($id, $name, $res); } } else { print $res->status_line, "\n"; } } sub ad_empty_detail { my ($res) = @_; if ( $res->content =~ /do contrato\.\"\>\s*([\d,.]+?)[^\d,.]/ ) { #print "not empty!\n" if $DEBUG; return 0; } else { #print "empty!\n" if $DEBUG; return 1; } } sub ad_load_data { my ($id, $name, $res) = @_; $AD{$id}{nome}=$name; if ( $res->content =~ /do contrato\.\"\>\s*([\d,.]+?)[^\d,.]/ ) { $AD{$id}{preco} = $1; $AD{$id}{preco} =~ s/\.//g; $AD{$id}{preco} =~ s/\,/./g; } if ( $res->content =~ /Objecto do contrato.*?\"\>(.*?)\content =~ /Prazo de execu.*?\"\>\s*(\d+)\s*\content =~ /Local de execu.*?\"\>\s*(\S*?)\s*\