全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

IP归属甄别会员请立即修改密码
123
返回列表 发新帖
楼主: shy9000
打印 上一主题 下一主题

[原创]论坛头像自动换原理

[复制链接]
21#
发表于 2010-8-7 02:14:39 | 只看该作者
如果需要绕过检查,更好的方法是用rewrite嘛
22#
 楼主| 发表于 2010-8-7 02:44:00 | 只看该作者
原帖由 smdcn 于 2010-8-7 02:14 发表
如果需要绕过检查,更好的方法是用rewrite嘛

说的也是,呵呵
23#
发表于 2010-8-7 03:16:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
24#
发表于 2010-8-7 03:27:27 | 只看该作者
这种帖子还是发网站建设区吧
实在的方法很多
去年的帖子: http://www.discuz.net/forum.php?mod=viewthread&tid=1256811
25#
 楼主| 发表于 2010-8-7 03:39:26 | 只看该作者
原帖由 Linode 于 2010-8-7 01:05 发表
我的打不开空白

函数打错了,应该是mt_rand...少了中间一下划
26#
 楼主| 发表于 2010-8-7 03:41:03 | 只看该作者
原帖由 咯拉无米 于 2010-8-7 03:27 发表
这种帖子还是发网站建设区吧
实在的方法很多
去年的帖子: http://www.discuz.net/forum.php?mod=viewthread&tid=1256811

擦汗,你的代码压缩的够简洁,呵呵.
27#
发表于 2010-8-7 08:48:27 | 只看该作者
GAE=不浪费你的主机流量+全球<200ms的延迟+99.99%uptime头像从不503
  1. import wsgiref.handlers
  2. import random
  3. from google.appengine.api import users
  4. from google.appengine.ext import webapp
  5. from google.appengine.ext import db
  6. from google.appengine.api import urlfetch
  7. from google.appengine.api import images
  8. from google.appengine.api import memcache

  9. class Avatar(db.Model):
  10.     url_mime = db.StringProperty(required=True) # mime if avatar, or url
  11.     avatar = db.BlobProperty()

  12. def flushcache():
  13.     return memcache.Client().delete('avatars')

  14. def getcachedlist():
  15.     alist = memcache.Client().get('avatars')
  16.     if alist:
  17.         return alist
  18.     else:
  19.         alist = []
  20.         q = Avatar.all();
  21.         for avatar in q:
  22.             alist.append(str(avatar.key()))
  23.         return alist

  24. def checkauth(handler):
  25.     user = users.get_current_user()
  26.     if not (user and users.is_current_user_admin()):
  27.         handler.redirect(users.create_login_url(handler.request.uri))

  28. def sendmsg(handler, msg, dest=None):
  29.     handler.response.clear()
  30.     handler.response.headers['Content-Type'] = 'text/html'
  31.     if 'Referer' in handler.request.headers:
  32.         dest = handler.request.headers['Referer']
  33.     if dest:
  34.         handler.response.out.write("""
  35.             <html>
  36.             <head><title>Message</title></head>
  37.             <body>
  38.             <script language="JavaScript">
  39.             alert("%s");
  40.             window.location="%s";
  41.             </script>
  42.             %s

  43.             go to <a href="%s">%s</a>
  44.             </body>
  45.             </html>
  46.         """ % (msg, dest, msg, dest, dest))
  47.     else:
  48.         handler.response.out.write("""
  49.             <html>
  50.             <head><title>Message</title></head>
  51.             <body>
  52.             <script language="JavaScript">
  53.             alert("%s");
  54.             history.back();
  55.             </script>
  56.             %s

  57.             go back now
  58.             </body>
  59.             </html>
  60.         """ % (msg, msg))

  61. def sendavatar(handler, url_mime=None, avatar=None):
  62.     handler.response.clear()
  63.     handler.response.headers['Expires'] = 'Thu, 01 Dec 1994 16:00:00 GMT'
  64.     if url_mime:
  65.         if avatar:
  66.             handler.response.headers['Content-Type'] = 'image/png'
  67.             handler.response.out.write(avatar)
  68.         else:
  69.             handler.redirect(url_mime)
  70.     else:
  71.         handler.response.headers['Content-Type'] = 'text/plain'
  72.         handler.response.out.write('no avatar')

  73. def resizeandsaveavatar(handler, url_mime, avatar=None):
  74.     if avatar:
  75.         r = int(handler.request.get('r'))
  76.         w = int(handler.request.get('w'))
  77.         h = int(handler.request.get('h'))
  78.         if w == 0 and h == 0 and r == 0 and url_mime \
  79.             and handler.request.get('hflip') != 'yes' \
  80.             and handler.request.get('vflip') != 'yes' \
  81.             and handler.request.get('lucky') != 'yes': # no op
  82.                 avataro = Avatar(url_mime=url_mime, avatar=db.Blob(avatar))
  83.         else:        
  84.             imageo = images.Image(avatar)
  85.             if w or h:
  86.                 imageo.resize(w, h)
  87.             imageo.rotate(r)
  88.             if handler.request.get('hflip') == 'yes':
  89.                 imageo.horizontal_flip()
  90.             if handler.request.get('vflip') == 'yes':
  91.                 imageo.vertical_flip()
  92.             if handler.request.get('lucky') == 'yes':
  93.                 imageo.im_feeling_lucky()
  94.             avataro = Avatar(url_mime='image/png', avatar=db.Blob(imageo.execute_transforms()))
  95.     else:
  96.         avataro = Avatar(url_mime=url_mime)
  97.     avataro.put()
  98.     flushcache()

  99. class addavatar(webapp.RequestHandler):
  100.     def get(self):
  101.         checkauth(self)
  102.         self.response.headers['Content-Type'] = 'text/html'
  103.         self.response.out.write("""
  104.             <html>
  105.             <head><title>Add Avatar</title></head>
  106.             <body>
  107.             <form method="post" enctype="multipart/form-data">
  108.             URL/MIME: <input type="text" name="url_mime" value=""/>

  109.             (if you don't want us to convert, please tell us MIME)

  110.             <label><input type="checkbox" name="fetch" value="yes" checked="checked"> Fetch it</label>

  111.             Avatar: <input type="file" name="avatar"/>

  112.             Image Operation:

  113.             (CMYK images can't be transformed)

  114.             Resize to: <input type="text" size="5" name="w" value="0"> x <input type="text" size="5" name="h" value="0">

  115.             (width x height, 0 x 0 means not resizing)

  116.             Rotate clockwise: <input type="text" size="5" name="r" value="0"> deg.

  117.             <label><input type="checkbox" name="hflip" value="yes"> Flip horizontally</label>

  118.             <label><input type="checkbox" name="vflip" value="yes"> Flip vertically</label>

  119.             <label><input type="checkbox" name="lucky" value="yes"> I'm Feeling Lucky</label>

  120.             <input type="submit" value="Add"/>

  121.             </form>
  122.             <a href="/listavatar">Avatar List</a>
  123.             </body>
  124.             </html>
  125.         """)
  126.      
