早上用了大概兩個小時搞這個,這是用來抓書的,除了抓以外,還直接把 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
安裝:
- 安裝Python,我用 2.5。
- 安裝EasyInstall,這是類似 Perl CPAN、Ruby Gems的工具。等等會利用這個來安裝 PyOpenGL。
- 打開命令提示字元,切換到 c:\python25\scripts,執行 easy_install pyopengl。
- 最後,你還需要 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 urllib 擷取網頁
就是用 urllib 來作。
下面的程式有點笨,應該可以寫的更好。
import urllib page=urllib.urlopen("http://www.google.com.tw") while 1: line=page.readline() if line: print line else: break
參考資料:
用 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 )