File Coverage

blib/lib/WWW/Lunarstorm.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package Lunarstorm;
2              
3             $VERSION = '0.02';
4             $ABSTRACT = 'Lunarstorm (www.lunarstorm.se) interface';
5              
6 1     1   8553 use strict;
  1         4  
  1         40  
7 1     1   1211 use LWP::UserAgent;
  1         68577  
  1         40  
8 1     1   3494 use HTTP::Cookies;
  1         7515  
  1         34  
9 1     1   1375 use HTML::TableExtract;
  0            
  0            
10             use URI::Escape;
11              
12             my %Defaults = (
13             Username => undef,
14             Password => undef,
15             UserID => undef,
16             CookiePath => '.',
17             AgentIdent => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)'
18             );
19              
20              
21             # Constructor
22             sub new{
23             my ($class, %args) = @_;
24             my $self = {};
25             bless $self, $class;
26              
27             foreach my $key (keys %Defaults){
28             $self->{$key} = defined $args{$key} ? $args{$key} : $Defaults{$key};
29             }
30             $self->{Cookie} = HTTP::Cookies->new(file => "$self->{CookiePath}/cookies.txt", autosave => 1);
31              
32             return $self;
33             }
34              
35             # Destructor
36             sub DESTROY{
37              
38             }
39              
40              
41             # login()
42             sub login{
43             my $self = shift;
44              
45             $self->{Cookie}->load();
46              
47             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
48             $ua->agent($self->{AgentIdent});
49             $ua->cookie_jar($self->{Cookie});
50              
51             my $req = HTTP::Request->new(POST => 'http://www.lunarstorm.se/log/log_login.asp');
52             $req->content_type('application/x-www-form-urlencoded');
53             $req->content("username=$self->{Username}&password=$self->{Password}&pejl_mood=0");
54             $req->referer('http://www.lunarstorm.se/log/log_outside.asp');
55             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
56             $self->{Cookie}->add_cookie_header($req);
57              
58             my $res = $ua->request($req);
59              
60             if(not ($res->is_success || $res->code == 302)){
61             return 0;
62             }
63              
64             $self->{Cookie}->save();
65             return 1;
66             }
67              
68              
69             # logout
70             sub logout{
71             my $self = shift;
72              
73             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
74             $ua->agent($self->{AgentIdent});
75             $ua->cookie_jar($self->{Cookie});
76              
77             my $req = HTTP::Request->new(POST => 'http://www.lunarstorm.se/sys_exit.asp');
78             $req->content_type('application/x-www-form-urlencoded');
79             $req->referer('http://www.lunarstorm.se/log/log_outside.asp');
80             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
81             $self->{Cookie}->add_cookie_header($req);
82              
83             my $res = $ua->request($req);
84              
85             if(not ($res->is_success || $res->code == 302)){
86             return 0;
87             }
88              
89             return 1;
90             }
91              
92              
93             # visitors()
94             sub visitors{
95             my $self = shift;
96             my $te = new HTML::TableExtract(depth => 2, count => 0, keep_html => 1);
97              
98             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
99             $ua->agent($self->{AgentIdent});
100             $ua->cookie_jar($self->{Cookie});
101              
102             my $req = HTTP::Request->new(POST => "http://www.lunarstorm.se/usr/usr_presentationlog.asp?username=$self->{Username}");
103             $req->content_type('application/x-www-form-urlencoded');
104             $req->referer('http://www.lunarstorm.se/usr/usr_presentation.asp');
105             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
106             $self->{Cookie}->add_cookie_header($req);
107              
108             my $res = $ua->request($req);
109              
110             if(not ($res->is_success || $res->code == 302)){
111             return;
112             }
113              
114             $te->parse($res->as_string);
115             my @items=();
116             foreach my $ts ($te->table_states){
117             foreach my $row ($ts->rows){
118             my $item = @$row[1];
119             my $userid="";
120             my $nick="";
121             my $sex="N";
122             my $age=0;
123             my $city="N/A";
124             my $state="N/A";
125              
126             if($item=~/userid=(%7B.*%7D)/){
127             $userid=uri_unescape($1);
128             }
129              
130             if($item=~/([\w\d_]+)\W(F|P)(\d+)/i){
131             $nick=$1;
132             $sex=$2;
133             $age=$3;
134             }
135             $nick=~s/^\s//;
136             $nick=~s/\s$//;
137              
138             my %item;
139             $item{NICK} = $nick;
140             $item{SEX} = $sex;
141             $item{AGE} = $age;
142             $item{CITY} = $city;
143             $item{STATE} = $state;
144             $item{USERID} = $userid;
145             push(@items, \%item);
146             }
147             }
148              
149             shift(@items);
150             return @items;
151             }
152              
153              
154             # guestbook
155             sub guestbook{
156             my ($self, $page, $userid) = @_;
157              
158             $userid = $self->{UserID} if not defined $userid;
159             $page = 1 if not defined $page;
160              
161             my $te = new HTML::TableExtract(depth => 2, count => 0, keep_html => 1);
162              
163             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
164             $ua->agent($self->{AgentIdent});
165             $ua->cookie_jar($self->{Cookie});
166              
167             my $req = HTTP::Request->new(POST => "http://www.lunarstorm.se/usr/gst_guestbook.asp?userid=$userid&page=$page");
168             $req->content_type('application/x-www-form-urlencoded');
169             $req->referer('http://www.lunarstorm.se/usr/usr_presentation.asp');
170             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
171             $self->{Cookie}->add_cookie_header($req);
172              
173             my $res = $ua->request($req);
174              
175             if(not ($res->is_success || $res->code == 302)){
176             return;
177             }
178              
179             $te->parse($res->as_string);
180             my @gb_items=();
181             foreach my $ts ($te->table_states){
182             foreach my $row ($ts->rows){
183             my $gb_item = @$row[2];
184             if(($gb_item=~/\(.*(obesvarat|oläst)\)/) || ($userid ne $self->{UserID})){
185             my $userid_a;
186             my $guestnr=0;
187             my $nick="";
188             my $sex="N";
189             my $age=0;
190             my $city="N/A";
191             my $state="N/A";
192              
193             if($gb_item=~/userid=({[\dA-F-]*})/){
194             $userid_a=$1;
195             }
196             if($gb_item=~/guestnr=(\d*)/){
197             $guestnr=$1;
198             }
199              
200             $gb_item=~s/
/\n/igs;
201             $gb_item=~s/<(?:[^>'"]*|(['"]).*?\1)*>//gs;
202              
203             my @tmp = split(/\n/, $gb_item);
204             shift(@tmp);
205             if($tmp[0]=~/([\w\d_]+)\W(F|P)(\d+) från (.+) i (.+) län/i){
206             $nick=$1; $sex=$2; $age=$3;
207             $city=$4; $state=$5;
208             }
209             $nick=~s/^\s//;
210             $nick=~s/\s$//;
211             shift(@tmp);
212             $gb_item=join(' ', @tmp);
213             $gb_item=~s/^\s+//g;
214             $gb_item=~s/\s+$//g;
215              
216             my %item;
217             $item{NICK} = $nick;
218             $item{SEX} = $sex;
219             $item{AGE} = $age;
220             $item{CITY} = $city;
221             $item{STATE} = $state;
222             $item{USERID} = $userid_a;
223             $item{GUESTNR} = $guestnr;
224             $item{TEXT} = $gb_item;
225             push(@gb_items, \%item);
226             }
227             }
228             }
229              
230             return @gb_items;
231             }
232              
233              
234             # sign_guestbook
235             sub sign_guestbook{
236             my ($self, $nick, $userid, $guestnr, $msg) = @_;
237              
238             if(not $userid=~/{.*}/){
239             $userid = uri_unescape($userid);
240             }
241              
242             $msg = uri_escape($msg);
243              
244             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
245             $ua->agent($self->{AgentIdent});
246             $ua->cookie_jar($self->{Cookie});
247              
248             my $req = HTTP::Request->new(POST => 'http://www.lunarstorm.se/usr/gst_store.asp');
249             $req->content_type('application/x-www-form-urlencoded');
250             $req->content("guestnr=$guestnr&userid=$userid&username=$nick&source=popup&msgbody=$msg");
251             $req->referer("http://www.lunarstorm.se/usr/gst_compose.asp?guestnr=$guestnr&userid=$userid&username=$nick");
252             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
253             $self->{Cookie}->add_cookie_header($req);
254              
255             my $res = $ua->request($req);
256              
257             if(not ($res->is_success || $res->code == 302)){
258             return 0;
259             }
260              
261             return 1;
262             }
263              
264              
265             # relations
266             sub relations{
267             my ($self, $userid) = @_;
268              
269             if(not $userid=~/{.*}/){
270             $userid = uri_unescape($userid);
271             }
272              
273             my $te = new HTML::TableExtract(depth => 2, count => 1, keep_html => 1);
274              
275             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
276             $ua->agent($self->{AgentIdent});
277             $ua->cookie_jar($self->{Cookie});
278              
279             my $req = HTTP::Request->new(POST => "http://www.lunarstorm.se/usr/fri_friends.asp?userid=$userid");
280             $req->content_type('application/x-www-form-urlencoded');
281             $req->referer('http://www.lunarstorm.se/usr/usr_presentation.asp');
282             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
283             $self->{Cookie}->add_cookie_header($req);
284              
285             my $res = $ua->request($req);
286              
287             if(not ($res->is_success || $res->code == 302)){
288             return;
289             }
290              
291             $te->parse($res->as_string);
292             my @friends=();
293             foreach my $ts ($te->table_states){
294             foreach my $row ($ts->rows){
295             my $friend = @$row[2];
296             my $userid;
297             if($friend=~/userid=({[\dA-F-]*})/i){
298             $userid=$1;
299             }
300              
301             $friend=~s/<(?:[^>'"]*|(['"]).*?\1)*>//gs;
302              
303             if($friend=~/([\w\d_]+)\W(F|P)(\d+)/i){
304             my $nick=$1;
305             my $sex="N";
306             my $age=0;
307             my $city="N/A";
308             my $state="N/A";
309             $nick=~s/^\s//;
310             $nick=~s/\s$//;
311              
312             my %item;
313             $item{NICK} = $nick;
314             $item{SEX} = $sex;
315             $item{AGE} = $age;
316             $item{CITY} = $city;
317             $item{STATE} = $state;
318             $item{USERID} = $userid;
319             push(@friends, \%item);
320             }
321             }
322             }
323              
324             return @friends;
325             }
326              
327              
328             # scribbles
329             sub scribbles{
330             my $self = shift;
331              
332             my $te = new HTML::TableExtract(depth => 2, count => 0, keep_html => 1);
333              
334             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
335             $ua->agent($self->{AgentIdent});
336             $ua->cookie_jar($self->{Cookie});
337              
338             my $req = HTTP::Request->new(POST => "http://www.lunarstorm.se/bbs/bbs_main.asp");
339             $req->content_type('application/x-www-form-urlencoded');
340             $req->referer('http://www.lunarstorm.se/usr/usr_presentation.asp');
341             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
342             $self->{Cookie}->add_cookie_header($req);
343              
344             my $res = $ua->request($req);
345              
346             if(not ($res->is_success || $res->code == 302)){
347             return;
348             }
349              
350             $te->parse($res->as_string);
351              
352             my @scribbles=();
353             foreach my $ts ($te->table_states){
354             foreach my $row ($ts->rows){
355             my $scribble = @$row[2];
356             my $userid="";
357             my $nick="";
358             my $sex="N";
359             my $age=0;
360             my $city="N/A";
361             my $state="N/A";
362              
363             if($scribble=~/userid=({[\dA-F-]*})/){
364             $userid=$1;
365             }
366              
367             $scribble=~s/
/\n/igs;
368             $scribble=~s/<(?:[^>'"]*|(['"]).*?\1)*>//gs;
369              
370             if($scribble=~/([\w\d_]+)\W(F|P)(\d+) från (.+) i (.+) län/i){
371             $nick=$1; $sex=$2; $age=$3;
372             $city=$4; $state=$5;
373             }
374             $nick=~s/^\s//;
375             $nick=~s/\s$//;
376              
377             my @tmp = split(/\n/, $scribble);
378             shift(@tmp);
379             $scribble=join(' ', @tmp);
380             $scribble=~s/^\s+//g;
381             $scribble=~s/\s+$//g;
382              
383             my %item;
384             $item{NICK} = $nick;
385             $item{SEX} = $sex;
386             $item{AGE} = $age;
387             $item{CITY} = $city;
388             $item{STATE} = $state;
389             $item{USERID} = $userid;
390             $item{TEXT} = $scribble;
391             push(@scribbles, \%item);
392             }
393             }
394              
395             return @scribbles;
396             }
397              
398              
399             # scribble
400             sub scribble{
401             my ($self, $scribble) = @_;
402              
403             $scribble = uri_escape($scribble);
404              
405             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
406             $ua->agent($self->{AgentIdent});
407             $ua->cookie_jar($self->{Cookie});
408              
409             my $req = HTTP::Request->new(POST => 'http://www.lunarstorm.se/bbs/bbs_db.asp?status=insert');
410             $req->content_type('application/x-www-form-urlencoded');
411             $req->content("body=$scribble");
412             $req->referer("http://www.lunarstorm.se/bbs/bbs_main.asp");
413             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
414             $self->{Cookie}->add_cookie_header($req);
415              
416             my $res = $ua->request($req);
417              
418             if(not ($res->is_success || $res->code == 302)){
419             return 0;
420             }
421              
422             return 1;
423             }
424              
425              
426             # relations_status
427             sub relations_status{
428             my $self = shift;
429              
430             my $te = new HTML::TableExtract(depth => 2, count => 0, keep_html => 1);
431              
432             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
433             $ua->agent($self->{AgentIdent});
434             $ua->cookie_jar($self->{Cookie});
435              
436             my $req = HTTP::Request->new(GET => 'http://www.lunarstorm.se/usr/fri_status.asp');
437             $req->content_type('application/x-www-form-urlencoded');
438             $req->referer('http://www.lunarstorm.se/usr/usr_presentation.asp');
439             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
440             $self->{Cookie}->add_cookie_header($req);
441              
442             my $res = $ua->request($req);
443              
444             if(not ($res->is_success || $res->code == 302)){
445             return 0;
446             }
447              
448            
449             $te->parse($res->as_string);
450              
451             my @relations=();
452             foreach my $ts ($te->table_states){
453             foreach my $row ($ts->rows){
454             my $relation = @$row[0];
455             my $userid="";
456             my $nick="";
457             my $sex="N";
458             my $age=0;
459             my $city="N/A";
460             my $state="N/A";
461             my $type="";
462              
463             $relation=uri_unescape($relation);
464              
465             if($relation=~/UserID=({[\dA-F-]*})/){
466             $userid=$1;
467             }
468              
469             $relation=~s/<(?:[^>'"]*|(['"]).*?\1)*>//gs;
470              
471             if($relation=~/([\w\d_]+)\W(F|P)(\d+)/i){
472             $nick=$1;
473             $sex=$2;
474             $age=$3;
475             }
476             $nick=~s/^\s//;
477             $nick=~s/\s$//;
478              
479             if($relation=~/skapa relationen.(.+).med/){
480             $type=$1;
481             }elsif($relation=~/hellre skapa relationen.(.+)\./){
482             $type=$1;
483             }elsif($relation=~/avslutat/){
484             $type="CLOSED";
485             }
486              
487             my %item;
488             $item{NICK} = $nick;
489             $item{SEX} = $sex;
490             $item{AGE} = $age;
491             $item{CITY} = $city;
492             $item{STATE} = $state;
493             $item{USERID} = $userid;
494             $item{TYPE} = $type;
495             if($nick){
496             push(@relations, \%item);
497             }
498             }
499             }
500              
501             return @relations;
502             }
503              
504              
505             # accept_relation
506             sub accept_relation{
507             my ($self, $relation) = @_;
508              
509             my $ua = LWP::UserAgent->new(keep_alive => 1, timeout => 300);
510             $ua->agent($self->{AgentIdent});
511             $ua->cookie_jar($self->{Cookie});
512              
513             my $req;
514             if($relation->{TYPE} ne "CLOSED"){
515             $req=HTTP::Request->new(POST => "http://www.lunarstorm.se/usr/fri_registration.asp?UserID=$relation->{USERID}&Action=ac&Part=3");
516             }else{
517             $req=HTTP::Request->new(POST => "http://www.lunarstorm.se/usr/fri_datamaster.asp?DMUserID=$relation->{USERID}&orgin=/usr/fri_status.asp&qs=&status=verify");
518             }
519             $req->content_type('application/x-www-form-urlencoded');
520             if($relation->{TYPE} ne "CLOSED"){
521             $req->content("Stuff=1&Diary=1&Category=&Relation=");
522             }
523             $req->referer("http://www.lunarstorm.se/usr/fri_registration.asp");
524             $req->header('Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain');
525             $self->{Cookie}->add_cookie_header($req);
526              
527             my $res = $ua->request($req);
528              
529             if(not ($res->is_success || $res->code == 302)){
530             return 0;
531             }
532              
533             if($relation->{TYPE} ne "CLOSED"){
534             $req=HTTP::Request->new(POST => "http://www.lunarstorm.se/usr/fri_registration.asp?UserID=$relation->{USERID}&Action=ac&Part=4");
535             $req->content("COMMENT=&Category=&Relation=&Stuff=1&Diary=1");
536             $res = $ua->request($req);
537             if(not ($res->is_success || $res->code == 302)){
538             return 0;
539             }
540             }
541              
542             return 1;
543             }
544              
545             1;
546              
547             __END__