‏הצגת רשומות עם תוויות perl. הצג את כל הרשומות
‏הצגת רשומות עם תוויות perl. הצג את כל הרשומות

יום שלישי, אוגוסט 27, 2019

Munigrabber לאתרים שמשתמשים בערכת העיצוב Mivzakiim

לפני מספר שנים בניתי תסריט שעבד על חלק מאתרי המועצות המקומיות, השבוע גיליתי שהקוד הישן שלי כבר לא עובד איתן כי הן החליפו את ערכת עיצוב.
התסריט הזה מתאים לערכת העיצוב Mivzakiim.
זה מתבסס על עיצוב האתר כך ששוב זה יישבר כשהם ישנו ערכת עיצוב.

הפעלה לדוגמה עבור מועצה מקומית שקר כל שהוא עם הדומיין
https://www.sheker-kolshehu.co.il
:

munigrabber.pl https://www.sheker-kolshehu.co.il

את הקובץ שנוצר שמים במקום שקורא ה RSS שלנו יכול לקרוא ממנו - למשל איפה שApache לוקח קבצים ממנו .


#!/usr/bin/perl  

use strict;
use warnings;

use LWP 5.64; # Loads all important LWP classes, and makes
use HTTP::Cookies; # Allow work with cookies
use XML::RSS;
use XML::Simple;
use Encode qw(decode encode);
use Data::Dumper;
use DateTime::Format::Strptime qw(strftime );

