2010-10-15 160 views
1

我有一個網站,其中i want to put a custom made captcha,由於佈局的需要,不能使用在線驗證碼服務。它運行在谷歌appengine上。 Appengine API是否有在給定圖像上寫字符的東西?驗證碼與谷歌AppEngine

我經歷了appengine Python Image API,但它似乎沒有太大的幫助。

任何建議如何在谷歌appengine基礎設施上生成驗證碼?

回答

2

一般來說,你不能。

Image API旨在轉換現有圖像,而不是生成新圖像。

理論上,如果您發現一個純粹的Python圖像創建庫,它將在App Engine上運行,但速度會很慢。

爲什麼不只是利用外部CAPTCHA服務?

+0

你知道任何提供顏色和佈局選項的驗證碼服務嗎?我想ReCaptcha沒有。 – 2010-10-15 14:23:27

+0

我在網上看到了自定義的reCaptcha ... – 2010-10-18 12:50:48

+0

由於性能方面的原因,Python/GAE不是生成位圖等的理想語言,所以爲此找到一個庫很困難。也許你可以使用CSS,HTML5 canvas或SVG製作驗證碼? – pthulin 2010-10-19 17:49:03

8

A quick google search將爲您提供大量的指導,用於將您的AppEngine應用程序與captch服務集成在一起。使用reCaptcha的Here's one

+0

我要生成對我自己在AppEngine上本身'定製captcha',我知道的reCAPTCHA和使用它很多次,但這次我不得不限制圖像的大小+海關顏色。所以我不能依靠任何服務.. – 2010-10-15 14:17:45

+0

有沒有什麼好的答案,你想要做什麼。正如@Drew指出的那樣,你僅限於純Python,並且執行工作來創建一個有意義難以解決的驗證碼需要花費很多時間,這就是AppEngine的反使用案例。 – 2010-10-15 14:21:17

+0

謝謝..我需要嘗試這樣一個Python模塊,而不是..我知道這將需要時間,但我的客戶需要它..你知道任何這樣的模塊..替代PHP GD GD庫。 – 2010-10-15 15:04:03

1

而不是創建自己的impl。我建議使用像reCaptcha這樣的可靠服務: http://www.google.com/recaptcha

+0

我需要它的美學目的。可以依靠任何服務。 – 2010-10-15 14:18:32

+0

您對_captcha_有美學限制嗎?咦? – 2010-10-15 14:43:10

+0

@Nick:該網站是雙色網站..不能阻止外觀。 :) – 2010-10-16 09:21:12

1

我建議使用像reCaptcha這樣的第三方服務,但如果您確實需要提供自己的實現,則可以使用最近推出的用於GAE + Python的Matplotlib來生成自己的圖像。

Matplotlib是Python的繪圖庫,最近在2012年12月作爲GAE的一部分引入。您可以使用Matplotlib來呈現文本,如this example中所示。如果您對驗證碼有美學限制,則可以使用Matplotlib渲染非常花哨的文本和數字。看看this example

0

您可以使用以下代碼來創建驗證碼,請注意您必須在您的類路徑中添加commons-lang-2.5.jar。

 String secutiryCode = RandomStringUtils.random(5, new char[]{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9'}); 
     req.getSession().setAttribute("secutiryCode", secutiryCode); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     URL url = new URL("http://util.krispot.com/util/SecurityImage.jpg?secutiryCode=" + secutiryCode); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setDoInput(true); 
      BufferedInputStream bis = new BufferedInputStream(connection.getInputStream()); 
      for(int i = bis.read(); i > -1;i = bis.read()) { 
       baos.write(i); 
      } 
     BufferedOutputStream bos = new BufferedOutputStream(resp.getOutputStream()); 
     bos.write(baos.toByteArray()); 
     bos.close(); 

謝謝 納瓦迪普辛格