සින්ඩියක් හදන්නේ කොහොමද කියන ප්රශ්ණය ගොඩක් අයට ඇති. සරළව කිව්වොත් මෙතන වෙන්නේ RSS හෙවත් ඔබගේ බ්ලොග් අඩවියේ තියෙන පෝෂක කියවන එක. සින්ඩිකට ඉල්ලුම් කරද්දි අපි RSS ලබා දෙන්නේ ඒ හින්දා. මතකද පහු ගිය ලිපිය
ගූගල් වල වෙබ් සයිට් හොස්ට් කිරිම, Java පාදක කරගෙන ලිව්ව ලිපිය. අතුරු කතාවත් කියලාම වැඩේ පටන් ගන්නම්කෝ, ගිය සතියේ සයිබර් යාලුවෝ ටික නුවර ගිය වෙලාවේ
පහන් කිව්වා Java වලට වඩා Python ලේසියි හා ඉක්මන් කියලා. ඒ වෙන කොටත් පයිතොන් ගැන මෙලේ හසරක් දැනං උන්නේ නැහැ. පස්සේ ගෙදර ඇවිත් තමයි මේ පයිතොන් වලින් සින්ඩියක් හදන වැඩේට අතගහලා බැලුවේ. ගුගල් දෙයියෝ හින්දා බය නැතුව වැඩේට බැස්සා.
සින්ඩියක් හදන්න කොච්චර ලේසිද කිව්වොත් මුලු සින්ඩියටම තියෙන්නේ ෆයිල් අටයි.
මුලින්ම දෙයියෝ ගාව තියන
Getting Started: Python ලිපියට ගිහිල්ලා රවුමක් දාලා එන්න. එකේ තියනවා වින්ඩෝවල කොහොමද පයිතොන්
ස්තාපිත කරගන්නේ කියලා.
මේකට ඔනේ
1.Python 2.5 - http://www.python.org/download/releases/2.5/
2.App Engine SDK -
http://code.google.com/appengine/downloads.html
3.Windows Launcher for Google App Engine -
http://code.google.com/p/google-appengine-wx-launcher/ -
හෝ
http://code.google.com/p/google-app-engine-launcher/downloads/detail?name=GoogleAppEngine%20GUI.exe&can=2&q=
[ගුගල් වලට අප්ලෝඩ් කරන විදිහ]
වින්ඩෝස් 7 සඳහා තමයි සියලුම දේවල් මම යොදාගත්තේ. ඔය දෙකම භාගත කරගත්තට පස්සේ ඔබේ පරිගණකයේ සමාන්ය ආකාරයට ස්තාපනය කරගන්න පුලුවන්.
ගුගල් හොස්ටිං වල වෙනම ඩෙටා බේස් කතාවක් නැහැ. කෝඩ් එකෙන්ම තමයි ඩේටා බෙස් ටේබල් ඔක්කොම පාලනය කරන්න පුලුවන්.
සින්ඩියට අවශ්ය අපි හදන ෆයිල්
1. RSS ඇතුලු කිරිමට ෆොම් එකක් - bloglist.py
2. සින්ඩි කේට් කිරිමට හෙවත් cron රන් කිරිමට - cronblogpost.py
3. ලිපි පෙන්විමට - synditest.py
ඔන්න ඔය ෆයිල් තුනෙන් තමයි මූලිකව ඕක වෙන්නේ, ඊට අමතරව තුන් වන පාර්ෂවයෙන් ඕනා වෙනවා
feedparser කියන RSS කියවන කෝඩ් එක.
හරි දැන් එකින් එක ෆයිල් බලමු
1.app.yaml මෙයා තමයි සියල්ල පාලන කරන්නේ
application: lankeeyasyndi මේ තියෙන්නේ ගුගල් එකේ අපේ ඇප්ලිකේෂන් අයිඩ් එක හෙවත් යූනික් නම
version: 1 මේක තියෙන්නේ කෝඩ් එක අප්ඩේට් කරද්දි වර්ෂන් වශයෙන් තියාගන්න
runtime: python
api_version: 1
handlers:
- url: /
script: synditest.py - [ මේ ෆයිල් එක තමයි මුල් පිටුවට එන්නේ ]
- url: /bloglist
script: bloglist.py - [ RSS ඇඩ් කරන්නේ මේ ෆොම් එකෙන්]
- url: /saveblog
script: bloglist.py - [ ඇක්ෂන් එකක් වන saveblog ආපුවම මේ ෆයිල් එක ලෝඩ් කරන්න ]
- url: /cronblogpost
script: cronblogpost.py - [ ලිපි සොයා මෙහෙයුම කරන cron ෆයිල් එක ]
- url: /.*
script: not_found.py - [ අනවහශ්ය URL ගැහැව්වොත් මේ පිටුවට යන්න ]
2. bloglist.py මෙයා ඉන්නේ RSS ෆෝම් එකට
import cgi
import datetime
import urllib
import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
ඔය ඉහතින් තියන එව්වා ඔනේ හරිද
"""Name - wapnisyndi """
"""Developer - WAP NISHANTHA SRI LANKA """
"""DATE - 2011-06-05 """
මං ගැනත් සඳහනක්
class Blogroll(db.Model): මේ තියෙන්නේ බ්ලොග් ලිස්ට් එකට අදලා ටේබල් එක
"""Models an individual Guestbook entry with an author, content, and date."""
burl = db.StringProperty(multiline=True)
brss = db.StringProperty(multiline=True)
bowner = db.StringProperty(multiline=True)
bstatus = db.StringProperty(multiline=True)
date = db.DateTimeProperty(auto_now_add=True)
def blogslist_key(blogslist_name=None):
"""Constructs a datastore key for a Guestbook entity with guestbook_name."""
return db.Key.from_path('Blogslist', blogslist_name or 'default_blogslist')
class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write('<html><body>')
blogslist_name=self.request.get('blogslist_name')
පහලින් තියෙන්නේ RSS ඉල්ලන FROM එක
# Write the submission form and the footer of the page
self.response.out.write("""
<form action="/saveblog" method="post">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>Your Email</td>
<td><input type="text" name="bowners" /></td>
</tr>
<tr>
<td>Blog URL</td>
<td><input type="text" name="burl" /></td>
</tr>
<tr>
<td>Blog Rss</td>
<td><input type="text" name="brss" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="send"></td>
</tr>
</table>
<div></div>
</form>
</body>
</html>""")
class Blogslist(webapp.RequestHandler):
def post(self):
blogslist_name = self.request.get('blogslist_name')
blogroll = Blogroll(parent=blogslist_key(blogslist_name))
blogroll.burl = self.request.get('burl')
blogroll.brss = self.request.get('brss')
blogroll.bowners = self.request.get('bowners')
blogroll.put()
self.redirect('/') - සයිට් එකට රිඩිරෙක්ට් කරලා දාන්න
application = webapp.WSGIApplication([
('/bloglist', MainPage), මෙතන ඉතා වැදගත් තැනක් - http://your.appspot.com/bloglist කියන url එකට මේ පිටුව ලෝඩ් කරන්න
('/saveblog', Blogslist) saveblog ඇක්ෂන් එකටත් මේ පිටුවම ලෝඩ් කරන්න
], debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
ඔය තියන අනික් එව්වාත් තියන්න එහෙම්ම ... මාත් තාම අලුත් නොවැ පයිතොන් වලට
3.cron.yaml මේයා ඉන්නේ අලුත් ලිපි හොයාගෙන යන වැඩේ ගුගුල් කාරයට දැනුම් දෙන්න
cron:
- description: hours summary job
url: /cronblogpost
schedule: every 1 hours - මේ කියන්නේ පැයකට සැරයක් කියලා
4.cronblogpost.py මෙන්න වැදගත් කෙනා ලිපි හොයන් එන්න කිව්වාම මෙයා තමයි වැඩේ ගොඩ දාලා දෙන්නේ
import cgi
import datetime
import urllib
import wsgiref.handlers
import feedparser
import sys
import re
from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
"""Name - wapnisyndi """
"""Developer - WAP NISHANTHA SRI LANKA """
"""DATE - 2011-06-05 """
පහලින් තියෙන්නේ RSS ලිස්ට් එක
class Blogroll(db.Model):
"""Models an individual Guestbook entry with an author, content, and date."""
burl = db.StringProperty(multiline=True)
brss = db.StringProperty(multiline=True)
bowner = db.StringProperty(multiline=True)
bstatus = db.IntegerProperty()
date = db.DateTimeProperty(auto_now_add=True)
def blogslist_key(blogslist_name=None):
"""Constructs a datastore key for a Guestbook entity with guestbook_name."""
return db.Key.from_path('Blogslist', blogslist_name or 'default_blogslist')
මේ තියෙන්නේ RSS වලට ගිහින් ලිපියකින් අපි ලබා ගන්න තොරතුරු තැන්පත් කරන ටේබල් එක
class Blogpost(db.Model):
"""Models an individual Guestbook entry with an author, content, and date."""
burl = db.StringProperty(multiline=True)
ptitle = db.TextProperty()
btitle = db.TextProperty()
purl = db.StringProperty()
bcontent = db.TextProperty()
bpatas = db.StringProperty(multiline=True)
brss = db.StringProperty(multiline=True)
bstatus = db.StringProperty(multiline=True)
pdate = db.DateTimeProperty()
def guestbook_key(guestbook_name=None):
"""Constructs a datastore key for a Guestbook entity with guestbook_name."""
return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook')
class MainPage(webapp.RequestHandler):
def get(self):
blogslist_name=self.request.get('blogslist_name')
blogrolls = db.GqlQuery("SELECT * "
"FROM Blogroll "
"WHERE ANCESTOR IS :1 "
"ORDER BY date DESC ",
blogslist_key(blogslist_name))
ඉහත sql එකෙන් කරන්නේ Blogroll කියන ටේබල් එකේ තියන සියලු RSS ලින්ක් ගන්න එක
for blogroll in blogrolls:
if 1 < 2 :
try:
fileCount = 0
d = feedparser.parse(blogroll.brss)
#print blogroll.brss
n = d.feed.title.encode('utf-8')
for entry in d['entries']:
#print entry.title.encode('utf-8')
guestbook_name = self.request.get('guestbook_name')
greeting = Blogpost(parent=guestbook_key(guestbook_name))
greeting.ptitle = unicode(entry.title.encode('utf-8'), 'utf-8')
greeting.burl = unicode(d.feed.link.encode('utf-8'), 'utf-8')
e = d.entries[fileCount]
pu = unicode(e.link.encode('utf-8'), 'utf-8')
#printme( pu )
print "test"
#print pu
greeting.purl = unicode(e.link.encode('utf-8'), 'utf-8')
#greeting.pdate = unicode(e.updated_parsed.encode('utf-8'), 'utf-8')
p = re.compile(r'<.*?>')
bcon = unicode(entry.description.encode('utf-8'), 'utf-8')
greeting.bcontent = p.sub('', bcon)
#greeting.bcontent = unicode(entry.description.encode('utf-8'), 'utf-8')
greeting.btitle = unicode(n, 'utf-8')
postdatetime = e.updated_parsed
#print postdatetime;
posted_datetime = datetime.datetime(
entry['updated_parsed'][0],
entry['updated_parsed'][1],
entry['updated_parsed'][2],
entry['updated_parsed'][3],
entry['updated_parsed'][4],
entry['updated_parsed'][5],
entry['updated_parsed'][6],)
greeting.pdate = posted_datetime
print "1"
guestbook_name=self.request.get('guestbook_name')
q = db.GqlQuery("SELECT * FROM Blogpost WHERE purl = :1", pu)
#q = Blogpost.all()
#q.filter("purl =", pu)
#q.order("-pdate")
results = q.fetch(1)
if results:
for p in results:
print "%s inches tall" % (p.purl)
else:
print "empty"
greeting.put();
print pu
fileCount += 1
print "
2"
except Exception:
pass
ඊට පස්සේ තියෙන්නේ ඔය උඩින් බ්ලොග් අඩවියක RSS කියවලා,
අලුත් ලිපි තියනවා නම් එවා Blogpost කියන ටේබල් එකට දාගන්න විදිහ.
මේ මමකරපු විදිහ. තව ලේසි ක්රම පහසු ක්රම තියෙන්න පුලුවන්.
එහෙම තියනවා නම් මාවත් දැනුවත් කරන්න ඇ
application = webapp.WSGIApplication([
('/cronblogpost', MainPage)
], debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
5.synditest.py මෙයා තමයි හොයන් ආපු ලිපි වෙන්වන කෙනා
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
"""Name - wapnisyndi """
"""Developer - WAP NISHANTHA SRI LANKA """
"""DATE - 2011-06-05 """
import os
from google.appengine.ext.webapp import template
ලිපි තියන ටේබල් එක
class Blogpost(db.Model):
"""Models an individual Guestbook entry with an author, content, and date."""
burl = db.StringProperty(multiline=True)
ptitle = db.TextProperty()
btitle = db.TextProperty()
purl = db.TextProperty()
bcontent = db.TextProperty()
bpatas = db.StringProperty(multiline=True)
brss = db.StringProperty(multiline=True)
bstatus = db.StringProperty(multiline=True)
pdate = db.DateTimeProperty()
def guestbook_key(guestbook_name=None):
"""Constructs a datastore key for a Guestbook entity with guestbook_name."""
return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook')
class MainPage(webapp.RequestHandler):
def get(self):
guestbook_name=self.request.get('guestbook_name')
q = db.GqlQuery("SELECT * FROM Blogpost ORDER BY pdate DESC LIMIT 100")
දිනෙන් පිළිවෙල කරලා ලිපි සීයක් ගැනිම
template_values = {
'greetings': q
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
මෙතන කරලා තියෙන්නේ වෙනම තියන HTML ෆයිල් එකකට ඩේටා යවන්න එක.
application = webapp.WSGIApplication([
('/', MainPage)
], debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
6. index.html මේක තියෙන්නේ ඉහත පහේ තියන එකට සපෝට් විදිහට තියන ටෙම්ප්ලෙට් එකක් විදිහට
<html>
<head>
<title>wapnisyndi</title>
<style>
</style>
</head>
<body>
{% for greeting in greetings %}
{% if greeting.burl %}
<a href="{{ greeting.purl }}" class="">{{ greeting.ptitle }}</a> | <a href="{{ greeting.burl }}" class="">{{ greeting.btitle }}</a> | {{ greeting.pdate }}
{% else %}
An anonymous person wrote:
{% endif %}
<div class="">{{ greeting.bcontent }} ... <a href="{{ greeting.purl }}" class="">වැඩිදුර >></a></div>
<hr />
<div>
{% endfor %}
</div>
</body>
</html>
7. not_found.py - මේ අනවශ්ය url එකක් ගැහැව්වොත් එන ෆයිල් එක
"""Name - wapnisyndi """
"""Developer - WAP NISHANTHA SRI LANKA """
"""DATE - 2011-06-05 """
print "not found"
8.feedparser.py මේක තුන් වන පාර්ෂවිය ලයිබ්ර්රි එකක්
මෙතනින් ගන්න ඒක
හරි ඔච්චර තමයි. මේක තව ටිකක් වැඩි දියුණු කරගන්න. සම්පූර්ණ කෝඩ් එක
මෙතනින් භාගන්න. මේ කෝඩ් එක භාවිතයෙන් හදපු සින්ඩියක්
මෙන්න
ඉහත කෝඩ් වලම සිංහලෙන් ලිව්වේ පැහැදිලි වෙන්න. නමුත් සම්පූර්ණ
කෝඩ් එක භාගත්තාම එහෙම පැහැදිලි කිරිම් නැහැ. ඔබත් ඔබටම කියා සින්ඩියක් හදාගන්න.
ටෙක්නිකල් දේවල් එපා නම් මේ පහත ලිපි බලන්න
1.
ත්රිපිඨකය තුල සිංහලෙන් , ඉංග්රීසියෙන් සහ පාලියෙන් සෙවීම් සිදුකල හැකි පරිගණක මෘදුකාංගයක්
2.
තරු මෙච්චර ආතල් ද????
3.
නුඹ රහසින් ඇවිත්......
4.
සිංහල බ්ලොග් වලට පුංචි තල්ලුවක්...මං කියවන බ්ලොග්...
5.
ඔබ දන්නවද ලංකාවේ තියන කෝච්චි මොනවද කියලා
6.
ආදරබර Network එක හෙවත් ගල් කොරියේ ලවු එක .