复制代码

[ 本帖最后由 lyylts 于 2010-8-7 08:50 编辑 ]
28#
发表于 2010-8-7 08:48:51 | 只看该作者
接上文
  1.     def post(self):
  2.         checkauth(self)
  3.         url_mime = self.request.get('url_mime')
  4.         avatar = self.request.get('avatar')
  5.         if url_mime or avatar:
  6.             if avatar:
  7.                 try:
  8.                     resizeandsaveavatar(self, url_mime, avatar)   
  9.                     sendmsg(self, 'added')
  10.                 except Exception, ex:
  11.                     sendmsg(self, "failed to transform and/or save: %s" % ex)
  12.             else:
  13.                 if self.request.get('fetch') == 'yes':
  14.                     try:
  15.                         fc = urlfetch.fetch(url_mime)
  16.                         if fc.status_code == 200:
  17.                             if 'Content-Type' in fc.headers:
  18.                                 url_mime = fc.headers['Content-Type']
  19.                             else:
  20.                                 url_mime = None
  21.                             avatar = fc.content
  22.                             try:
  23.                                 resizeandsaveavatar(self, url_mime, avatar)   
  24.                                 sendmsg(self, 'added')
  25.                             except Exception, ex:
  26.                                 sendmsg(self, "failed to transform and/or save: %s" % ex)
  27.                         else:
  28.                             sendmsg(self, 'cannot fetch avatar: http status ' + str(fc.status_code))
  29.                     except Exception, ex:
  30.                         sendmsg(self, 'cannot fetch avatar: %s' % ex)
  31.                 else:
  32.                     try:
  33.                         resizeandsaveavatar(self, url_mime)
  34.                         sendmsg(self, 'added')
  35.                     except Exception, ex:
  36.                         sendmsg(self, "failed to transform and/or save: %s" % ex)
  37.         else:
  38.             sendmsg(self, 'fill in the form!')

  39. def sendavatarbykey(handler, key):
  40.     avatar = db.get(key)
  41.     if avatar:
  42.         sendavatar(handler, avatar.url_mime, avatar.avatar)
  43.     else:
  44.         sendavatar(handler)

  45. class showspecavatar(webapp.RequestHandler):
  46.     def get(self, key):
  47.         sendavatarbykey(self, key)

  48. class showavatar(webapp.RequestHandler):
  49.     def get(self, ext):
  50.         alist = getcachedlist()
  51.         key = random.choice(alist)
  52.         sendavatarbykey(self, key)

  53. class flushavatarcache(webapp.RequestHandler):
  54.     def get(self):
  55.         checkauth(self)
  56.         self.response.headers['Content-Type'] = 'text/plain'
  57.         self.response.out.write(str(flushcache()))
  58.         self.response.out.write("""
  59.         The return value is 0 (DELETE_NETWORK_FAILURE) on network failure,
  60.         1 (DELETE_ITEM_MISSING) if the server tried to delete the item but didn't have it,
  61.         and 2 (DELETE_SUCCESSFUL) if the item was actually deleted.
  62.         This can be used as a boolean value, where a network failure is the only bad condition.""")

  63. class delavatar(webapp.RequestHandler):
  64.     def get(self, key):
  65.         checkauth(self)
  66.         avatar = db.get(key)
  67.         if avatar:
  68.             avatar.delete()
  69.             flushcache()
  70.             sendmsg(self, 'avatar %s is deleted' % key)
  71.         else:
  72.             sendmsg(self, 'nothing to delete')

  73. class listavatar(webapp.RequestHandler):
  74.     def get(self, sizelimit=None):
  75.         if sizelimit:
  76.             trstr = """
  77.                 <tr><td><a href="/delavatar/%%s">Delete</a></td><td><img width="%s" height="%s" src="/avatar/%%s"/></td><td>%%s</td></td><td>%%s</td></tr>
  78.             """ % (sizelimit, sizelimit)
  79.         else:
  80.             trstr = """
  81.                 <tr><td><a href="/delavatar/%s">Delete</a></td><td><img src="/avatar/%s"/></td><td>%s</td><td>%s</td></tr>
  82.             """
  83.         q = Avatar.all()
  84.         self.response.headers['Content-Type'] = 'text/html'
  85.         self.response.out.write("""
  86.             <html>
  87.             <head><title>List of Avatars (%d in total)</title></head>
  88.             <body>
  89.             <a href="/addavatar">Add Avatar</a> | <a href="/flushavatarcache" target="_blank">Flush Cache</a> | Size: <input type="text" size="4" id="limit">
  90.             <input type="button" value="go" onclick="window.location='/listavatar/'+document.getElementById('limit').value"/>
  91.             

  92.             <table border="1"><tr><td>Action</td><td>Avatar</td><td>URL/MIME</td><td>Key</td></tr>
  93.         """ % q.count())
  94.         for avatar in q:
  95.             key = str(avatar.key())
  96.             self.response.out.write(trstr % (key, key, ('MIME:' if avatar.avatar else 'URL:') + str(avatar.url_mime), key))
  97.         self.response.out.write("""
  98.             </table>
  99.             </body>
  100.             </html>
  101.         """)

  102. def main():
  103.     application = webapp.WSGIApplication([
  104.         ('/addavatar', addavatar),
  105.         ('/avatar(\..*)?', showavatar),
  106.         ('/avatar/(.+)', showspecavatar),
  107.         ('/delavatar/(.+)', delavatar),
  108.         ('/listavatar', listavatar),
  109.         ('/listavatar/(.*)', listavatar),
  110.         ('/flushavatarcache', flushavatarcache)
  111.         ])
  112.     wsgiref.handlers.CGIHandler().run(application)

  113. if __name__ == "__main__":
  114.     main()
复制代码
以上为转载,但代码我也不知道那里找来的了

[ 本帖最后由 lyylts 于 2010-8-7 08:51 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2026-1-14 21:28 , Processed in 0.059533 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表