#The message content is located in a remote page, we fetch it's content to show in our RSS feed.
sub get_display_item
{
    my $url = shift;
    my $browser = shift;
    my $response = $browser->get( $url );
    my @lines = $response->content =~ /<div.*id="WebPartWPQ3"(.*)<\/div>/g;
    $lines[0] = '
new; $browser->cookie_jar( HTTP::Cookies->new( 'file' => '/tmp/headers', # where to read/write cookies 'autosave' => 1, # save it to disk when done )); $browser->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'); my $basepath = "$ARGV[0]"; my $url = "$basepath"; my $response = $browser->get( $url ); if ($response->{'_rc'} != 200 ) { die "Error for $url $response->{'_content'}"; } #for each cookie we got, add it to the current jar $browser->cookie_jar->extract_cookies( $response ); #Use the basepath for the generated filename , strip http/https from it for readbility my $filename="$url.rss"; $filename =~ s/https:\/\///g; $filename =~ s/http:\/\///g; $response = $browser->get( "$basepath/Pages/Mivzakiim.aspx" ); my $rss = XML::RSS->new( version => '2.0'); $rss->channel( title => "Municipal feed for $basepath", link => "$basepath", description => "MivzakiimAll RSS feed"); #load existing content if exist (this allow running it via a local crontab if ( -e $filename && -s $filename) { #load previous information and insert them into the output $rss->parsefile($filename); } my @lines = $response->content =~ /MivzakiimAll generalFilter">(.*)<\/div><\/div>/g; unless ($#lines >= 0) { print Dumper (@lines) ; die "$url does not have MivzakiimAll content, you need to adjust the script"; } my $xml_obj = XMLin(@lines); my $formater = DateTime::Format::Strptime->new( pattern => '%d/%m/%Y', time_zone => 'local', on_error => 'croak', ); foreach my $tr (@{$xml_obj->{tbody}->{tr}}) { foreach my $td ($tr->{td}) { my $date_in_webpage= $td->[0]->{'div'}->{'content'}; my $dt = $formater->parse_datetime($date_in_webpage); my $title = $td->[1]->{'a'}->{'content'}; my $link = $td->[1]->{'a'}->{'href'}; my $description = get_display_item ( $basepath . $link , $browser); $rss->add_item( title => $title, link => $basepath . $link,pubDate=>$dt ,guid=>$basepath . $link , description=>$description); } } #Use the basepath for the generated filename , strip http/https from it for readbility $rss->save($filename); __END__ =head1 NAME muni RSS - a script to get an RSS from old municipal websites with the Mivzakiim template which are lacking an RSS/Atom features. =head1 SYNOPSIS Create an RSS 2.0 file based on the embeeded messages page. =head1 DESCRIPTION This script provide a basic example on how one could get the RSS from the rusty pages without the RSS interface, =head1 BUGS =head1 AUTHOR Original code:Boris Shtrasman =head1 COPYRIGHT Copyright (c) 2015 Boris Shtrasman =head1 LICENSE this script is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =head1 CREDITS Rael Dornfest Jonathan Eisenzopf Wojciech Zwiefka Chris Nandor Shlomi Fish =head1 SEE ALSO perl(1), XML::Parser(3), LWP(3), XML::RSS(3),HTTP::Cookies(3) =cut

יום שני, יולי 27, 2015

muni grabber

לא היה לי ערוץ RSS להודעות באתר העירייה אז התוצאה לפניכם, יכול להיות שזה יעבוד גם לאחרים אם גם העירייה שלהם משתמשת במערכת ההודעות דומה.
#!/usr/bin/perl  

use LWP 5.64; # Loads all important LWP classes, and makes
use HTTP::Cookies; # Allow work with cookies
use XML::RSS;
use Encode qw(decode encode);

my $browser = LWP::UserAgent->new;
if ( $#ARGV != 0 )  {
 print  "incorrect number of  params, you should provide only basepath example : $0 http://url.muni.tld\n";
 die "";
}

$browser->cookie_jar( HTTP::Cookies->new(
    'file' => '/tmp/headers',
        # where to read/write cookies
    'autosave' => 1,
        # save it to disk when done
  ));



$browser->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');
my $basepath = "$ARGV[0]";
my $url = "$basepath/openning.asp?Lang=1";
my $response = $browser->get( $url );


#for each cookie we got, add it to the current jar
$browser->cookie_jar->extract_cookies( $response );

$response = $browser->get( "$basepath/apps/hebrew/resulttest.asp?AppId=4&TableName=MESSAGES&Categories=65&From=" );

my $rss = XML::RSS->new( version => '0.9' );
          $rss->channel(
          title        => "MUNI for $basepath",
          link         => "$basepath",
          description  => "MUNI RSS");

#the intersting stuff is inside Parse_Html_Template(...)
#I was too lazy to use better modules so I just went to the source , please don't shoot me ;)
#
#
for my $item ($response->content  =~ /Parse_Html_Template\((.*?)\)/g) {
    #first line always have garbage data (just skip it)
    next unless ($item =~ /.*,.*/) ;
    #Format  #### , "title","date"
    # ### may be a version number 
    #
    #
    $item =~ s/[^,]*,[^,]*,[^,]*,//;#remove useless headers
    #the next come in the format : 
    #"<a href='relative_path'>text</a>","<a href='relative path'>date</a>"
    while  ( $item  =~ q/"([^"]*)","([^"]*)"/)
    {
       my $firstpart = $1 ;
       my $secondpart = $2 ;
       $firstpart=~ /<a.*href=["']([\s\S]+?)['"].*>/;
       $link = $1;
       $firstpart=~ /<a.*href.*>([\s\S]+?)<\/a>/;
       $text = $1;
       $text =   decode("iso-8859-8", $text);
       $rss->add_item( title => $text, link => $basepath . $link);
       $item =~ s/"([^"]*)","([^"]*)"//;
    }
}

$rss->save("$0.rss");

__END__

=head1 NAME

muni RSS - a script to get an RSS from old municipal websites which are lacking an RSS/Atom features. 

=head1 SYNOPSIS

Create an RSS 0.9 file based on the messages page.

=head1 DESCRIPTION

This script provide a basic example on how one could get the RSS from the rusty pages without the RSS interface, 

=head1 BUGS

=head1 AUTHOR

Original code:Boris Shtrasman 

=head1 COPYRIGHT

Copyright (c) 2015 Boris Shtrasman 

=head1 LICENSE

this script is free software. You can redistribute it and/or modify it under the same terms as Perl itself.

=head1 CREDITS

Rael Dornfest <rael@oreilly.com>
Jonathan Eisenzopf <eisen@pobox.com>
Wojciech Zwiefka <wojtekz@cnt.pl>
Chris Nandor <pudge@pobox.com>

=head1 SEE ALSO

perl(1), XML::Parser(3), LWP(3), XML::RSS(3),HTTP::Cookies(3)

=cut


יום רביעי, ינואר 12, 2011

להשתמש בשפה הנכונה למשימה הנכונה

1.

איזה תענוג שעבודה שעשית פעם היום עוזרת למישהוא אחר.

לפני כשנה עזרתי לממש מערכת המחפשת את קשרי ההשקעות בין חברות -
נשמע מפוצץ אבל בסופו של יום מדובר באפלקיציה שמבצעת ניתוח טקסט , מוצאת את את גרף ההשעות :איזו חברה השקיעה בחברה מתי וכמה , ומציגה אותה.

מכיוון שאני לא בעל הזכויות לא יכלתי לשחרר את האפליקציה אבל מה שכן אנשים שנתקעים בבעיה דומה יכולים להעזר בגלל שכמהנדסים בחרנו את אוסף הפתרונות העונים לבעיה שלנו:
יכלנו לממש NLP ולעבוד די קשה בתהליך , לאחר מכן לממש אפליקציה שלומדת תהליכים ואחרי כל זה לממש את הפתרון שיאפשר הצגה של הנושא.

הפרוייקט מוממש פעמיים :
פעם אחת בפרל.
ופעם אחת בJava

הסיבה היא שמזמין העבודה לא רצה לראות פרל כי (לא ציטוט מדוייק) - "מרבית החוקרים הבאים שיעבדו עם זה לא מכירים פרל".

לכן על מנת שלא לשרוף זמן בחרנו בNLP של סטאנפורד (וויתרנו על ה NLP שקיימים ב CPAN מכייון שאחת הדרישות היתה שניתן יהיה להמיר בקלות את הפרוייקט לגאווה) - שאר בנושאים לא מעניינים כל כך.

לפני כשבועיים שמעתי אדם שקיבל משימה שחייבה לזהות טקסט ולבצע פעולה מתמטית על הקשרים (תורת הגרפים).
לאחר שכבר נתקלתי בבעייה זו כבר לפחות פעמיים (פעם בפרוייקט הזה ופעם כשעזרתי לאדם לממש מערכת פארסינג לדפים) הפנתי אותו לנושא ה NLP של סטאנפורד - קיבלתי טלפון עם תודה שהנושא מנע ממנו לבזבז הרבה מעוד זמן בנושא של ניתוח הטקסט ידנית.

2.
אתם מהנדסים , אתם מתכנתים אתם לא צריכים להמציא את הגלגל מחדש - אתם צריכים לבחור את אוסף הפתרונות שעונה על הבעיות הקטנות.

לאחרונה יותר ויתר אני שומע על פרוייקטים שעוסקים בdata mining , שצריכים לבצע ניתוחי טקסט ופעולות על קשרים אלו.

רבים וטובים אחרים כבר אמרו זאת - על תעבדו עם regex על דפי אתרים :
אתם תשרפו חודשים על מציעת כל מקרי הקצה - זה אולי רק נראה למנחה שלכם שהאתר מקיים חוקיות בהצגה - אתרים רבים עוברים לCSS ואז נשברים לכם חוקי ה REGEX לאיתור הנושא ,אתרים משנים את העיצוב ה HTMLי ונשבר לכם העיצוב , אתרים משנים את הפלטפורמה איתה הם עובדים (חברה אחת הסבה לJoomla ) מה ששבר את כל מנגנון איתור הטקסט.
את המידע אתם צריכים לשלוף באותה הצורה שאתם קוראים את הטקסט - אתם לא מחפשים עיצוב בשביל לגלות משמעות אתם משתמשים בקריאה : הבנת הקשרים בטקסט.

אז למה בתוכנה שלכם אתם מחפשים לפי עיצוב את הקשרים והמשמעויות בטקסט ?
רבים וטובים כבר מימשו מנגנוני קריאה וניתוח טקסט , השתמשו בזה שנו את זה לצורך שלכם.

אם אתם הולכים לעשות פרוייקט בנושא של ניתוח טקסט - בבקשה על תממשו NLP תשתמשו בפרל במקום ב JAVA:
מימוש של אותו הקוד בJAVA לקח חודשיים (כאשר בפרל הוא נכתב בשבוע) , פרל בניגוד לגאווה כבר מכילה הרבה מאוד פעולות לביצוע על טקסט, הנה מצגת קטנה.

וזה עוד לפני צרות הרישוי שאתם עומדים לפניהם.

יום שישי, אוקטובר 22, 2010

האם אני באמת צריך את kaddressbook?

התחלתי להשתמש במנהל החלונות הזה איפה שהוא הכל מ kde 3.0 , כאשר התחלפה הקידמות התחילו הצרות אולי אני זקן/שמרן או לא יודע איך לקרוא לזה אבל איבוד השימושיות כבד מנשוא.
עד 4.4 נהגתי לאכסן ולנהל את רשימתץ הכתובות של ב kaddressbook אבל לא ... חייבים לשנות ולהוריד פונקציונאל.
אם בעבר זה היה באג סורר שאיבד מידע במיזוג אנשי קשר אז אכשיו פשוט מעבירים את האשמה לnepomunk.

אז כן, אני שובר את הראש איך אני מכניס ידנית שני פיטצרים לתוכנה (חיפוש אנשי קשר דומים) אבל עדיןן זה פשוט מעצבן!
עם כל הכבוד הסרת האפשרויות הרבה מהתוכנה (כמו חוסר היכולת לערוך את שדות השמות) מורידה יותר ויתר את השימושיות למשתמש הממוצע.

הרי תוכנה זו היא חלק מ kontact חבילה משרדית שמהווה תחליף מלא לoutlook ביחד עם עוד מספר תוכנות אחרות ואכשיו פתאום מוצא את עצמך מחפש פתרונות נוספים בשביל דברים שהיו פעם אפשרויות ברירת מחדל.

יום שני, אוקטובר 18, 2010

תסריט עובד

תודה לאל על גיבויים ! לפני 15 חודשים פרסמתי תסריט קטן שהיה חלק ממודל שפותח (וכרגע בתהליכי שיחזור ) שפשוט השתמש בחלק מוסתר של HighLearn.

קרה מקרה והיום היתי צריך מייל של אחד הסטודנטים הפלא ופלא שנה וקצת והתסריט עדיין עובד - או שזה פיצשר חשוב או שלמישהוא לא אכפת מפרטיות של אנשים.

יום ראשון, יולי 05, 2009

שיעורי בית ברישיון חופשי

כחלק מהלימודים שלי לקחתי עשיתי קורס טסטינג (הידוע יותר בשם QA) , בחרתי לעשות חלק מהפרוייקט בפרל (את צד השרת) בגלל שזו אחת השפות שאני אוהב והיא נתנה לי מענה מספיק טוב למה שייתי צריך.
הפרוייקט מורכב משלושה חלקים :
בסיס נתונים mysql
ממשק xml-rpc הכתוב בפרל
ממשק gui הכתוב בשפה האסורה (דרישות הפרוייקט).

הפרוייקט משוחרר תחת שני רישיונות הקוד תחת רישיון MIT , והתיעוד תחת CC-BY-SA .

אחת הבעיות שהכי הפריעו לי זה חוסר באפליקציות שיתנו לי מענה אחיד לכתיבת התיעוד.
כלומר נכון שיש את rational של חברת IBM שהוא כלי יחסית טוב אבל אני רוצה את האפשרויות האלה בתוך פרוייקט קוד פתוח או לפחות התממשקות ל kdeveop

לאחר מעבר על הפרוייקט (הבלה בלה הידוע יותר כתיעוד ) נוכחתי לדעת כי הקושי הגדול ביותר זה העיצוב כך שישאר זהה בכמה שיותר סביבות.
עבדתי עם קבצי ODT ו pdf אבל בדיעבד אני יכול להגיד לאנשים שהולכים לכתוב SRS ומסמכי בדיקות כל יותר לעבוד עם בסיס נתונים (והנה צופר לעידו) לא טבלאי ובכך לנצל קשרים טוב יותר (את האובייקטים).
הלא חלק גדול מהחומר שנמצא במסמכי ה STP הינם הרחבה מהSRS והSTD הוא פשוט בדיקה עבור כל אחד מהסעיפים.
הרעיון הוא לשפוח את בסיס הנתונים לטבלאות ולא לערוך טבלה טבלה.

מקווה שזה יעזור למישהוא בעתיד.


נ.ב.
לא היה לי זמן לעשות חבילות התקנה (deb ו exe) בתקווה שאעשה זאת בקרוב.


יום חמישי, יולי 02, 2009

אלפון במערכת ה HighLearn

אתמול ישבתי וביצעתי מודריזציה לרשימת התפוצה של הנדסת תוכנה בסמי שמעון ואז שמתי לב שכמות האנשים שרשומים מאשדוד שואפת לאפס.
מכיוון שבמסודות הלימוד בארץ "דואגים" לפרטיות של הסטודנטים החלטתי להשתמש בפונקציות האלפון (Addressbook ) המובנה במערכת ה LowLearn להעביר על זה קצת פארסינג וליצור Vcard מתאימים החלטתי שאין לי צורך במספרי זהות וציונים (כי למה בכלל צריך את הנתונים הללו ) ואני מבצע פארסינג על דף אחד בלבד.

הסיבה פשוטה הספאמרים הגיעו גם אלינו , ואנו נאלצים לבצע מודוריזציה לאנשים וללודא שהאנשים הם באמת מי שהם.
הדרך לתסריט היתה קצרה רק שהתסריט עוד לא מוכן עד הסוף (צריך לשלב את נושא ה Vcard).

התסריט משתמש HTML::TokeParser בשביל הפארסניג ומה שנשאר הוא רק לבצע את ה Vcard ופה אני די ניכנסתי לבעייה כי משום מה כאשר אני מייצר אובייקט חדש אני מקבל שגיעה :
Can't locate object method "real" via package "work"
טוב אין כמו קצת גיגול על הבוקר לא ? :-)

דרך אגב מי שרוצה יכול לשלוף עוד מספר נתונים כמו ציונים ומספרי זהות (בדף הפרטי) עכשיו נשאלת השאלה מה יקרה בעוד מספר שנים ברגע שיהיה מאגר ביומטרי האם גם אז תוכנות שחלק גדול המדינה משתמשת בהם יאפשרו שליפה של הנתונים ?
אני הייתי בטוח שמספרי תעודת זהות זה משהוא פרטי אבל לך תידע.

באם יש צורך למצוא את כל הקורסים צריך להשתמש בדף PortalNewsFrames.asp שם בתוך ה span totalRecordsTR02 צריך לעבור על הקישורים ולשלוף את המתודה onclick וממנה את מספר הקורס לדוגמ

onclick="OpenLESkin('/Eclass/CourseFrames.asp?vcCourseGUID=&vcCourseID=50627&language=972',0)"

יתן את מספר הקורס 50627 לולאה פשוטה תיתן את כל מספרי הקורסים ותאפשר לעבד אותם.
הבעיה היא שלא כל הסטודנטים משתמשים בכתובת הדיפוליות של המכללה מהסיבה הפשוטה שהמוסד החליט להעביר את האחזקה לחברה חיצונית (וזה כבר מקום לפוסט אחר) נקווה שיש איזה שהוא מקום שאפשר להצליב את המידע.

יום שבת, אפריל 18, 2009

פיד RSS למערכות ראשים 2000

שיעמם לי קצת היום , אז כתבתי מכולל פיד RSS למערכת ה CRM שיש במוסד האקדמי שאני לומד בו.
לאחר שישבתי קצת חשבתי שחסר לי כמה אפשרויות נוספות (כמו למשל לבצע login בשביל לקבל עוד נתונים).
גיגול קצר (שלוש שעות) הצקה לכמה אנשים (שלומי , מני ודורון פ. ) ועוד סקריפט אחד מוכן (התחברות).
אחרי זה הבנתי שקצת חסרות לי עוד אפשרויות (נו אכשיו אני מרגיש כמו ילד בחנות שוקולדים) אז כתבתי תסריט למערכת השעות , ועוד אחד (שלא סיימתי אותו ) לייצור feed של שיעורי בית זה רישמי אני חסר חיים.

האמת כשאני חושב על זה עם מספיק תסריטים אני אוכל להרים מערכת שתוכל להתחרות ב LowLearn.

איך הגעתי לזה ? טוב ישראל העלה נקודה שאני לא מפרסם חלק מהסקריפטים וההאקים שנאלצתי לכתוב בשבילהיכולת להשתמש בחלק משרותי האקדמיה.

אני צריך לכתוב עוד כמה סקריפטים בסגנון (בשביל שיהיה אפשר להשתמש בכמה שיותר אפשרויות) אבל זו כבר התחלה טובה.
מעניין אם יהיה לי עודף זמן בקרוב שאוכל לשכתב לפחות חלק מהמערכת (grease monkey) למעשה כבר התחלתי (אני עוד מעט מסיים מכולל RSS לשיעורי הבית ) הבעיה שאין לי שרת לאכסן את כל הסקריפטים הללו שירוצו ממנו (מישהוא יכול לנדב ?).

החלק המעניין שככל שאני כותב יותר תסריטים אני מבין עד כמה המערכת לא מאובטחת ולא באמת כתובה כמו שצריך.
אני כבר לא מדבר על אבטחה אלה על קוד גרוע (קישורים שבורים , תגיות שבורות , חוסר ידע בסיסי בכתיבת HTML) כמו שאלכס אמר זו באמת נראת עבודה של תיכוניסט בחופש הגדול (אחרת אין לי צורה להסביר כל כך הרבה שגיעות בסיסיות).