Python 練習 – 抓書

早上用了大概兩個小時搞這個,這是用來抓的,除了抓以外,還直接把 script 、廣告…等都清掉,只留下書的內容。用法很簡單,執行這個 script,參數帶上那本書的網址就行了。
程式碼怎麼排都不行,所以丟到這裡了。

Python 練習 – 將 Bing 的每日桌面圖像變成 GNOME 桌面

上星期看到這篇:如何将Bing的每日桌面图像变成我的Windows 7桌面,就順手試試看改用 Python 來作,執行這個 script 以後,會自動拿 bing 的圖片來作為你 GNOME 的桌面背景圖片。
目前只有一個小問題,就是 xml.dom.minidom 有時候會因為 & 的關係導致解析失敗。

#!/usr/bin/env python
import random
import os.path
import subprocess
import urllib2
import xml.dom.minidom
from xml.dom.minidom import Node
def get_xml():
response = urllib2.urlopen('http://feeds.feedburner.com/bingimages')
xml = response.read()
return xml
def parse_and_get_first_image_uri( xml_str ):
if xml_str=="":
return ""
doc=xml.dom.minidom.parseString( xml_str )
urls=[]
for node in doc.getElementsByTagName("enclosure"):
urls.append( node.getAttribute("url") )
index=random.randint( 0, len(urls)-1 )
if len(urls)>0:
return urls[ index ]
else:
return ""
def get_uri( uri, output ):
response = urllib2.urlopen( uri )
image_file=open( output, 'w' )
image_file.write( response.read() )
image_file.close()
return
def set_wallpaper( filename ):
args=[]
args.append( 'gconftool-2' )
args.append( '/desktop/gnome/background/picture_filename' )
args.append( '--set' )
args.append( filename )
args.append( '--type=string' )
subprocess.call( args )
uri=parse_and_get_first_image_uri( get_xml() )
tmp_dir = os.path.join( *(os.path.expanduser("~"), "tmp") )
if uri!="":
if not os.path.exists( tmp_dir ):
os.mkdir( tmp_dir )
filename, extname = os.path.splitext( os.path.basename( uri ) )
image_filename=os.path.join( *( tmp_dir, "bing" + extname ) )
get_uri( uri, image_filename )
set_wallpaper( image_filename )
else:
print "get nothing."

python twisted sendmail

buildbot 是用 twisted library 裡的 sendmail 寄信的,方法如下:

from email.Message import Message
from twisted.mail.smtp import sendmail
from twisted.internet import defer
from twisted.internet import reactor
m = Message()
m.set_payload("Hello world!!")
m['To']="someone@somewhere.com"
m['Subject'] = "Test"
m['From'] = "my@somewhere.com"
s = m.as_string()
done = sendmail( "mailserver", "my@somewhere.com", [ "someone@somewhere.com" ], s)
done.addCallback(lambda ignored: reactor.stop())
reactor.run()

但現在大多的 mail server 都需要先認證,這時候就得改用 ESMTPSenderFactory 來改寫了(可參考Twisted mail smtp API),mailing list 裡正好有人貼出程式

from twisted.mail import smtp
from twisted.internet import reactor
from twisted.internet import defer
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
def sendmail_auth(smtphost, user, password,
from_addr, to_addrs, msg, senderDomainName=None, port=25):
if not hasattr(msg,'read'):
msg = StringIO(str(msg))
d = defer.Deferred()
factory = smtp.ESMTPSenderFactory(user, password, from_addr, to_addrs, msg, d,
requireTransportSecurity=False)
if senderDomainName is not None:
factory.domain = senderDomainName
reactor.connectTCP(smtphost, port, factory)
return d

再套前面的例子,只要改動 sendmail 為 sendmail_auth 就行了:程式

done = sendmail_auth( "mailserver", "your_username", "your_password", "my@somewhere.com", [ "someone@somewhere.com" ], s)

python + opengl = pyopengl

安裝:

  1. 安裝Python,我用 2.5。
  2. 安裝EasyInstall,這是類似 Perl CPANRuby Gems的工具。等等會利用這個來安裝 PyOpenGL
  3. 打開命令提示字元,切換到 c:\python25\scripts,執行 easy_install pyopengl。
  4. 最後,你還需要 GLUT:Nate Robins – OpenGL- GLUT for Win32,下載以後,丟到 c:\windows\system32 即可。

都好了以後,你就可以試試看下面這個小程式了:

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def display():
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glPushMatrix()
#glTranslatef(0.,1.,-1.) #move to where we want to put object
glBegin( GL_TRIANGLES )
glColor3f( 1., 0., 0. )
glVertex2d( -1., 0. )
glColor3f( 0., 1., 0. )
glVertex2d( 1.,0. )
glColor3f( 0., 0., 1. )
glVertex2d( 0., 1. )
glEnd()
glPopMatrix()
glutSwapBuffers()
return
glutInit( sys.argv )
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |GLUT_DEPTH)
glutInitWindowSize(400,400)
glutCreateWindow("Hello, World")
glClearColor(0.,0.,0.,1.)
glutDisplayFunc(display)
glutMainLoop()

想試試的原因,最主要是想說,Python 可以比較方便地進行測試與練習,接觸以後,發現代碼也很容易轉換為 C/C++,就這樣。
參考資料:

用 Python smtplib 寄信出現認證失敗

如果你使用 Python smtplib.py 寄信時,遇到認證錯誤訊息(Authentication error),不妨試試改變一下認證的順序,請在 smtplib.py 裡面找

        # List of authentication methods we support: from preferred to
# less preferred methods. Except for the purpose of testing the weaker
# ones, we prefer stronger methods like CRAM-MD5:
preferred_auths = [AUTH_CRAM_MD5, AUTH_PLAIN, AUTH_LOGIN]

然後修改一下順序,

        preferred_auths = [AUTH_LOGIN, AUTH_CRAM_MD5, AUTH_PLAIN]

或許就能迎刃而解。

用 python 來複製 n 個相同的檔案

為了要將某個檔案複製出 500 份,寫了一個簡短的 python script。
很簡單,卻花了我不少時間查可用的 function。
range() 的行為跟我預期的有些不一樣,range(2,500)實際上是 2~499,並不會真正到 500。
所以 2~500 必須寫成 range(2,501) 才行。

import os
import shutil
n=501
for i in range(2,n):
filename='%04d.mp3' % i
shutil.copyfile( '0001.mp3', filename )